pytest框架
pytest 是 python 的第三方单元测试框架,比自带unittest 更简洁和高效,支持315种以上的插件,同时兼容 unittest 框架。
这就使得我们在 unittest 框架迁移到pytest 框架的时候不需要重写代码。接下来我们在文中来对分析下 pytest 有哪些简洁、高效的用法:
环境搭建
#首先使用 pip 安装 pytest
pip install pytest pip install pytest-html #原生态报告模板
pip show pytest #查看 pytest 是否安装成功
使用 pytest 执行测试需要遵行的规则:
- 必须以test_开头,或,test结尾
- 测试类必须以Test开头,,并且类中不能有_init_方法
- 测试方法必须以test开头
- 断言必须使用assert
在pytest中有四种setup和teardown:
- setup_module 和 teardown_module 在整个测试用例所在的文件中所有的方法运行前和运行后运行,只会运行一次;
- setup_class 和 teardown_class 则在整个文件中的一个class中所有用例的前后运行,
- setup_method 和 teardown_method 在class内的每个方法运行前后运行,
- setup_function、teardown_function 则是在非class下属的每个测试方法的前后运行;
数据驱动:
举例:
@pytest.mark.parametrize( "x,y,z", [(1,2,3),(2,3,4)] ) #列表套列表/列表套元组均可 def test1(x,y,z): assert x+y == z
fixture源码详解
fixture(scope='function',params=None,autouse=False,ids=None,name=None):
- scope:有四个级别参数"function"(默认),"class","module","session"
- params:一个可选的参数列表,它将导致多个参数调用fixture功能和所有测试使用它。
- autouse:如果True,则为所有测试激活fixture func可以看到它。如果为False则显示需要参考来激活fixture
- ids:每个字符串id的列表,每个字符串对应于params这样他们就是测试ID的一部分。如果没有提供ID它们将从params自动生成
- name:fixture的名称。这默认为装饰函数的名称。
fixture的作用范围
fixture里面有个scope参数可以控制fixture的作用范围:
session>module>class>function
- -function:每一个函数或方法都会调用
- -class:每一个类调用一次,一个类中可以有多个方法
- -module:每一个.py文件调用一次,该文件内又有多个function和class
- -session:是多个文件调用一次,可以跨.py文件调用,每个.py文件就是module
usefixtures与传fixture区别:
- 如果fixture有返回值,那么usefixture就无法获取到返回值,这个是装饰器usefixture与用例直接传fixture参数的区别。
- 当fixture需要用到return出来的参数时,只能讲参数名称直接当参数传入,不需要用到return出来的参数时,两种方式都可以。
fixture自动使用autouse=True
当用例很多的时候,每次都传这个参数,会很麻烦。
fixture里面有个参数autouse,默认是False没开启的,可以设置为True开启自动使用fixture功能,这样用例就不用每次都去传参了
autouse设置为True,自动调用fixture功能
调用fixture的三种方法
1 #1、函数或类里面方法直接传fixture的函数参数名称 2 @pytest.fixture() 3 def test1(): 4 print('\n开始执行function') 5 6 def test_a(test1): 7 print('---用例a执行---') 8 9 #2、使用装饰器@pytest.mark.usefixtures()修饰需要运行的用例 10 @pytest.fixture() 11 def test1(): 12 print('\n开始执行function') 13 @pytest.mark.usefixtures('test1') 14 def test_a(): 15 print('---用例a执行---') 16 17 #3、叠加usefixtures 18 #如果一个方法或者一个class用例想要同时调用多个fixture,可以使用@pytest.mark.usefixture()进行叠加。注意叠加顺序,先执行的放底层,后执行的放上层。 19 import pytest 20 21 @pytest.fixture() 22 def test1(): 23 print('\n开始执行function') 24 25 @pytest.mark.usefixtures('test1') 26 def test_a(): 27 print('---用例a执行---') 28 29 @pytest.fixture() 30 def test1(): 31 print('\n开始执行function1') 32 33 @pytest.fixture() 34 def test2(): 35 print('\n开始执行function2') 36 37 @pytest.mark.usefixtures('test1') 38 @pytest.mark.usefixtures('test2') 39 def test_a(): 40 print('---用例a执行---')
#pytest.main()
启动Pytest测试运行器,main() 函数如果不带任何参数,会自动查找和执行当前路径及其子目录中所有符合Pytest命名规范的所有测试文件(通常是文件名以 test_ 开头)。
#常用参数:
#示例
test_1.py文件
test_2.py文件
Login类:
登录方法 login
Shop类:
列出方法 shop_list
更新方法 shop_update
- -m
-m <标记>:运行指定标记的用例(需配合@pytest.mark使用)。支持逻辑表达式(如and/or)组合多个标记
如:pytest.main(['-m', 'smoke']) # 执行标记为smoke的用例
- -
-k <表达式>:按名称匹配用例(支持逻辑运算符)
如:pytest.main( ['-k', 'test_login or test_logout'] ) # 执行名称包含login 或 logout的用例
- -s #输出到控制台。
- -v #以详细模式运行测试,显示更多的信息,如每个测试用例的名称、结果和错误信息。
- --collect-only #只收集测试用例但不执行它们,可以用于查看测试集中的所有可用测试。
- -ignore #忽略某个测试模块
- -q #简化打印信息
- -x #出现一条测试用例失败就退出测试。在调试阶段非常有用,当测试用例失败时,应该先调试通过,而不是继续执行测试用例。
跳过/条件跳过
skip 跳过--相当于注释的效果
skipif 有条件的跳过--
Allure报告优化
|
使用方法
|
参数值
|
参数说明 |
|
@allure.epic()
|
epic描述
|
敏捷里面的概念,定义史诗,往下是feature
|
|
@allure.feature()
|
模块名称
|
功能点的描述,往下是story
|
|
@allure.story()
|
用户故事
|
用户故事,往下是title
|
|
@allure.title(用例的标题)
|
用例的标题
|
重命名html报告名称
|
|
@allure.testcase()
|
测试用例的链接地址
|
对应功能测试用例系统里面的case
|
|
@allure.issue()
|
缺陷 |
对应缺陷管理系统里面的链接
|
|
@allure.description()
|
用例描述
|
测试用例的描述 |
|
@allure.step()
|
操作步骤
|
测试用例的步骤 |
|
@allure.severity()
|
用例等级
|
blocker,critical,normal,minor,trivial
|
|
@allure.link()
|
链接 |
定义一个链接,在测试报告展现
|
|
@allure.attachment()
|
附件 |
报告添加附件 |
浙公网安备 33010602011771号