文章目录
PyTest
一、 快速开始
1、 介绍
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
官方文档位置:https://docs.pytest.org/en/7.1.x/
2、 安装
这里使用的是poetry
来进行安装的,poetry使用方法
poetry add pytest # 添加pytest
poetry add pytest-html # 添加 html 测试报告生成
pytest --version # 检测是否安装成功
3、 第一个测试
创建一个test_*.py
或者*_test..py
的文件,运行的时候,pytest可以自动检测这些测试文件:
# content of test_sample.py
def func(x):
return x + 1
def test_answer():
assert func(3) == 5
你可以使用
assert
验证测试期望的声明。皮特试验 Advanced assertion introspection 将智能地报告断言表达式的中间值,以便避免使用多个名称 of JUnit legacy methods .
然后,我们就使用,pytest提供的命令开始进行测试:
pytest tests --html report.html # --html 指定html输出的位置,tests是存放测试文件的文件夹
pytest
将运行窗体测试的所有文件_ *.py or * _当前目录及其子目录中的test.py
运行结果:
4、 断言引发异常
我们使用 raises 助手来断言某些代码引发异常:
# content of test_sysexit.py
import pytest
def f():
raise SystemExit(1)
def test_mytest():
with pytest.raises(SystemExit):
f()
# 运行测试
# pytest -q
以“安静”报告模式执行测试功能: 它不会显示其为程序的异常,测试正常通过。
pytest
中的-q
参数代表保持输出简短 ,只输出程序异常的日志,其余的不输出。
5、 分组测试
一旦开发了多个测试,您可能需要将它们分组到一个类中。pytest使创建包含多个测试的类变得很容易:
# content of test_class.py
class TestClass:
def test_one(self):
x = "this"
assert "h" in x
def test_two(self):
x = "hello"
assert hasattr(x, "check")
pytest
发现以下所有测试 Conventions for Python test discovery ,所以它发现test_
前缀函数。没有必要对任何东西进行子类化,但是要确保在类前面加上Test
否则将跳过该类。我们只需传递其文件名即可运行该模块:pytest -q test_class.py
第一次测试通过,第二次失败。您可以很容易地看到断言中的中间值,以帮助您理解失败的原因。
将测试分组在类中是有益的,原因如下:
- 试验机构
- 仅在该特定类中共享测试夹具
- 在类级别应用标记并将其隐式应用于所有测试
在类中对测试分组时需要注意的是,每个测试都有一个唯一的类实例。让每个测试共享同一个类实例将非常不利于测试隔离,并且会导致不良的测试实践。概述如下:
# content of test_class_demo.py
class TestClassDemoInstance:
value = 0
def test_one(self):
self.value = 1 # 只有静态函数才可以修改类属性,这里是修改失败的
assert self.value == 1
def test_two(self):
assert self.value == 1
pytest -k TestClassDemoInstance -q
- 在类级别添加的属性是类属性,因此它们将在测试之间共享
6、 添加临时目录
pytest
提供内置固定装置/函数参数来请求任意资源,例如唯一的临时目录:
# content of test_tmp_path.py
def test_needsfiles(tmp_path):
print(tmp_path)
assert 0
# pytest -q test_tmp_path.py # 运行
列出名字
tmpdir
在测试函数签名和pytest
将在执行测试函数调用之前查找并调用fixture工厂以创建资源。使用
pytest --fixtures
命令查看有哪些fi