pytest测试框进阶(二)
一:跳过测试函数
根据特定的条件,不执行标识的测试函数.
方法:
skipif(condition, reason=None)
参数:
condition:跳过的条件,必传参数
reason:标注原因,必传参数
使用方法:
@pytest.mark.skipif(condition, reason="原因")
import pytest class Test_ABC: def setup_class(self): print("----->setup_class") def teardown_class(self): print("----->teardowb_class") def test_a(self): print("-------->test_a") assert 1 @pytest.mark.skipif(condition=2>1, reason = "跳过该函数") def test_b(self): print("----->test_b") assert 0
执行结果:
test_one.py ----->setup_class
-------->test_a
.----->teardowb_class
二:标记为预期失败函数
方法:
xfail(condition=None, reason=None, raises=None, run=True, strict=False)
常用参数:
condition:预期失败的条件,必传参数
reason:失败的原因,必传参数
使用方法:
import pytest class Test_ABC: def setup_class(self): print("----->setup_class") def teardown_class(self): print("----->teardowb_class") def test_a(self): print("-------->test_a") assert 1 @pytest.mark.xfail(2>1, reason="标注为预期失败") def test_c(self): print("------->test_c") assert 0
执行结果:
test_one.py ----->setup_class
-------->test_a
.------->test_c
----->teardowb_class
三:函数数据参数化
方便测试函数对测试属于的获取。
方法:
parametrize(argnames, argvalues, indirect=False, ids=None, scope=None)
常用参数:
argnames:参数名
argvalues:参数对应值,类型必须为list
当参数为一个时格式:[value]
当参数个数大于一个时,格式为:[(param_value1,param_value2.....),(param_value1,param_value2.....)]
使用方法:
@pytest.mark.parametrize(argnames,argvalues)
️ 参数值为N个,测试方法就会运行N次
单个参数
import pytest class Test_ABC: def setup_class(self): print("----->setup_class") def teardown_class(self): print("----->teardowb_class") def test_a(self): print("-------->test_a") assert 1 @pytest.mark.parametrize("a", [3, 6]) def test_d(self, a): print(f"test data:a={a}") assert a % 3 == 0
多个参数
import pytest class Test_ABC: def setup_class(self): print("----->setup_class") def teardown_class(self): print("----->teardowb_class") def test_a(self): print("-------->test_a") assert 1 @pytest.mark.parametrize("b,c", [(1, 2),(0,3)]) def test_e(self, b, c): print(f"test data:b={b}, c={c}") assert b+c == 3
函数返回值方式
import pytest def create_data(): return [(1, 2), (0, 3)] class Test_ABC: def setup_class(self): print("----->setup_class") def teardown_class(self): print("----->teardowb_class") def test_a(self): print("-------->test_a") assert 1 @pytest.mark.parametrize("b,c", create_data()) def test_e(self, b, c): print(f"test data:b={b}, c={c}") assert b+c == 3
四:执行失败的时候跳转到PDB
执行用例的时候,跟参数 --pdbm这样遇到失败的时候就会自动跳转pdb
pytest --pdb #每次遇到失败都跳转到pdb
pytest -x --pdb # 第一遇到失败就跳转到pdb,结束测试执行
pytest --pdb --maxfail=3 # 只有前三次失败跳转到pdb
五:设置断点
在用例中加入如下python代码,pytest会自动关闭输出的抓取,其他测试脚本不会受到影响
import pdb ; pdb.set_trace()
六:获取用例执行性能数据
pytest --durations=10 # 获取最慢10个用例的执行所消耗的时间