官网
在项目根目录下创建:requirements.txt
pytest
pytest-html
pytest-xdist
pytest-ordering
pytest-rerunfailures
allure-pytest
执行命令
pip install -r requirements.txt
验证安装成功
pytest --version
- 模块名必须以
test_
开头或者_test
结尾- 测试类必须以Test开头,并且不能有
__init__
方法- 测试方法必须以test开头
主函数模式
pytest.main()
命令行模式
pytest
通过读取pytest.ini配置文件运行
- 一般放在项目根目录
- 编码:必须时ANSI,可以使用notepad++修改编码格式
- 作用:改变pytest默认行为
- 运行规则:主函数与命令行模式都会读取该文件
[pytest] #命令行参数,用空格分隔 addopts = -vs # 测试用例文件夹,可以自己配置 testpaths = ./testcase # 配置测试搜索的模块文件名称 python_files = test*.py # 配置测试搜索的测试类名 python_classes = Test* # 配置测试搜索的测试函数名 python_functions = test #测试分组 markers = g11n:国际化测试组 i10n:本地化测试组
执行指定模块
pytest.main(['test_module.py'])
指定目录
pytest.main(['dir_name'])
通过nodeid指定测试用例运行:nodeid由模块名,分隔符,类名,方法名,函数名组成
pytest.main('./dir_name/module.py::class_name::fun_name')
-s:显示测试用例的调试内容
-v:显示测试用例详细信息
-n:多线程执行测试用例
–reruns:设置重试次数
-x:只要有一个测试用例失败,停止测试
–maxfail:设置几个测试失败停止运行
-k:根据测试用例的部分字符串指定测试用例
-m:指定测试分组
unittest:按ascii的大小来运行
pytest:默认从上到下
指定测试用例顺序:需要安装pytest-ordering
@pytest.mark.run(order=)
@pytest.mark.mark_name
运行测试
pytest -m "mark_name"
运行多个分组
pytest -m "mark1 or mark2"
无条件
@pytest.mark.skip(reason="原因")
条件跳过
@pytest.mark.skipif(expr, reason="原因")
HTML
pytest --html ./save_path/report.html
Allure
下载
allure --version
--alluredir ./temp
allure generate ./temp -o ./report --clean
-o: 报告输出目录
–clean:对目录进行清除
- setup_class:所有测试用例执行之前运行一次
- teardown_class:所有测试用例执行之后运行一次
- setup_method:每个测试用例执行之前运行一次
- teardown_method:每个测试用例执行完成执行一次
部分测试用例前后置实现:@pytest.fixture()
参数
- scope:作用域
- function 方法级别的前后置 (默认)
- class 类级别的前后置
- module 模块级别的前后置
- package/session 包级别的前后置
- params: 参数化
- 支持参数类型:(列表:[] 元组() 字典列表[{},{},{}],字典元组:({},{},{}))
- autouse: 自动执行 默认值:False 如果为False,需要将函数名作为需要调用的方法的参数
- ids: 当使用params参数化时,给参数列表每一个值设置一个变量名
- name: 表示的时被@pytest.fixture标记的方法取一个别名
# yield返回后面可以有代码,return后面不能有代码,返回值即为测试方法的所传入的参数
# 参数名必须为request,否则报错[not found]
# 使用name对标记的方法起别名后不能使用原函数名作为参数,否则报错
@pytest.fixture(scope='function', params=['赵姗姗', '马化腾', '张一鸣'], ids=['zss', 'mht', 'zym'], name='fixt')
def my_fixture2(request):
print("前置")
yield request.param
print("后置")
conftest.py与fixture结合使用
assert
@pytest.mark.parametrize('args', ['zss', 'nan', 'lis'])
def test_ddt(self, args):
print(args)
@pytest.mark.parametrize('name,age', [('张三', 21), ('李四', 22), ('王五', 23)])
def test_ddt2(self, name, age):
print(name)
print(age)