首页 > 其他分享 >pytest框架学习随想

pytest框架学习随想

时间:2022-11-03 19:11:26浏览次数:78  
标签:框架 -- py 用例 pytest test 固件 随想

前言:最近一段时间在学习pytest框架,在学习过程中也遇到了很多的问题,简单跟大家分享一下

1. 什么是单元测试框架:

  (1). 单元测试框架:指在软件开发当中,针对软件的最小单位(函数,方法)进行正确性的检查测试。

  (2). 常见的单元测试框架有哪些:    

    java:junit和testng     python:unittest和pytest   (3). 单元测试框架主要做什么?     1.测试发现:从多个py文件里面去找到我们测试用例     2.测试执行:按照一定的顺序和规则去执行。并生成结果     3.测试判断:通过断言判断预期结果和实际结果的差异     4.测试报告:统计测试进度,耗时,通过率,生成测试报告。  

二、单元测试框架和自动化测试框架有什么关系? --

  备注:pytest的安装,此处就不做介绍了

  (1). 什么是自动化测试框架     它就是自动化测试组长针对一个项目开发的一个代码框架,这个框架封装了很多的基础模块,报告模块等等。   (2). 作用     1.提高测试效率,降低自动化用例的维护成本     2.减少人工干预,提高测试的准确性,增加代码的重用性。     3.核心思想是让不懂代码的人也能够通过这个框架去实现自动化测试。   (3). pytest单元测试框架和自动化测试框架的关系     pytest单元测试框架:只是自动化测试框架中的组成部分之一。     pom设计模式:只是自动化测试框架中的组成部分之一。     数据驱动:.....     关键字驱动     全局配置文件的封装     日志监控     selenium,requests二次封装     断言     .......

 

三、pytest框架自动发现测试用例的规则(默认情况)

  注意:可自定义规则,后续会介绍

  1. 模块名:

    规则:符合test_*.py格式 或者 *_test.py格式;如test_login.py / login_test.py

  

  2. 测试类:

    规则:类名符合Test*格式;且类中不带构造方法(__init__方法)

  

  3. 测试函数:

    规则:方法名符合test*() 格式

  

  4. 特殊类:

    规则:继承了unittest.TestCase的类也可以被发现(pytest框架兼容unittest)

  

 

