Python pytest测试框架详解

pytest介绍:
pytest是一个非常成熟的全功能的Python测试框架:
1.简单灵活,容易上手
2.支持参数化
3.测试用例的skip和xfail,自动失败重试等处理
4.能够支持简单的单元测试和复杂的功能测试,还可以用来做selenium/appnium等自动化测试、接口自动化测试(pytest+request)
5.pytest具有很多第三方插件,并且可以自定义扩展,比较好用的如pytest- allure(完美html测试报告生成)、pytest-xdist(多CPU分发)等
6.可以很好的和jenkins集成

安装pytest:pip install -U pytest 其中-U是对pytest进行更新 pytest – version:查看版本号
测试用例的识别与运行:
识别:
测试文件:
1.test_.py
2.
test.py
用例识别:
1.Test*类包含的所有test
*的方法(测试类不能有__init__方法)
2.不在class中的所有test_*方法
pytest也可以执行unittest框架写的用例和方法
运行:
pytest -v :可以运行出详细的日志信息
pytest -s :可以打印出测试用例用print的内容
pytest 文件名.py::类名 :运行某个模块里面的类
pytest 文件名.py::类名::方法名 :运行某个模块里面的某个类的方法
pytest -v -k"类名 and not 方法名":跳过运行某个用例
pytest -m[标记名]:@pytest.mark.[标记名]将运行有这个标记的测试用例
pytest -x 文件名:一旦运行到报错就停止运行
pytest --maxfail=[num]:当运行错误达到num的时候就停止运行

pytest执行-失败重新运行:
场景:测试失败后要重新运行n次,要在重新运行之间添加延迟时间,间隔n秒在运行
安装:pip install pytest-rerunfailures
执行:
1.pytest – reruns 3 -v -s test_class.py(设置重新运行n次)
2.pytest -v – reruns 5 --reruns-delay 1(设置延迟时间)
pytest执行-多条断言有失败也都运行
场景:一个方法中写多条断言,通常第一条过不去,下面就不执行了,我们想报错也都执行一下
安装:pip install pytest-assume
执行:
1.pytest.assume(1==4)

2.pytest.assume(2==4)

pytest框架结构
import pytest 类似的setup,teardown同样更灵活
1.模块级(setup_module/teardown_module)模块始末,全局的(优先最高)
2.函数级(setup_function/teardown_function)只对函数用例生效(不在类中)
3.类级(setup_class/teardown_class)只在类中前后运行一次(在类中)
4.方法级(setup_method/teardown_method)开始于方法始末(在类中)
5.类里面(setup/teardown)运行在调用方法的前后

pytest-fixtrue的用法
场景:
1.用例1需要先登录
2.用例2不需要登录
3.用例3需要登录
这种场景无法用setup和teardown实现
用法:在方法前面加@pytest.fixture()
场景:测试用例执行时,有的用例需要登陆才能执行,有些用例不需要登陆,setup和teardown无法满足。fixture可以,默认scope(范围)function
步骤:
1.导入pytest
2.在登录的函数前面加@pytest.fixture()
3.在要使用的测试方法中传入(登陆函数名称),就先登录
4.不传入的就不登录直接执行测试方法
前端自动化中应用-conftest
场景:你与其他测试工程师合作一起开发时,公共模块要在不同文件下,要在大家都能访问到的地方
解决:conftest.py这个文件进行数据共享,并且他可以放在不同位置起着不同范围共享的作用
执行:系统执行到参数login时先从本文件中查找是否又这个名字的变量,之后在conftest.py中找是否有
步骤:将登陆模块带@pytest.fixture()写在conftest.py中
conftest.py配置需要注意:
1.conftest文件名是不能换的
2.conftest.py与运行的用例要在同一个package下,并且有__init__文件
3.不需要import导入conftest.py文件,pytest用例会自动查找
4.全局的配置和前期工作都可以写在这里,放在某个包下,就是这个包共享的地方
前端自动化中应用-yieid
场景:你已经可以将测试方法前要执行或依赖的解决了,测试方法后销毁清楚数据的要如何进行呢?范围是模块级别的。类似setupClass
解决:通过在同一模块中加入yieid关键字,yield是调用第一次返回结果,第二次执行它下面的语句返回
步骤:在@pytest.fixture(scope=module)
在登录的方法中加yieid,之后加销毁清楚的步骤,注意,这种方式没有返回值,如果希望返回使用addfinalizer
fixture的自动应用
场景:不想原测试方法有任何改动,或全部都自动实现自动应用,没特例,也都不需要返回值时可以选择自动应用
解决:使用fixture中参数autouse=True实现
步骤:
1.在方法上面加@pytest.fixture(autouse=True)
2.在测试方法上面加@pytest.mark.usefixtures(“start”)
autouse:可以把方法用到每一条测试用例中
fixture带参数传递
场景:测试离不开数据,为了数据灵活,一般数据都是通过参数传的
解决:fixture通过固定参数request传递
步骤:在fixture中增加@pytest.fixture(params=[1,2,3,‘linda’])在方法参数中写request

