• 15
  • 15
分享
  • 全功能Python测试框架:pytest——软件测试圈
  • 恬恬圈 2021-10-08 09:46:12 字数 2649 阅读 1419 收藏 15

python通用测试框架大多数人用的是unittest+HTMLTestRunner,这段时间看到了pytest文档,发现这个框架和丰富的plugins很好用,所以来学习下pytest。

pytest是一个非常成熟的全功能的Python测试框架,主要有以下几个特点:

  • 简单灵活,容易上手;

  • 支持参数化;

  • 能够支持简单的单元测试和复杂的功能测试,还可以用来做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

验证安装的版本:

pytest --version

几个pytest documentation中的例子:

例子1:

import pytest
# content of test_sample.py
def func(x):
    return x + 1
def test_answer():
    assert func(3) == 5

命令行切换到文件所在目录,执行测试(也可以直接在IDE中运行):

1.png

这个测试返回一个失败报告,因为func(3)不返回5。

例子2:

当需要编写多个测试样例的时候,我们可以将其放到一个测试类当中,如:

class TestClass:  
    def test_one(self):  
        x = "this"  
        assert 'h' in x  
  
    def test_two(self):  
        x = "hello"  
        assert hasattr(x, 'check')

运行以上例子:

2.png

从测试结果中可以看到,该测试共执行了两个测试样例,一个失败一个成功。同样,我们也看到失败样例的详细信息,和执行过程中的中间结果。-q即-quiet,作用是减少冗长,具体就是不再展示pytest的版本信息。

如何编写pytest测试样例

通过上面2个实例,我们发现编写pytest测试样例非常简单,只需要按照下面的规则:

  • 测试文件以test_开头(以_test结尾也可以)

  • 测试类以Test开头,并且不能带有 init 方法

  • 测试函数以test_开头

  • 断言使用基本的assert即可

运行模式

Pytest的多种运行模式,让测试和调试变得更加得心应手,下面介绍5种常用的模式。在介绍之前需要提醒一句,运行pytest时会找当前目录及其子目录中的所有test_*.py 或 *_test.py格式的文件以及以test开头的方法或者class,不然就会提示找不到可以运行的case了。

1.运行后生成测试报告(htmlReport)

安装pytest-html:

pip install -U pytest-html

运行模式:

pytest --html=report.html

报告效果:

3.png

在以上报告中可以清晰的看到测试结果和错误原因,定位问题很容易。

2.运行指定的case

当我们写了较多的cases时,如果每次都要全部运行一遍,无疑是很浪费时间的,通过指定case来运行就很方便了。

例子代码:

class TestClassOne(object):
    def test_one(self):
        x = "this"
        assert 't'in x
    def test_two(self):
        x = "hello"
        assert hasattr(x, 'check')
class TestClassTwo(object):
    def test_one(self):
        x = "iphone"
        assert 'p'in x
    def test_two(self):
        x = "apple"
        assert hasattr(x, 'check')

运行模式:

模式1:直接运行test_se.py文件中的所有cases:

pytest test_se.py

模式2:运行test_se.py文件中的TestClassOne这个class下的两个cases:

pytest test_se.py::TestClassOne

模式3:运行test_se.py文件中的TestClassTwo这个class下的test_one:

pytest test_se.py::TestClassTwo::test_one
注意:定义class时,需要以T开头,不然pytest是不会去运行该class的。

3.多进程运行cases

当cases量很多时,运行时间也会变的很长,如果想缩短脚本运行的时长,就可以用多进程来运行。

安装pytest-xdist:

pip install -U pytest-xdist

运行模式:

pytest test_se.py -n NUM

其中NUM填写并发的进程数。

4.重试运行cases

在做接口测试时,有事会遇到503或短时的网络波动,导致case运行失败,而这并非是我们期望的结果,此时可以就可以通过重试运行cases的方式来解决。

安装pytest-rerunfailures:

pip install -U pytest-rerunfailures

运行模式:

pytest test_se.py --reruns NUM

NUM填写重试的次数。

5.显示print内容

在运行测试脚本时,为了调试或打印一些内容,我们会在代码中加一些print内容,但是在运行pytest时,这些内容不会显示出来。如果带上-s,就可以显示了。

