• 1
  • 2
分享

一、pytest简介

pytest.jpg

pytest是一个非常成熟的全功能的Python测试框架。

pytest框架特点:

  • 简单灵活,非常容易上手

  • 支持参数化

  • 支持简单的单元测试和复杂的功能测试,还可以用来做selenium/appnium等自动化测试、接口自动化测试(pytest+requests)

  • pytest具有很多第三方插件,并且可以自定义扩展,比较好用的如pytest-selenium(集成selenium)、pytest-html(完美html测试报告生成)、pytest-rerunfailures(失败case重复执行)、pytest-xdist(多CPU分发)等

  • 测试用例的skip和xfail处理

  • 可以与jenkins集成

  • report框架----allure 也支持了pytest

pytest安装

pip install -U pytest

查看版本或查看是否已安装:


 1.png

2.png

 


二、小试牛刀

demo1测试通过

import pytest
'''
1、测试方法要以test开头
'''
 def test_testdemo1():
     print(">>>>>test_pass>>>>>>>")
     assert 1 == 1
 
if __name__ == '__main__':
    pytest.main()
#命令行执行用例文件    
#pytest test_mod.py
 
============================= test session starts =============================
platform win32 -- Python 3.5.0, pytest-6.0.1, py-1.9.0, pluggy-0.13.1
rootdir: C:\github\xxx\xxxx
plugins: celery-4.3.0
collected 1 item
 
test_a1.py .                                                             [100%]
 
============================== 1 passed in 0.12s ==============================
 
Process finished with exit code 0

demo2测试不通过

import pytest
'''
1、测试方法要以test开头
'''
def test_testdemo2():
    print(">>>>>test_fail>>>>>>>")
    assert 1 == 2
if __name__ == '__main__':
    pytest.main()    
============================= test session starts =============================
platform win32 -- Python 3.5.0, pytest-6.0.1, py-1.9.0, pluggy-0.13.1
rootdir: C:\github\xxxxx\xxxx
plugins: celery-4.3.0
collected 1 item

test_a1.py F                                                             [100%]

================================== FAILURES ===================================
_______________________________ test_testdemo2 ________________________________

    def test_testdemo2():
        print(">>>>>test_fail>>>>>>>")
>       assert 1 == 2
E       assert 1 == 2

test_a1.py:24: AssertionError
---------------------------- Captured stdout call -----------------------------
>>>>>test_fail>>>>>>>
=========================== short test summary info ===========================
FAILED test_a1.py::test_testdemo2 - assert 1 == 2
============================== 1 failed in 0.14s ==============================

三、pytest常用命令

***查看帮助信息***
pytest --version # 查看当前已安装版本
pytest --fixtures #显示内置函数参数
pytest --help     #查看帮助信息
***用例执行控制***
pytest -x             # 遇到失败用例停止测试
pytest --maxfail=2    # 出现2个用例失败终止测试
pytest test_XX.py     # 指定运行的测试文件
pytest test/          # 指定测试目录
pytest -k "MyClass and not method"    #通过关键字表达式过滤需要执行的用例,条命令会匹配文件名、类名、方法名匹配表达式的用例,这里这条命令会运行 TestMyClass.test_1, 不会执行 TestMyClass.test_method_1

pytest test_xx.py::test_xxx     #通过 node id 指定测试用例,即执行test_xx.py用例文件的test_xxx方法,nodeid由模块文件名、分隔符、类名、方法名、参数构成

pytest -m slow        #通过标记表达式执行,这条命令会执行被装饰器 @pytest.mark.slow 装饰的所有测试用例

pytest --pyargs pkg.test   #这条命令会自动导入包 pkg.test,并执行该包所在的目录下面的用例。
pytest test_se.py -s   #-s  加上-s参数可以在运行pytest时将print语句输出到控制台

四、pytest实用插件

pytest-xdist

pytest-xdist可以实现多进程运行测试用例,在测试用例比较多的情况下可以有效缩短脚本的测试执行时间。

安装pytest-xdist:pip install -U pytest-xdist使用pytest-xdist运行测试用例:pytest test_se.py -n NUM    --NUM为进程数


pytest-html

pytest-HTML是一个插件,pytest用于生成测试结果的HTML报告。

安装pytest-htmlpip install pytest-html使用pytest-htm生成测试结果报告pytest --html=report.html   --执行当前目录下的用例文件指定报告生成的路径pytest --html=./report/report.html将css样式合并到html里pytest --html=report.html --self-contained-html


pytest-rerunfailures

pytest-rerunfailures失败用例重跑

命令行参数:--reruns n(重新运行次数),--reruns-delay m(等待运行秒数)

装饰器参数:reruns=n(重新运行次数),reruns_delay=m(等待运行秒数) @pytest.mark.flaky(reruns=5)

