Pytest----如何修改Pytest默认的用例发现规则

网友投稿 826 2022-10-27

Pytest----如何修改Pytest默认的用例发现规则

Pytest----如何修改Pytest默认的用例发现规则

一、命令行使用ignore参数

比如目录结构如下

tests/|-- example| |-- test_example_01.py| |-- test_example_02.py| '-- test_example_03.py|-- foobar| |-- test_foobar_01.py| |-- test_foobar_02.py| '-- test_foobar_03.py'-- hello '-- world |-- test_world_01.py |-- test_world_02.py '-- test_world_03.py

使用pytest --ignore=tests/foobar/test_foobar_03.py --ignore=tests/hello/ ,可以使用多个ignore参数去忽略,执行结果如下,可以看到tests/foobar/test_foobar_03.py 和hello目录下的都没有执行

$ pytest --ignore=foobar/test_foobar_03.py --ignore=hello/========================================================================= test session starts ==========================================================================platform win32 -- Python 3.9.6, pytest-6.2.5, py-1.10.0, pluggy-1.0.0rootdir: G:\src\blog\testsplugins: allure-pytest-2.9.43, caterpillar-pytest-0.0.2, forked-1.3.0, rerunfailures-10.1, xdist-2.3.0collected 5 items example\test_example_01.py . [ 20%]example\test_example_02.py . [ 40%]example\test_example_03.py . [ 60%]foobar\test_foobar_01.py . [ 80%]foobar\test_foobar_02.py . [100%]========================================================================== 5 passed in 0.05s ===========================================================================

二、Unix Shell风格的命令行使用ignore-glob参数支持正则

比如目录结构如下

tests/|-- example| |-- test_example_01.py| |-- test_example_02.py| '-- test_example_03.py|-- foobar| |-- test_foobar_01.py| |-- test_foobar_02.py| '-- test_foobar_03.py'-- hello '-- world |-- test_world_01.py |-- test_world_02.py '-- test_world_03.py

在Unix shell风格下,使用–ignore-glob参数,可以通过正则匹配的方式忽略用例,如下,以“_01.py”结尾的用例均已被忽略

$ pytest --ignore-glob='*_01.py'============================= test session starts =============================platform win32 -- Python 3.9.6, pytest-6.2.5, py-1.10.0, pluggy-1.0.0rootdir: G:\src\blog\testsplugins: allure-pytest-2.9.43, caterpillar-pytest-0.0.2, forked-1.3.0, rerunfailures-10.1, xdist-2.3.0collected 6 itemsexample\test_example_02.py . [ 16%]example\test_example_03.py . [ 33%]foobar\test_foobar_02.py . [ 50%]foobar\test_foobar_03.py . [ 66%]hello\workd\test_world_02.py . [ 83%]hello\workd\test_world_03.py . [100%]============================== 6 passed in 0.06s ==============================

三、命令行使用deselect参数

比如目录结构如下

tests/|-- example| |-- test_example_01.py| |-- test_example_02.py| '-- test_example_03.py|-- foobar| |-- test_foobar_01.py| |-- test_foobar_02.py| '-- test_foobar_03.py'-- hello '-- world |-- test_world_01.py |-- test_world_02.py '-- test_world_03.py

如下,使用pytest --deselect foobar/test_foobar_01.py --deselect foobar/test_foobar_03.py 命令,即可不执行test_foobar_01.py和test_foobar_03.py 文件的用例,如果忽略多个可以使用多个–deselect参数

$ pytest --deselect foobar/test_foobar_01.py --deselect foobar/test_foobar_03.py============================= test session starts =============================platform win32 -- Python 3.9.6, pytest-6.2.5, py-1.10.0, pluggy-1.0.0rootdir: G:\src\blog\testsplugins: allure-pytest-2.9.43, caterpillar-pytest-0.0.2, forked-1.3.0, rerunfailures-10.1, xdist-2.3.0collected 9 items / 2 deselected / 7 selectedexample\test_example_01.py . [ 14%]example\test_example_02.py . [ 28%]example\test_example_03.py . [ 42%]foobar\test_foobar_02.py . [ 57%]hello\workd\test_world_01.py . [ 71%]hello\workd\test_world_02.py . [ 85%]hello\workd\test_world_03.py . [100%]======================= 7 passed, 2 deselected in 0.07s =======================

四、设置重复路径执行多次

比如目录结构如下

