安装pytest
pip install pytest
pytest --version
# 查看安装的版本
pip show pytest
#查看安装的版本
pytest测试发现约定
- 若未指定参数,则在·testpaths·(已配置时)或当前目录中的位置搜索测试文件
- 测试文件以
test_*.py
或*_test.py
文件。 - 测试类以
Test
开头,并且不能带init
方法 - 测试方法以
test_
开头
简单示例
def test_passing():
# assert条件判断
assert (1, 2, 3) == (1, 2, 3)
1. pytest运行
1. pytest 不带任何参数,将查看当前工资目录(或其他一些预配置的目录)以及测试文件的所有子目录,并运行找到的测试代码
2. pytest xx.py # 运行执行测试文件
3. pytest xx.py::test_min #::字符后提供器名称来运行特定功能(参数化的类名、函数名、参数,需要一级一级的获取)
如 pytest test_mod.py::TestClass::test_method
4. pytest -m smoke # 标记可用于测试进行分组。然后使用pytest -m运行一组标记@pytest.mark.smoke的测试
5. pytest -k <expression> #按关键字来匹配: 使用表达式来运行与测试函数和类名称匹配的测试
6. pytest -q xx.py # -q制定执行的文件;
无该参数则默认执行当前文件夹下所有的用例 ;
-q参数只显示结果,不显示过程
7. pytest --pyargs pkg.testing # 从包里面运行;将导入pkg.testing并使用其文件系统位置来查找和运行测试
8. pytest -x 遇到错误时停止测试
9. --maxfail=num # 用例错误个数达到指定数量时,停止测试
10. -s参数是为了显示用例的打印信息
-
1a.
pytest xx.py
-
1b.
pytest -v
查看详细信息
-
1c.
pytest -h
查看所有选项
注:使用.标注passed;使用F标注
引申:pychram中运行pytest
更改工程设置的默认运行器:file->Setting->Tools->Python Integrated Tools->项目名称->Default test runner->选择py.test
修改后在该项目下重新创建.py文件,右键才显示 Run 'py.test in xxx'
注:pytest可以兼容unittest框架的代码
2. pytest断言
pytest中,assert
是编写测试的最基础工具
简单格式:assert expression
==>若expression
返回false
,则raise
AssertionError
复杂格式:assert expression1, expression2
==>若expression1
返回false
,则raise
AssertionError(expression2)
3. Pytest跳过
@pytest.mark.skip # 使用跳过装饰器,跳过指定的测试
def test_max():
values = [1, 2, 3, 5, 10]
val = algo.get_max(values)
assert val == 10
4. pytest标记
@pytest.mark.a # 自定义标记a
def test_1():
assert 1 == 2 # 使用assert关键字来测试算法的值
@pytest.mark.b # 自定义标记b
def test_2():
pass
# 其他内置标记
@pytest.mark.usefixtures # 在测试类或函数上使用夹具
@pytest.mark.filterwarnings # 过滤测试功能的某些警告
@pytest.mark.xfail # 满足特定条件,则产生预期失败的结果
@pytest.mark.skip # 总是跳过用例
@pytest.mark.skipif # 满足某个条件则跳过用例
@pytest.mark.parametrize #参数化, 对同一个测试函数执行多次调用
5. pytest 参数化测试
import algo
import pytest
data = [(1, 2, 3), (4, 5, 6), (7, 8, 10)]
excepted = [3, 6, 10]
# print(list(zip(data, excepted)))
@pytest.mark.parametrize("data,excepted", list(zip(data, excepted)))
def test_1(data, excepted):
val = algo.get_max(data)
assert val == excepted
使用说明:
pytest.mark.parametrize(argnames,argvalues)
-
argnames
:Union[str, List[str], Tuple[str, ...]]
-
argvalues
:Iterable[Union[ParameterSet, Sequence[object], object]]
注意:
- 变量n个时,可以使用str逗号分隔;或list、或tuple
- 变量
argnames
n个时,变量值即变量期望值argvalues
中每个元素均是由n个元素组成的元组对 - m组变量值,则运行m次
引申:Union的使用
参考:https://learning-pytest.readthedocs.io/zh/latest/
参考2:https://geek-docs.com/python/python-tutorial/python-pytest.html#pytest-2
参考3之注册标记避免警告:https://docs.pytest.org/en/stable/mark.html