运行下test_module2.py:
test_module2.py [100%] ======================== 1 passed, 1 skipped in 0.08s =========================s Skipped: 版本4.0以下就跳过执行 . Process finished with exit code 0 四、跳过类或模块下的所有测试函数 1. 跳过类下的所有测试函数如果把skipif放在类上,这个类下面的所有测试函数都会跳过。
import pytest import sys version_judge = pytest.mark.skipif( sys.version_info < (4, 0), reason="版本4.0以下就跳过执行" ) @version_judge class TestDemo(): def test_the_unknown2(self): ... def test_the_unknown3(self): ... def test_the_unknown1(): ... if __name__ == "__main__": pytest.main(["-s", '-r' "test_module1.py"])运行结果,类TestDemo下的2个测试方法都会被跳过。
test_module1.py [100%] ======================== 1 passed, 2 skipped in 0.09s =========================s Skipped: 版本4.0以下就跳过执行 s Skipped: 版本4.0以下就跳过执行 . Process finished with exit code 0 2.跳过模块下的所有测试函数如果想跳过模块的所有测试函数,可以使用全局变量pytestmark:
import pytest import sys pytestmark = pytest.mark.skipif(sys.version_info < (4, 0), reason="版本4.0以下就跳过执行") class TestDemo(): def test_the_unknown2(self): ... def test_the_unknown3(self): ... def test_the_unknown1(): ... if __name__ == "__main__": pytest.main(["-s", '-r' "test_module1.py"])运行,模块下的3个测试都会被跳过
test_module1.py [100%] ============================= 3 skipped in 0.02s ==============================s Skipped: 版本4.0以下就跳过执行 s Skipped: 版本4.0以下就跳过执行 s Skipped: 版本4.0以下就跳过执行 Process finished with exit code 0另外,如果多个skipif装饰器应用于同一个测试函数,只要任何一个条件为真,该函数将被跳过。
五、跳过文件或目录有时可能需要跳过一整个文件或目录。例如,有文件里的代码你不想去执行。在这种情况下,必须从pytest搜集到的集合中排除文件和目录。
有关更多信息,请参阅,后续看情况单独分享。
当有些依赖的包导入失败的时候,可以通过pytest.importorskip这个函数来跳过。同样,可以用在模块级别,fixture函数或者测试函数里。
import pytest # docutils = pytest.importorskip("docutils") class TestDemo(): def test_the_unknown2(self): ... def test_the_unknown3(self): pytest.importorskip("docutils") def test_the_unknown1(): ... if __name__ == "__main__": pytest.main(["-s", '-r' "test_module1.py"])运行结果,应该是跳过一个,执行2个:
test_module1.py [100%] ======================== 2 passed, 1 skipped in 0.09s =========================.s Skipped: could not import 'docutils': No module named 'docutils' . Process finished with exit code 0代码里的docutils是一个第三方库,你也可以根据库的版本号跳过:
docutils = pytest.importorskip("docutils", minversion="0.3")版本将从指定模块的__version__属性中读取,如果不符合条件,也会跳过。
七、总结
无条件跳过模块中的所有测试
pytestmark = pytest.mark.skip("all tests still WIP")基于某些条件跳过模块中的所有测试
pytestmark = pytest.mark.skipif(sys.platform == "win32", reason="tests for linux only")如果缺少某些导入,则跳过模块中的所有测试
pexpect = pytest.importorskip("pexpect")