安装pytest-rerunfailurespip install pytest-rerunfailures  pytest --reruns 5 -s        #运行失败的fixture或setup_class也将重新执行pytest -s demo_xxx.py --reruns 5pytest -s demo_xxx.py --reruns 5  --reruns-delay 1  #重跑之前等待1s


pytest-assume

pytest-assume实现用例的多重校验,虽然assert也可以写多个校验条件,但是前一个条件失败,后面的校验就不会执行,而 pytest-assume断言即使前面一个断言失败,后面的断言也会继续执行。

安装pytest-assumepip install pytest-assume


pytest-ordering

对于存在上下文依赖的测试,有时候可能需要设定一些特定执行顺序,pytest的ordering插件,就很好的解决了这个问题

安装pytest-orderingpip  install  pytest-ordering@pytest.mark.run(order=2)def test_demo1():   print ("first test")   assert True@pytest.mark.run(order=1)def test_demo2():   print ("second test")   assert True原执行顺序为test_demo1>>test_demo2      加上@pytest.mark.run(order=X)执行的顺序变为test_demo2>>test_demo1    


五、pytest的setup和teardown函数作用

setup和teardown函数运行于测试方法的开始与结束时,即:运行一次测试函数前调用setup函数,测试结束后调用teardown函数。setup()/teardown()是函数级别的。

import pytest
class TestDemo1:
  def setup(self):
      print("------->setup_method------------")
  def teardown(self):
      print("------->teardown_method----------")
  def test_demo1(self):
      print("------->test_a-----------")
      assert 1
    
platform win32 -- Python 3.5.0, pytest-6.0.1, py-1.9.0, pluggy-0.13.1
rootdir: E:\PyProject\TestDemo1
collected 1 item                                                                                             
source\testDemo1.py ------->setup_method------------
------->test_a-----------
.------->teardown_method----------

六、pytest的setup_module\setup_class和teardown_module\teardown_class函数作用

运行于测试类初始化以及结束时,即:在一个测试内只运行一次setup_class和teardown_class。

def setup_module(self):
    print("=======1111111========")

def teardown_module(self):
    print("=======1111111========")
import pytest
class Test_ABC:
    @classmethod
    def setup_class(self):
       print(">>>>>>setup_class_method>>>>>>>>")

    @classmethod
    def teardown_class(self):
       print(">>>>>>teardown_class_method>>>>>")
    def setup(self):
       print(">>>>>>setup_method>>>>>>")
    def teardown(self):
       print(">>>>>>teardown_method>>>>>>")
    def test_a(self):
       print(">>>>test_a>>>>>")
       assert 1==1
    def test_b(self):
       print(">>>>>test_b>>>>>")
       assert 1==1
       
       platform win32 -- Python 3.5.0, pytest-6.0.1, py-1.9.0, pluggy-0.13.1
rootdir: C:\github\YZhttprunner\YZhttprunner
plugins: celery-4.3.0
collected 2 items                                                                                                                             
 
test_a1.py =======setup_module========
>>>>>>setup_class_method>>>>>>>>
>>>>>>setup_method>>>>>>
>>>>test_a>>>>>
.>>>>>>teardown_method>>>>>>
>>>>>>setup_method>>>>>>
>>>>>test_b>>>>>
.>>>>>>teardown_method>>>>>>
>>>>>>teardown_class_method>>>>>
=======teardown_module========

七、pytest配置文件

pytest的配置文件一般放在测试目录下,名称为pytest.ini的文件,命令行运行时会使用该配置文件中的配置.

#配置pytest命令行运行参数
   [pytest]
    addopts = -s ... # 空格分隔,可添加多个命令行参数 -所有参数均为插件包的参数配置测试搜索的路径
    testpaths = ./testcase  # 即当前目录下的testcase文件夹 -可自定义
#配置测试搜索的文件名称
    python_files = test*.py 
#当前目录下的testcase文件夹下,以test开头,以.py结尾的所有文件 -可自定义
配置测试搜索的测试类名
    python_classes = Test_*  
   #当前目录下的testcase文件夹下,以test开头,以.py结尾的所有文件中,以Test开头的类 -可自定义
配置测试搜索的测试函数名
  
    python_functions = test_*
#当前目录下的testcase文件夹下,以test开头,以.py结尾的所有文件中,以Test开头的类内,以test_开头的方法 -可自定义

八、pytest跳过测试用例

1、使用@pytest.mark.skip()装饰测试方法,运行测试时将会跳过该方法不执行。

#跳过测试函数的最简单方法是使用跳过装饰器标记它,可以传递一个可选的原因
@pytest.mark.skip(reason='misunderstood the API')
def test_demo1():
    ....

2、在测试方法中设置强制跳过pytest.skip(reason)

def test_demo1()::
    if not valid_config():
        pytest.skip("unsupported configuration")

3、设置跳过整个模块级别pytest.skip(reason,allow_module_level = True)

