pytest
一、介绍
pytest是基于python的测试框架。特色:
- 按照约定自动收集用例
- 作用于测试对象的多种标记功能
- 自定义fixture
- 多种执行方式
- 可视化测试报告
- 控制台打印执行记录
两个文件,conftest.py 和 pytest.ini
- conftest.py文件,conftest.py中定义的fixture,不用导入测试模块,可以直接在测试模块中以str或函数方法参数使用
- pytest.ini文件,pytest执行方案配置。常用:addopts,markers,python_function等。
二、自动收集用例
1.依据
- 目录:默认为执行命令所在目录,可指定
- 关键字:默认为全部,可指定
- mark:默认为全部,可指定
2.命名约定
测试模块名test_*.py,测试类名class Test*,测试函数名def test_*(),测试方法名def test_*(self)
3.自定义规则
- 指定目录:pytest /dir
- 指定文件:pytest /dir/test_case.py
- 指定类:pytest /dir/test_case.py::TestCase
- 指定方法:pytest /dir/test_case.py::TestCase::test_case
- 指定函数:pytest /dir/test_case.py::test_case
- 指定关键字:pytest -k "<express>"
- 指定mark:pytest -m "<express>"
二、mark
1.mark.usefixture
为测试对象指定一个fixture,这是调用自定义fixture的一种方式。
scope参数限定作用对象的等级。默认为函数方法级。可指定
2.mark.parametrize
为测试函数方法对象执行parametrize可以实现参数化
第一个参数为字符串,定义测试用例中引用参数的名称;
第二个参数为列表嵌套元组,元组内的数据顺序和第一个参数顺序同步;
ids参数为列表,定义用例名称,顺序和第二个参数元组的顺序同步。
3.其它
xfail,skip,自定义mark
三、自定义fixture功能
1.前置处理和后置处理的fixture实现
在def中包含yield实现。yield前的语句为前置处理操作,yield后的语句为后置处理操作。分别在作用对象执行前后执行。
2.fixture配置
scope参数:定义fixture作用对象的等级,默认为函数方法级。可指定等级有:session,module,class,function
autoure参数:定义fixture是否自动装配给测试对象。
3.带参数的fixture实现参数化
fixture装饰的函数可以定义参数,通过这个参数接收数据,经过fixture功能处理后,返回需要的测试数据对象。参数来源有两种途径:
- fixture的param参数传参。
- 作用对象的parametrise中传参。
4.fixture的调用
自定义的fixture功能需要装配到测试对象上。通常有三种方式。
- 定义fixture时,指定autoure参数,自动配置给所有测试对象;
- 测试对象用mark.usefixture指定装配fixture功能;
- 测试对象函数方法定义时,将需要装配的fixture定义到函数方法的参数中。会自动执行。(如果装配的fixture有参数,则还需要传入数据)
四、多种执行方式
如何执行?给pytest配置执行方案。①pytest.ini中配置执行pytest命令默认带的配置参数数据;②pytest.main([**args]),使用main方法指定参数数据;③命令行直接指定参数数据;④os.system("command"),使用system方法执行命令行命令。
常用的几种执行方案
- 执行全部:pytest
- 执行smoke test:pytest -m "smoke"
- 执行单个模块:pytest.main()
- 控制台打印配置:-s,-q,-v
- 测试结果配置:--alluredir ./result(需要安装allure,并执行allure generate ./result -o ./result.report --clean命令生成index.html报告文件)
执行过程中控制台会打印执行记录以及是否通过的结果
执行过程中没有抛出except,则视为pass。否则为fail并打印except的记录,如assert失败抛出异常,如数据驱动未找到数据文件(尽量避免脚本bug导致执行fail)