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() 
附件

报告添加附件

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
posted on 2025-05-22 19:43  拾句  阅读(23)  评论(0)    收藏  举报