代码质量保证-单元测试框架pytest

2022-04-07 14:56:41 浏览数 (1)

在这周三的测试运维试听课程中,芒果给大家介绍了一个非常好用的python单元测试框架——pytest,这里我们来做个小总结。

单元测试介绍

单元测试是指,对软件中的最小可测试单元在与程序其他部分相隔离的情况下进行检查和验证的工作。一般而言,最小可测试单元通常是指函数或者类。

要做好单元测试,你首先必须弄清楚单元测试的对象是代码,以及代码的基本特征和产生错误的原因,然后你必须掌握单元测试的基本方法和主要技术手段,比如什么是驱动代码、桩代码和 Mock 代码等。

今天要给大家介绍的单元测试框架-pytest就是实现驱动代码的利器。

pytest介绍

pytest是一个非常成熟的 Python测试框架,可以做到做个场景的测试工作,如:单元测试、接口测试、web测试等。

  • pytest-selenium(集成selenium)、
  • pytest-html(完美html测试报告生成)、
  • pytest-rerunfailures(失败case重复执行)、
  • pytest-xdist(多CPU分发)
  • 测试用例的skip和xfail处理
  • 可以很好的和jenkins集成

pytest 是一个插件化平台,这就是它比 unittest 强大的原因,丰富的插件扩展增强了它的功能,也可以根据自己的需要定制化开发自己的插件,非常的灵活。

pytest 安装:

pip install pytest

pytest用例编写

测试用例的编写必须使用test_开头,测试用例文件必须以test_或者_test结束。

示例:

上面示例中,我们使用python内置的断言方式assert来进行断言。

如果包含多个测试用例,我们可以使用多个以test_开头的测试用例函数,或者使用以Test开头的测试用例类。

示例:

上面有说到pytest 允许您使用标准的python assert 用于验证Python测试中的期望和值。断言函数返回某个值,如果此断言失败,将看到函数调用的返回值,pytest 支持显示最常见的子表达式的值,包括调用、属性、比较以及二进制和一元运算符。

除此之外为了编写有关引发的异常的断言,可以使用 pytest.raises 作为这样的上下文管理器。

示例:

pytest用例执行

pytest可以使用命令行的方式执行测试用例

其执行结果代码如下

通过使用 pytest.mark 帮助您轻松地在测试函数上设置元数据。有一些内置标记,例如:

  • skip -总是跳过测试函数
  • skipif -如果满足某个条件,则跳过测试函数
  • xfail -如果满足某个条件,则产生“预期失败”结果
  • parametrize -对同一测试函数执行多个调用

示例:

parametrize 标记除了简单的入参参数化外,还可以对单个测试实例应用诸如skip和xfail之类的标记。

示例:

pytest测试报告

使用 -r 参数:可用于在测试会话结束时显示“简短测试摘要信息”,使大型测试套件中的所有故障、跳过、xfails等的清晰图像变得容易。

-r 选项接受其后面的字符数,使用 a 上面的意思是“除通行证外的所有通行证”。以下是可用字符的完整列表:

f -失败

E -误差

s -跳过

x -失败

X -XPASS

p -通过

P -通过输出

a - all except pP

A -所有

上面测试用例的测试结果为:

使用 -resultlog 参数:可用于在测试会话结束时生成文本格式报告文件

执行:

代码语言:javascript复制
pytest test_pytest.py --resultlog=report.txt

当然也可以以其他方式生成测试报告

使用第三方插件pytest-html :

可用于在测试会话结束时生成html格式报告文件

执行:

代码语言:javascript复制
pytest test_pytest.py --html=result.html

html报告需要安装pytest-html:

代码语言:javascript复制
pip install -U pytest-html

生成JUnitXml格式报告:

该格式方便与CI服务器进行集成

执行:

代码语言:javascript复制
pytest test_pytest.py --junitxml=report.xml

使用--pastebin将向远程粘贴服务提交测试运行信息,并为结果提供一个URL;

可以像往常一样选择测试或添加例如 -x 如果你只想发送一个特定的失败;

当前仅实现粘贴到http://bpaste.net服务

执行:

代码语言:javascript复制
pytest test_pytest.py --pastebin=all

结果显示:

0 人点赞