pytest用例运行及skip、xfail的使用
如何执行测试用例
(1)命令行运行pytest 运行目录下的所有用例
pytest test_reg.py 运行指定模块中的所有用例
pytest test_reg.py::TestClass::test_method 运行指定模块指定类指定用例
pytest -m tag 运行包含指定标签的所有用例
pytest -k "test_a and test_b" 运行名称包含指定表达式的用例(支持and or not)
其他常用参数
-q: 安静模式, 不输出环境信息
-v: 丰富信息模式, 输出更详细的用例执行信息
-s: 显示程序中的print/logging输出
(2)在pycharm中运行以pytest方式运行
当脚本命名为test_xx.py时,此时运行代码,pycharm会自动识别到以unittest方式运行
如果需要以pytest方式运行,需要改该工程设置默认的运行器:file->Setting->Tools->Python Integrated Tools->项目名称->Default test runner->
用例运行级别
模块级(setup_module/teardown_module):全局的,整个.py模块开始前和结束后调用一次
函数级(setup_function/teardown_function):只对函数用例生效(不在类内),每个函数级用例开始和结束时调用一次
类级(setup_class/teardown_class):只在类中前后运行一次(在类中)
方法级(setup_method/teardown_method):开始于方法始末(在类中)
类里面的(setup/teardown):运行在调用方法的前后
类中运行顺序:setup_module>setup_class>setup_method>setup>用例>teardown>teardown_method>teardown_class>teardown_module
skip跳过用例(无条件跳过)
使用场景
1)调试时不想运行这个用例
2)标记无法在某些平台上运行的测试功能
3)当前的外部资源不可用时跳过(如果测试数据是从数据库中取到的,连接数据库的功能如果返回结果未成功就不执行,跳过,因为执行也都报错)
4)在某些版本中执行,其他版本中跳过
使用方法
1)使用跳过装饰器,并传递一个可选的原因
@pytest.mark.skip(reason="no way of currently testing this") def test_the_unknown(): ...
2)pytest.skip(reason):在测试执行或设置期间强制跳过
def test_function(): if not valid_config(): pytest.skip("unsupported configuration")
3)pytest.skip(reason,allow_module_level=True):跳过整个模块级别
import pytest if not pytest.config.getoption("--custom-flag"): pytest.skip("--custom-flag is missing, skipping tests", allow_module_level=True)
skipIf跳过用例(有条件跳过)
1)装饰器(标记测试的实例在python3.6之前的解释器上运行时要跳过的函数)
import sys @pytest.mark.skipif(sys.version_info < (3,6), reason="requires python3.6 or higher") def test_function(): ...
2)模块之间共享skipif标记
# content of test_mymodule.py import mymodule minversion = pytest.mark.skipif(mymodule.__versioninfo__ < (1,1), reason="at least mymodule-1.1 required") @minversion def test_function(): ...
在另一个模块中重复使用它
# test_myothermodule.py from test_mymodule import minversion @minversion def test_anotherfunction(): ...
Skip类或模块
在类中使用skipIf标记,条件为True时,将为该类的每个测试方法生成跳过结果
@pytest.mark.skipif(sys.platform == 'win32', reason="does not run on windows") class TestPosixCalls(object): def test_function(self): "will not be setup or run under 'win32' platform"
如果要跳过模块的所有测试功能,可以在全局级别使用pytestmark名称
# test_module.py pytestmark = pytest.mark.skipif(...)
Xfail(失败)
使用场景
功能测试尚未实施活尚未修复的错误,当测试通过时尽管一级会失败,他是一个xpass,将在测试摘要中报告。
使用方法
1)pytest.xfail(reason=' '):在测试用例中调用,该方法之后的代码不在运行,结果中标记为xfail
import pytest class TestClass(): def test_one(self): print("----------start-----") pytest.xfail(reason="该功能尚未完善") print("test_one方法执行") assert 1==2 def test_two(self): print("test_two方法执行") assert 'o' in 'love' def test_three(self): print("test_three方法执行") assert 3-2==1 if __name__ == '__main__': pytest.main(['-s',"test_xfail1"])
2)@pytest.mark.fail装饰器:期望测试用例是失败的,但是不会影响测试用例的的执行。如果测试用例执行失败的则结果是xfail(不会额外显示出错误信息);如果测试用例执行成功的则结果是xpass。
import pytest class TestClass(): @pytest.mark.xfail def test_one(self): print("test_one方法执行") assert 1==2 def test_two(self): print("test_two方法执行") assert 'o' in 'love' def test_three(self): print("test_three方法执行") assert 3-2==1 if __name__ == '__main__': pytest.main(['-s',"test_xfail1"])
把断言改成正确的,执行结果被标记为xpass。
posted on 2020-01-21 11:32 crystal1126 阅读(591) 评论(0) 编辑 收藏 举报