tests/|-- foobar| |-- test_foobar_01.py| |-- test_foobar_02.py|

当指定的重复路径为文件级别时,默认支持执行多次,如下,执行了两次

$ pytest foobar/test_foobar_01.py foobar/test_foobar_01.py============================= test session starts =============================platform win32 -- Python 3.9.6, pytest-6.2.5, py-1.10.0, pluggy-1.0.0rootdir: G:\src\blog\testsplugins: allure-pytest-2.9.43, caterpillar-pytest-0.0.2, forked-1.3.0, rerunfailures-10.1, xdist-2.3.0collected 2 itemsfoobar\test_foobar_01.py ..============================== 2 passed in 0.02s ==============================

指定的重复路径为目录时,默认只会执行一次,如下,只执行了一次

$ pytest foobar foobar============================= test session starts =============================platform win32 -- Python 3.9.6, pytest-6.2.5, py-1.10.0, pluggy-1.0.0rootdir: G:\src\blog\testsplugins: allure-pytest-2.9.43, caterpillar-pytest-0.0.2, forked-1.3.0, rerunfailures-10.1, xdist-2.3.0collected 3 itemsfoobar\test_foobar_01.py . [ 33%]foobar\test_foobar_02.py . [ 66%]foobar\test_foobar_03.py . [100%]============================== 3 passed in 0.03s ==============================

当指定的路径为目录时,如果希望也执行多次,需要使用 --keep-duplicates参数,如下目录中的用例执行了2次

$ pytest foobar foobar --keep-duplicates============================= test session starts =============================platform win32 -- Python 3.9.6, pytest-6.2.5, py-1.10.0, pluggy-1.0.0rootdir: G:\src\blog\testsplugins: allure-pytest-2.9.43, caterpillar-pytest-0.0.2, forked-1.3.0, rerunfailures-10.1, xdist-2.3.0collected 6 itemsfoobar\test_foobar_01.py . [ 16%]foobar\test_foobar_02.py . [ 33%]foobar\test_foobar_03.py . [ 50%]foobar\test_foobar_01.py . [ 50%]foobar\test_foobar_02.py . [ 50%]foobar\test_foobar_03.py .============================== 6 passed in 0.04s ==============================

五、通过pytest.ini设置用例的搜索目录

比如目录结构如下,设置用例搜索目录可以在pytest.ini文件中进行设置

tests/|-- pytest.ini|-- example| |-- test_example_01.py| |-- test_example_02.py| '-- test_example_03.py|-- foobar| |-- test_foobar_01.py| |-- test_foobar_02.py| '-- test_foobar_03.py'-- hello '-- world |-- test_world_01.py |-- test_world_02.py '-- test_world_03.py

在pytest.ini中可以通过testpaths指定搜索目录

如pytest.ini内容如下

[pytest]testpaths=foobar hello

执行结果如下,即指定了当执行pytest命令的时候只会去搜索foobar和hello目录

$ pytest============================= test session starts =============================platform win32 -- Python 3.9.6, pytest-6.2.5, py-1.10.0, pluggy-1.0.0rootdir: G:\src\blog\tests, configfile: pytest.ini, testpaths: foobar, helloplugins: allure-pytest-2.9.43, caterpillar-pytest-0.0.2, forked-1.3.0, rerunfailures-10.1, xdist-2.3.0collected 6 itemsfoobar\test_foobar_01.py . [ 16%]foobar\test_foobar_02.py . [ 33%]foobar\test_foobar_03.py . [ 50%]hello\workd\test_world_01.py . [ 66%]hello\workd\test_world_02.py . [ 83%]hello\workd\test_world_03.py . [100%]============================== 6 passed in 0.05s ==============================

在pytest.ini文件中可以通过norecursedirs指定目录不搜索

pytest.ini内容如下:

[pytest]norecursedirs=foobar hello

执行结果如下,明显foobar和hello目录都没有搜索

$ pytest============================= test session starts =============================platform win32 -- Python 3.9.6, pytest-6.2.5, py-1.10.0, pluggy-1.0.0rootdir: G:\src\blog\tests, configfile: pytest.iniplugins: allure-pytest-2.9.43, caterpillar-pytest-0.0.2, forked-1.3.0, rerunfaiures-10.1, xdist-2.3.0collected 3 itemsexample\test_example_01.py . [ 33%]example\test_example_02.py . [ 66%]example\test_example_03.py . [100%]============================== 3 passed in 0.04s ==============================

