Python pytest
1、前言
Python 测试相关库
- unittest:内置库,模仿 PyUnit 写的,简洁易用,缺点是比较繁琐。unittest+HTMLTestRunner。
- nose:测试发现,发现并运行测试。
- pytest:目前喜欢用这个,写起来很方便,并且很多知名开源项目在用,推荐。
- mock:替换掉网络调用或者 rpc 请求等
Python 鄙视链:pytest 鄙视 > unittest 鄙视 > robotframework
pytest 是 Python 的第三方单元测试框架,比自带 unittest 更简洁和高效,支持315种以上的插件,同时兼容 unittest 框架。这就使得我们在 unittest 框架迁移到 pytest 框架的时候不需要重写代码
全功能 Python 测试框架: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 可以和 allure生成非常美观的测试报告。
- pytest 可以实现测试用例的跳过以及reruns失败用例重试。
2、pytest安装
1 |
|
3、pytest框架的约束
3.1、python的命名规则
- py文件全部小写,多个英文用_隔开
- class名首字母大写,驼峰
- 函数和方法名小写,多个英文用_隔开
- 全局变量,前面要加global
- 常量字母必须全大写,如:AGE_OF_NICK
3.2、pytest的命名规则
- 模块名(py文件)必须是以
test_
开头或者_test
结尾 - 测试类(class)必须以
Test
开头,并且不能带 init 方法,类里的方法必须以test_
开头 - 测试用例(函数)必须以
test_
开头
4、pytest的运行方式
4.1、主函数运行
1 |
|
main中可使用的参数有:
参数 | 描述 | 案例 |
---|---|---|
-v |
输出调试信息。如:打印信息 | pytest.main([‘-v’,‘testcase/test_one.py’,‘testcase/test_two.py’]) |
-s |
输出更详细的信息,如:文件名、用例名 | pytest.main([‘-vs’,‘testcase/test_one.py’,‘testcase/test_two.py’]) |
-n |
多线程或分布式运行测试用例 | |
-x |
只要有一个用例执行失败,就停止执行测试 | pytest.main([‘-vsx’,‘testcase/test_one.py’] ) |
–maxfail |
出现N个测试用例失败,就停止测试 | pytest.main([‘-vs’,‘-x=2’,‘testcase/test_one.py’] |
–html=report.html |
生成测试报告 | pytest.main([‘-vs’,‘–html=./report.html’,‘testcase/test_one.py’] ) |
-m |
通过标记表达式执行 | |
-k |
根据测试用例的部分字符串指定测试用例,可以使用and,or |
4.2、命令行运行
文件路径:testcase/test_one.py
1 |
|
终端输入:pytest ./testcase/test_one.py --html=./report/report.html
参数 | 描述 | 案例 |
---|---|---|
-v |
输出调试信息。如:打印信息 | pytest -x ./testcase/test_one.py |
-q |
输出简单信息。 | pyets -q ./testcase/test_one.py |
-s |
输出更详细的信息,如:文件名、用例名 | pytest -s ./testcase/test_one.py |
-n |
多线程或分布式运行测试用例(前提安装插件:pytest-xdist) | |
-x |
只要有一个用例执行失败,就停止执行测试 | pytest -x ./testcase/test\_one.py |
–maxfail |
出现N个测试用例失败,就停止测试 | pytest --maxfail=2 ./testcase/test_one.py |
–html=report.html |
生成测试报告 | pytest ./testcase/test_one.py --html=./report/report.html |
–html=report.html |
生成测试报告 | pytest ./testcase/test_one.py --html=./report/report.html |
-k |
根据测试用例的部分字符串指定测试用例,可以使用and,or | pytest -k “MyClass and not method” ,这条命令会匹配文件名、类名、方法名匹配表达式的用例,这里这条命令会运行 TestMyClass.test_something, 不会执行 TestMyClass.test_method_simple |
单独执行某一个py文件里所有的用例
1
pytest test.py
执行目录下所有用例
1
pytest testcase/
单独执行某个用例,通过 node id 指定测试用例. node id由模块文件名、分隔符、类名、方法名、参数构成,举例如下:
1
2
3
4
5
6
7
8# 以函数形式的用例
pytest test_login.py::test_1
# 运行类
pytest test_login.py::TestClass
# 以类形式的用例
pytest test_login.py::TestClass::test_1注意:定义class时,需要以T开头,不然pytest是不会去运行该class的。
通过标记表达式执行
1
pytest -m slow
这条命令会执行被装饰器 @pytest.mark.slow 装饰的所有测试用例
通过包执行测试
1
pytest --pyargs pkg.testing
这条命令会自动导入包 pkg.testing,并使用该包所在的目录,执行下面的用例。
4.3、pytest.ini
配置文件方式运行(常用)
不管是 mian 执行方式还是命令执行,最终都会去读取 pytest.ini
文件
在项目的根目录下创建 pytest.ini
文件
1 |
|
pytset.ini
文件尽可能不要出现中文。
pytest 配置文件 pytest.ini
pytest 的配置文件通常放在测试目录下,名称为 pytest.ini
,命令行运行时会使用该配置文件中的配置
1 |
|
4.4、多进程运行cases
当cases量很多时,运行时间也会变的很长,如果想缩短脚本运行的时长,就可以用多进程来运行。
安装 pytest-xdist:
1 |
|
运行模式:
1 |
|
其中NUM填写并发的进程数。
5、Pytest Exit Code 含义清单
- Exit code 0 所有用例执行完毕,全部通过
- Exit code 1 所有用例执行完毕,存在Failed的测试用例
- Exit code 2 用户中断了测试的执行
- Exit code 3 测试执行过程发生了内部错误
- Exit code 4 pytest 命令行使用错误
- Exit code 5 未采集到可用测试用例文件
6、pytest的常用插件
包含很多插件包,大家可依据工作的需求选择使用。
7、pytest 中 conftest.py
文件
7.1、conftest.py
的特点
- pytest 会默认读取
conftest.py
里面的所有 fixture conftest.py
文件名称是固定的,不能改动conftest.py
只对同一个 package 下的所有测试用例生效- 不同目录可以有自己的
conftest.py
,一个项目中可以有多个conftest.py
- 测试用例文件中不需要手动
import conftest.py
,pytest 会自动查找
7.2、conftest.py
的示例目录
最顶层的 conftest,一般写全局的 fixture
1 |
|