概述
pytest是一个非常成熟的全功能的Python测试框架,主要特点有以下几点:
- 简单灵活,容易上手,文档丰富;
- 支持参数化,可以细粒度地控制要测试的测试用例;
- 能够支持简单的单元测试和复杂的功能测试,还可以用来做selenium/appnium等自动化测试、接口自动化测试(pytest+requests);
- pytest具有很多第三方插件,并且可以自定义扩展,比较好用的如pytest-selenium(集成selenium)、pytest-html(完美html测试报告生成)、pytest-rerunfailures(失败case重复执行)、pytest-xdist(多CPU分发)等;
- 测试用例的skip和xfail处理;
- 可以很好的和CI工具结合,例如jenkins
install package
pip3 install pytest pytest-html pytest-xdist pytest-rerunfailures pytest-ordering pytest-dependency --index-url https://pypi.douban.com/simple Image
验证:pytest --version
pytest框架约束
所有的单测文件名都需要满足test_*.py格式或*_test.py格式。
在单测文件中,测试类以Test开头,并且不能带有 init 方法(注意:定义class时,需要以Test开头,不然pytest是不会去运行该class的)
在单测类中,可以包含一个或多个test_开头的函数。
此时,在执行pytest命令时,会自动从当前目录及子目录中寻找符合上述约束的测试函数来执行。
pytest运行方式
# file_name: test_case.py
import pytest # 引入pytest包
def test_a(): # test开头的测试函数
print("------->test_a")
assert 1 == 1 # 断言成功
def test_b():
print("------->test_b")
assert 1 == 2 # 断言失败
if __name__ == '__main__':
pytest.main("-s test_case.py") # 调用pytest的main函数执行测试
如何运行
- pytest # run all tests below current dir
- pytest test_mod.py # run tests in module file test_mod.py
- pytest somepath # run all tests below somepath like ./tests/
- pytest -k stringexpr # only run tests with names that match the the "string expression", e.g. "MyClass and not method" will select TestMyClass.test_something but not TestMyClass.test_method_simple
- pytest test_mod.py::test_func # only run tests that match the "node ID", e.g "test_mod.py::test_func" will be selected only run test_func in test_mod.py
scope
fixture里面有个scope参数可以控制fixture的作用范围:session>module>class>function
- @pytest.fixture(scope="session", autouse="true")
- @pytest.fixture(scope="module", autouse="true")
- @pytest.fixture(scope="class", autouse="true")
- @pytest.fixture(scope="function", autouse="true")
测试用例执行顺序
- pytest-ordering 通过装饰器@pytest.mark.run(order=1)来进行控制,数字越小,越前执行
- 安装pytest-dependency 在对应的方法A上添加@pytest.mark.dependency()对所依赖的方法进行标记设置为被依赖方法,在依赖方法使用@pytest.mark.dependency(depends=["被依赖方法名"])引用依赖 可添加name=参数
- @pytest.fixture装饰,包括session、module、class、function
- @pytest.mark.skip() 可以装饰方法与类,用于跳过该用例
三方插件
- pytest-selenium(集成selenium)
- pytest-html(完美html测试报告生成)
- pytest-rerunfailures(失败case重复执行)
- pytest-xdist(多CPU分发)
- pytest-ordering(控制用例执行顺序)
- pytest-dependency(用例直接依赖调用)