运行模式:

pytest test_se.py -s

另外,pytest的多种运行模式是可以叠加执行的,比如说,你想同时运行4个进程,又想打印出print的内容。可以用:

pytest test_se.py -s -n 4


作者:呆呆冬

链接:https://www.jianshu.com/p/932a4d9f78f8

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          • 作为软件开发从业者,API 调试是必不可少的一项技能,在这方面 Postman 做的非常出色。但是在整个软件开发过程中,API 调试只是其中的一部分,还有很多事情 Postman 无法完成,或者无法高效完成,比如:API 文档定义、API Mock、API 自动化测试等等。Apifox 就是为了解决这个问题而生的。接口管理现状一、常用解决方案使用 Swagger 管理 API 文档使用 Postman 调试 API使用 MockJs 等工具 Mock API 数据使用 JMeter 做 API 自动化测试二、存在的问题维护不同工具之间数据一致性非常困难、低效。并且这里不仅仅是工作量的问题,...
            13 12 514
            分享
          •   诺基亚今日推出新款 150 功能机,到手价 229 元。  诺基亚 150 手机搭载 2.4 英寸屏幕,九宫格键盘,后置 9 级独立外放扬声器;支持长按“#”键快速静音,可设置亲情号码一键呼叫。  该款新机内置 1450mAh 电池,支持 32GB 存储卡容量扩展;内置 FM 收音机,支持扬声器播放,也可连接 3.5mm 耳机收听;后置闪光灯,可长按方向“上”键开启。  外观方面,诺基亚 150 手机有红色、蓝色和黑色三种配色可选,外壳采用聚碳酸酯材质,据官方介绍整机可十年无污染,不褪色、更耐摔耐用。  该款诺基亚 150 手机仅支持移动 2G 网络,不支持联通和电信网络。目前诺基亚 15...
            0 0 545
            分享
          • 数据库数据库视图:视图是从一个或几个基本表(或视图)中导出的虚拟的表。在系统的数据字典中仅存放了视图的定义,不存放视图对应的数据。(视图相当于一个查询语句,它不占有存储空间)。游标:游标是一段私有的SQL工作区,也就是一段内存区域,用于暂时存放受SQL语句影响到的数据。通俗理解就是将受影响的数据暂时放到了一个内存区域的虚表中,而这个虚表就是游标。?游标是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。数据库表:在关系数据库中,数据库表是一系列二维数组的集合,用来代表和储存数据对象之间的关系。(表是真实存在, 它占存储空间)存储过程:一组为了完成特定功能的SQL语句集(或者自定义数据库...
            0 0 1672
            分享
          •   新手学软件测试工程师学得好吗?如果你想转行到IT行业,软件测试是一门相对简单的学科,非常适合零基础的人学习。如果你决心学好软件测试并充满兴趣,那么学习不会太难。如果你是转行的人,买本软件测试书先学习基础知识,对基础知识有一定的理解很重要。  新手的软件测试课程实际上并不难学习,具有一定的学历,非计算机专业背景也可以学,软件测试不需要敲太多代码,只要操作测试工具进行测试就可以,细心耐心就可以胜任。软件测试入门简单,但深入困难,入门时只要理解中文,理解能力没有问题,就可以根据测试用例实施用例。  测试理论知识的学习测试定义、测试分类、测试方法、测试生命周期、测试计划、测试方案、测试策略、测试用...
            0 0 443
            分享
          • 众所周知,事务是一个实体——通常是一组 SQL 语句,或者语句和存储过程调用的组合,应该全部执行或不执行。例如,如果一个事务有 4 个语句 - S1 到 S4 并且例如 - S4 抛出一些错误可能是由于不正确的语法或访问或任何功能问题,那么语句 S1 到 S3 将被回滚并且数据库将到达它的原始状态,好像没有执行任何语句。理解 MySQL TRANSACTION 的最佳示例是同一家银行的 2 个账户之间的汇款。想象一下,如果没有 TRANSACTION,这将如何工作?假设借记成功,但贷记没有发生,可能是因为一些数据库问题。在这种情况下,数据库将处于不一致的状态。因此,在这种情况下,客户的账户会借...
            0 0 787
            分享
      • 51testing软件测试圈微信