import pytest
if not pytest.config.getoption("--custom-flag"):
    pytest.skip("--custom-flag is missing, skipping tests", allow_module_level=True)

4、有条件地跳过某些内容,则可以使用skipif(可以装饰类和方法)

'''
如果当前环境是python3.6以下版本就跳过用例
'''
import sys
@pytest.mark.skipif(sys.version_info < (3,6),
reason="当前python环境版本小于3.6跳过测试用例")
def test_demo1():
    ...
'''
如果当前环境是python3.6以下版本,则跳过该类的所有测试方法
'''
@pytest.mark.skipif(sys.version_info < (3,6),
reason="requires python3.6 or higher")
class TestCalls(object):
    def test_demo1(self):
        "will not be setup or run under 'python3.6' platform"
  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          •   一、网络管理功能的目的  解决蓄电池电量有限,如果整车控制器同时工作会造成电池亏电的问题。通过网络管理功能,当用户需要请求相关功能时,参与该功能的相关ECU节点才需要启动起来。  协调各 ECU 同时进入网络睡眠模式;车载控制器网络管理功能就是通过在各个ECU的网络上,发送一些命令制定一套规则,来实现整车各个ECU的协同睡眠和唤醒。按照唤醒方式,我们可以将ECU网络节点类型划分为本地唤醒与远程唤醒。本地唤醒:唤醒源来源于自身模块,比如KL15硬线唤醒;远程唤醒:唤醒源来源于自身ECU节点所在的网络报文,该节点可以处于完全休眠状态;  二、结合硬件电路说说网络管理功能  为了支持睡眠和唤醒,...
            0 0 2390
            分享
          • 数据库数据库视图:视图是从一个或几个基本表(或视图)中导出的虚拟的表。在系统的数据字典中仅存放了视图的定义,不存放视图对应的数据。(视图相当于一个查询语句,它不占有存储空间)。游标:游标是一段私有的SQL工作区,也就是一段内存区域,用于暂时存放受SQL语句影响到的数据。通俗理解就是将受影响的数据暂时放到了一个内存区域的虚表中,而这个虚表就是游标。?游标是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。数据库表:在关系数据库中,数据库表是一系列二维数组的集合,用来代表和储存数据对象之间的关系。(表是真实存在, 它占存储空间)存储过程:一组为了完成特定功能的SQL语句集(或者自定义数据库...
            0 0 1878
            分享
          • 说到探索式软件测试(简称为ET,Exploratory Testing)或者探索性测试,很多的测试人员并不陌生。几年前,这个词在测试行业比较热门,而目前热门的应该算自动化测试了。   但自动化测试有一个致命的弱点,就是“预言家难题”-- 意思是如何才能知道被测试软件确实完成了它应该完成的任务,预言如何才能精准无任何差错。机器毕竟不是人,它只能按照固定的步骤来执行计算、判断,例如自动化运行中途出现:操作系统升级重启、机器断网、浏览器故障重启了、页面刷新较慢元素在该有的时间内没出现、HTTP丢包等任何一些不稳定现象,自动化的流程就很容易崩溃并最终需要人的介入。过度依赖自动...
            2 2 2675
            分享
          •   其实不是工作难找啦,而是公司对于人员要求提高啦!这就导致只会一些皮毛知识的测试人员工作不稳定,工作时间无法长久!  在经历这几年的疫情之下,大家越来越喜欢转战线上工作,因为社会原因我们对于软件的需求也在提高,同时更新迭代的速度也是飞快,这样的情况下,软件测试的岗位也同样跟着地位飞升,但是越是这样的时候,越是会对测试人员的要求提高!  我们从BOSS直聘、智联招聘等等招聘平台可以看到,以上海为例,有多少企业渴望拥有一个好的测试人才。  说完了前景,我们再来说说“钱景”,毕竟工作主要还是为了恰饭嘛,除了当下的薪资,我们还需要关注这个行业的薪资薪资涨幅是多少,为我们之后的职业生涯做准备。  初级...
            0 0 1653
            分享
          • 当一个软件测试工程师刚刚进入行业一到三年的时间,他们通常需要掌握一些基本技能和知识,并且需要学习一些新的技术和工具,以便更好地完成自己的测试工作。以下是一些建议,帮助测试工程师在这个阶段提升自己的技能。掌握基本的测试技能在软件测试领域,有一些基本的技能和知识是必须掌握的。这些技能包括如何编写测试用例、如何执行测试用例、如何记录测试结果等等。测试工程师需要在这些基本技能上建立起扎实的基础,以便更好地完成自己的测试工作。掌握软件测试基本技能需要系统地学习和实践,以下是一些具体的建议:首先,要了解软件测试的基本概念和流程,包括测试的类型、测试的方法、缺陷管理等等。可以通过阅读相关书籍、参加培训课程等...
            0 1 1463
            分享
      • 51testing软件测试圈微信