pytest 是 python 的第三方单元测试框架,比自带unittest 更简洁和高效,支持315种以上的插件,同时兼容 unittest 框架。这就使得我们在 unittest 框架迁移到pytest 框架的时候不需要重写代码。接下来我们在文中来对分析下 pytest 有哪些简洁、高效的用法: 环境搭建- #首先使用 pip 安装 pytest<br>pip install pytest
- pip install pytest-html #原生态报告模板<br>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类:<br> 登录方法 login<br>Shop类: <br> 列出方法 shop_list<br> 更新方法 shop_update
复制代码
- -m -m :运行指定标记的用例(需配合@pytest.mark使用)。支持逻辑表达式(如and/or)组合多个标记
如:pytest.main(['-m', 'smoke']) # 执行标记为smoke的用例
如: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() | 附件 | 报告添加附件
|
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |