- 介绍
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
- 安装
pip install pytest
或者在pycharm设置中进行安装
![](https://i-blog.csdnimg.cn/blog_migrate/6f0d8d77c69d9f7ea438b56309915fe6.png)
检查安装是否成功以及安装的版本,命令行命令如下:
pytest --version
![](https://i-blog.csdnimg.cn/blog_migrate/99072d50fb6ea43de05da61423eb6bc0.png)
- 用例编写
当我们通过 pytest 执行用例时,pytest 会自动递归遍历执行路径下所有的目录,根据 pytest 中默认用例的识别的规则,自动收集测试用例。所有在使用 pytest 编写测试用例之前,我们首先需要了解一下 pytest 收集用例时默认的用例识别规则。
默认的用例识别的规则
用例文件:所有文件名为 开头 或者 开头的文件会被识别为用例文件。test__test
用例类,测试文件中没有每个 Test 开头的类型就是一个测试用例类。
测试用例:测试类中每个 test 开头的方法就是一条测试用例,测试文件中每个 test 开头的函数也是一条测试用例,
例如:
![](https://i-blog.csdnimg.cn/blog_migrate/e85889533c0971c249495d72d5af6f17.png)
![](https://i-blog.csdnimg.cn/blog_migrate/e00b2e97e851529792d4d45ee6d80b39.png)
断言
pytest 里面断言实际上就是 python 里面的 assert 断言方法,常用的有以下几种
assert xx :判断 xx 为真
assert not xx :判断 xx 不为真
assert a in b :判断 b 包含 a
assert a == b :判断 a 等于 b
assert a != b :判断 a 不等于 b
- 执行
![](https://i-blog.csdnimg.cn/blog_migrate/119ed1e726ee2a4bc656cb4f45f11d10.png)
只重新运行上次失败的用例
pytest --lf -vs
先运行上次失败的用例再运行其余的测试用例
pytest --ff
python代码执行pytest(main函数)
![](https://i-blog.csdnimg.cn/blog_migrate/8f3ae6c8df713c66c92f00be8ddb3d75.png)
- 常用命令行参数
-x 用例一旦失败,就立刻停止执行
--maxfail=num 用例失败个数达到num后停止执行
-m 标记用例
-k 执行包含某个关键字的测试用例
-v 打印详细日志
-s 打印输出日志(一般-vs一起使用)
--collect-only 收集测试用例
- 常用装饰器
参数化
class Testdome:
a = ["1", "2", "3"]
# 参数化,ids表示起别名
@pytest.mark.parametrize("sum", a, ids=["test1", "test2", "test3"])
def test_demo(self, sum):
print(sum)
![](https://i-blog.csdnimg.cn/blog_migrate/c169d2143459042e64e3817e1779ea97.png)
跳过测试用例
@pytest.mark.skip
#加入跳过原因
@pytest.mark.skip(reason="该条用例跳过")
![](https://i-blog.csdnimg.cn/blog_migrate/0e2481a9754bf2a7765e2664188a80e9.png)
- 异常处理机制
try:
except
![](https://i-blog.csdnimg.cn/blog_migrate/4e91972f3af96d4700646f0af7098d71.png)
pytest.raises()
![](https://i-blog.csdnimg.cn/blog_migrate/1afb02fda8e53409344528818160cd8f.png)
- 常用数据驱动
excel
文件格式
![](https://i-blog.csdnimg.cn/blog_migrate/012961f0f5b58ac70370e1373bc7a252.png)
数据驱动案例
![](https://i-blog.csdnimg.cn/blog_migrate/d57092b0bf435ef6948f29b95cda9fb9.png)
![](https://i-blog.csdnimg.cn/blog_migrate/9976fe9a7d62f6dcb17144c639fdb846.png)
csv文件
文件格式
![](https://i-blog.csdnimg.cn/blog_migrate/e168b0796f91be025c4063774b71c17c.png)
数据驱动案例
![](https://i-blog.csdnimg.cn/blog_migrate/a537bc54765f98d4cbf625e35996f0fa.png)
![](https://i-blog.csdnimg.cn/blog_migrate/638ff5904e350dd2669dedefcfbe2729.png)
json文件
文件格式
![](https://i-blog.csdnimg.cn/blog_migrate/db52920468256794e852c424271e0eb7.png)
数据驱动案例
![](https://i-blog.csdnimg.cn/blog_migrate/71e42c3537c90c291c860723028c524b.png)
yaml文件
文件格式
![](https://i-blog.csdnimg.cn/blog_migrate/7819c99d1b86279918db4deaecb27520.png)
数据驱动案例
![](https://i-blog.csdnimg.cn/blog_migrate/1901d86b86f057847a1e84b80cf5ad19.png)