六、自定义测试文件测试类测试函数的命名规则

[pytest]python_files = check_*.pypython_classes = Checkpython_functions = check_*

编写check_demo.py测试文件如下:

def check_func(): assert 1==1class CheckDemo(): def check_func2(self): assert 1==1

执行结果如下,可以看出这里因为pytest.ini重新定义了规则,因此这里的check_demo.py以及CheckDemo类和测试函数才会被pytest识别

$ pytest -v============================= test session starts =============================platform win32 -- Python 3.9.6, pytest-6.2.5, py-1.10.0, pluggy-1.0.0 -- D:\python39\python.execachedir: .pytest_cacherootdir: G:\src\blog\tests\demo, configfile: pytest.iniplugins: allure-pytest-2.9.43, caterpillar-pytest-0.0.2, forked-1.3.0, rerunfailures-10.1, xdist-2.3.0collecting ... collected 2 itemscheck_demo.py::check_func PASSED [ 50%]check_demo.py::CheckDemo::check_func2 PASSED [100%]============================== 2 passed in 0.02s ==============================

七、自定义pytest命令

所谓自定义pytest命令其实是在一些场景下,比如执行pytest的命令的时候,希望都带有-v -s参数执行,这样每次执行命令都要输入这个参数,这时候就感觉有那么一点点的麻烦了,此时就可以使用pytest.ini来自定义pytest命令,类似与linux命令中的alias命令,将新的pytest命令定义为pytest -s -v,这样在执行pytest命令的时候,不需要加参数则默认就把-s -v两个参数带上了

比如目录结构如下

tests/|-- pytest.ini|-- example| |-- test_example_01.py| |-- test_example_02.py| '-- test_example_03.py|-- foobar| |-- test_foobar_01.py| |-- test_foobar_02.py| '-- test_foobar_03.py'-- hello '-- world |-- test_world_01.py |-- test_world_02.py '-- test_world_03.py

pytest.ini如下:

[pytest]addopts=-s -v

其他测试文件中的内容均为:

def test_example(): assert 1==1

此时,在tests目录下执行pytest命令,如下,虽然仅执行的pytest命令,从结果可以看出其实是将-s -v的参数已经带上了

$ pytest============================= test session starts =============================platform win32 -- Python 3.9.6, pytest-6.2.5, py-1.10.0, pluggy-1.0.0 -- D:\python39\python.execachedir: .pytest_cachehypothesis profile 'default' -> database=DirectoryBasedExampleDatabase('G:\\src\\blog\\tests\\.hypothesis\\examples')rootdir: G:\src\blog\tests, configfile: pytest.iniplugins: allure-pytest-2.9.43, caterpillar-pytest-0.0.2, hypothesis-6.31.6, forked-1.3.0, rerunfailures-10.1, xdist-2.3.0collecting ... collected 9 itemsexample/test_example_01.py::test_example PASSEDexample/test_example_02.py::test_example PASSEDexample/test_example_03.py::test_example PASSEDfoobar/test_foobar_01.py::test_example PASSEDfoobar/test_foobar_02.py::test_example PASSEDfoobar/test_foobar_03.py::test_example PASSEDhello/workd/test_world_01.py::test_example PASSEDhello/workd/test_world_02.py::test_example PASSEDhello/workd/test_world_03.py::test_example PASSED============================== 9 passed in 0.22s ==============================

八、查看用例集合树

有事需要查看有多少用例,但是又不想通过执行所有用例,此时可以使用–collect-only参数

执行pytest --collect-only 查看当前目录下有多少用例

$ pytest --collect-only============================= test session starts =============================platform win32 -- Python 3.9.6, pytest-6.2.5, py-1.10.0, pluggy-1.0.0 -- D:\python39\python.execachedir: .pytest_cachehypothesis profile 'default' -> database=DirectoryBasedExampleDatabase('G:\\src\\blog\\tests\\.hypothesis\\examples')rootdir: G:\src\blog\tests, configfile: pytest.iniplugins: allure-pytest-2.9.43, caterpillar-pytest-0.0.2, hypothesis-6.31.6, forked-1.3.0, rerunfailures-10.1, xdist-2.3.0collecting ... collected 9 items ========================= 9 tests collected in 0.22s ==========================

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:AVG.js - 面向未来的文字冒险游戏框架
下一篇:使用Turnstile实现Perfect Web框架的身份验证
相关文章

 发表评论

暂时没有评论,来抢沙发吧~