@pytest.mark.skip(‘不执行此条case’):放在方法上面可以不执行此条用例
@pytest.mark.skipif(sys.platform==‘darwin’,reason=‘不在macOS执行’):通过判断当前系统 给出不执行此条用例的原因

import pytest

# 方法名作为参数
test_user_data = ['jerry','Tome']
@pytest.fixture(scope='module')
def login_r(request):
#     这是接受并传入的参数
    user = request.param
    print(f"\n 打开首页准备登陆 登陆用户{user}")
    return user
@pytest.mark.skip('不执行此条测试用例')
# indirect=True,可以把传过来的参数当作函数执行
@pytest.mark.parametrize("login_r",test_user_data,indirect=True)
def test_case01(login_r):
    a = login_r
    print(f"测试用例中login的返回值是:{a}")
    assert a != ''

if __name__ == '__main__':
    pytest.main()

skip使用场景
1.调试时不想运行这个测试用例
2.标记无法在某些平台上运行的测试功能
3.在某些版本中执行,其他版本中跳过
4.当前的外部资源不可用时跳过(如果测试数据是从数据库中取到的,连接数据库的功能如果返回结果未成功就跳过,因为执行也都报错)
解决:
@pytest.mark.skip():跳过这个测试用例,可以加条件skipIf,在满足某些条件下才希望通过,否则跳过这个测试
Xfail场景
1.功能测试尚未实施或尚未修复的错误,当测试通过时尽管预计会失败(标记为pytest.mark.xfail),他是一个xpass将在测试摘要中报告
2.你希望测试由于某种情况而就应该失败
解决:
@pytest.mark.xfail
使用自定义标记mark只执行某部分用例
场景:
1.只执行符合要求的某一部分用例,可以把一个web项目划分为多个模块,然后指定模块名称执行
2.App自动化时,如果想Android和IOS公用一套代码时,也可以使用标记功能,表明哪些是IOS的用例,哪些是Android的运行时知道mark名称运行就可以
解决:在测试用例方法上添加@pytest.mark.webtest
执行:
1.-s参数:输出所用测试用例的print信息
2.-m:执行自定义标记的相关用例(使用命令执行)
pytest -s test.py -m=search
pytest -s test.py -m apptest
pytest -s test.py -m ‘not ios’
多线程并行与分布式执行
场景:测试用例1000条,一个测试用例执行一分钟,一个测试人员执行需要1000分钟,通常会用人力成本换取时间成本,加几个让人一起执行,时间就会缩短,如果10个人一起执行只需要1000分钟,这就是一种并行测试,分布式场景。
解决:pytest分布式执行插件:pytest-xdist,多个cpu或主机执行 前提:用例之间都是独立的,没有先后顺序,随机都能执行,可重复执行不影响其他用例。
安装:pip install pytest-xdist
多个CPU并行执行用例,直接-n 3是并行数量:pytest test.py -n 3
在多个终端下一起执行
pytest-html生成测试报告
安装:pip install pytest-httml
生成测试报告:pytest -v -s --html=report.html --self-contained-html

你可能感兴趣的:(python基础,python)