4. 如何使用pytest执行用例

  1. 通过主函数进行执行(main方法)

    (1). 运行所有:pytest.main()     (2). 指定模块:pytest.main(['-vs','test_fixture.py'])     (3). 指定目录:pytest.main(['-vs','../demo_conftest'])         (4). 通过nodeid指定用例运行:nodeid由模块名,分隔符,类名,方法名,函数名组成。如:pytest.main(['-vs','./demo_conftest/test_fixture.py::test01']           

  2. 通过命令行执行

    (1). 运行所有:pytest     (2). 指定模块:pytest -vs test_login.py     (3). 指定目录:pytest -vs ./interface_testcase     (4). 指定目录:pytest -vs ./interface_testcase/test_interface.py::test_04_func            

    备注:命令行模式,多种参数可自行组合,常见可供参考:

      -s:表示输出调试信息,包括print打印的信息       -v:显示更详细的信息       -vs:这两个参数一起用       -n:支持多线程或者分布式运行测试用例。如:pytest -vs ./testcase/test_login.py -n 2   ; 需要安装插件:pytest-xdist        --reruns NUM:失败用例重跑; 需要安装插件:pytest-rerunfailures        -x:表示只要要一个用例报错,那么测试停止。       --maxfail=2 出现两个用例失败就停止。       -k:根据测试用例的部分字符串指定测试用例。如:pytest -vs ./testcase -k "ao"       --html ./report/report.html:生成html的测试报告。; 需要安装插件:pytest-html (          具体命令详情可通过pytest --help命令查看:       

  

  3. 通过全局配置文件进行配置自动执行(pytest.ini文件)

    注:pytest.ini这个文件它是pytest单元测试框架的核心配置文件之一
    1.位置:一般放在项目的根目录     2.编码:必须是ANSI编码格式,否则会报错,可以使用notpad++修改编码格式。     3.作用:改变pytest默认的行为。     4.运行的规则;不管是主函数的模式运行,命令行模式运行,都会去读取这个配置文件(文件默认不存在)。     

 

     注意:1. 在ini配置文件中:相关的key值不可改,为固定写法,如:addopts, testpath等等;对应的值的作用见截图说明,其他参数可自行查阅资料

        2. 对于python_files,python_classes,python_functions等配置,即pytest执行是自动取发现用例的文件名,类名,方法名的相关规则(如果没有当前ini文件,

         即按照默认规则去发现用例,如果配置了当前规则, 则默认发现用例规则不生效) 

    

5、pytest固件功能介绍(fixture,  又称夹具)

  1. 创建一个fixture:

    

  

   说明:一个普通函数,通过装饰器@pytest.fixture()进行装饰,他就是一个固件函数

    参数说明:

      1)scope参数:定义当前固件函数的作用范围:

        参数值--function: 方法级别,最小级别,默认级别,代表测试用例中,每一个方法(函数)在执行前后都会执行一次当前固件函数

        

        参数值--class: 类级别,代表测试用例中,每一个类/普通函数在执行前后都会执行一次固件函数

        

        参数值--module: 模块级别,可以理解为一个py文件,整个文件执行前后都会执行一次固件函数

        

        参数值--package: 包级别,针对当前固件所在的目录结构中,其父目录下第一条用例执行开始和最后一条用例执行结束都会执行一次固件函数

        

          

        参数值--session: 会话级别,即当前pytest执行的整个项目,执行开始喝执行结束都会执行一次固件函数

          ----自己琢磨吧,哈哈哈!!!

     2) autouse: 自动使用当前固件函数,默认为False
       值为:False,此时用例需要使用固件函数时,需要手动将固件函数名称,当成参数传递给用例函数
       

         

       值为:True,此时直接使用,不需要传值,自动调用
       

         

 

      3)parame,用于参数化

        parmes接受参数类型:list类型, tuple类型, str类型

        

          

          

         注意:接受dict类型时,需要特殊处理,固件传递给用例函数的是字典中的key值

         

       4)其他参数:
        ids:当使用params参数化时,给每一个值设置一个变量名。意义不大         name:给表示的是被@pytest.fixture标记的方法取一个别名  

  2. 测试固件(fixture)统一管理 -- conftest.py文件

    conftest.py说明:该文件可实现全局的前后置应用;名称固定,不可更改(同pytest.ini文件)--可在不同目录定义多个该文件

    作用:定义为conftest.py文件中的固件函数,可以在其他的多个文件中进行重复只用,重复利用代码,方便维护   

    使用方法:原则上conftest.py需要和运行的用例放到统一层。并且不需要做任何的imprt导入的操作

    

     使用示例:可直接将conftest.py中定义的固件的函数名称,当成参数传入到测试函数中

    

     特别说明:用例函数中,可同时调用多个固件函数,如:

    

      

 

6、pytest断言

  pytest断言,相对于unittest而言,非常简单,没有unittest中,基本格式为:assert a == b即可

  

  

7、参数化

  方式一:通过固件函数实现参数化

  

 

  方式二:通过标记:@pytest.mark.parametrize() 实现参数化

  

    

  说明:装饰器中的参数,除了可以传入一个固定的值,还可以是一些表达式,如: 

  

 

8、用例的筛选与过滤

  1. 用例忽略执行:

    命令:@pytest.mark.skip

  

  2. 根据条件判断用例是否执行:

    命令:@pytest.mark.skipif(condition=num >= 10, reason="条件不符合")

  

 

  3. 根据用例断言结果来判断最终结果:

    命令:@pytest.mark.xfail

    规则说明:如果用例本身断言成功,那么执行结果为失败;反之相同

   

    

  4. 自定义用例执行顺序: 

    命令:@pytest.mark.run(order=num) -- 根据num的值,从小到大执行

    说明:用例默认的执行顺序为从上到下执行(unittest时根据ASSIC码从小到大执行)

  

 

9. 生成测试报告

  1. 使用pytest-html插件生成html报告 

    执行命令如下:pytest -svv test_demo.py test_demo2.py --html=./report/report.html

      test_demo.py test_demo2.py:需要执行测试的py文件

      --html=./report/report.html:需要生成报告的路径和文件名

  

  

    注意:此时,生成的报告,html信息和css等文件在不同的文件,如果需要合并执行一下命令:pytest -svv test_demo.py test_demo2.py --html=./report/report.html --self-contained-html

  

  

 

   2. 生成allure报告

    1. 首选需本地安装allure,具体方法参考:https://www.cnblogs.com/XiqueBlogs/p/16178092.html

    2. 生成测试结果json文件:
      命令:pytest -vvs test_demo.py test_demo2.py --alluredir ./tmp

        ./tmp: 为需要生成文件的路径

    

 

     3. 将测试结果json文件转换成allure的html格式的报告

      python执行命令:os.system('allure generate ./tmp -o ./report_allure --clean')

     

 

     

 

标签:框架,--,py,用例,pytest,test,固件,随想
From: https://www.cnblogs.com/123polaris/p/16854535.html

相关文章