指定外部pytest.ini调用pytest.main时,仅首个文件生效测试名称模式
我希望通过以下方式调用pytest.main:
pytest.main(['-c','path\pytest.ini', 'tests\testfile1::src_func1','tests\testfile2::src_func2'])
需求是把pytest.ini放在tests目录外,同时调用tests目录下不同文件里的多个测试用例。我在pytest.ini里定义了测试名称匹配模式为src_*。
但碰到的问题是:这个src_*模式只对紧跟在'-c','path/pytest.ini'后面的第一个文件tests\testfile1::src_func1生效,对第二个文件tests\testfile2::src_func2不起作用,导致testfile2里的测试用例找不到。
有意思的是,当pytest.ini放在tests目录里时,用下面的方式调用:
pytest.main(['tests\testfile1::src_func1','tests\testfile2::src_func2'])
两个文件里的测试用例都能正常识别,src_*模式工作符合预期。
请问为啥指定外部pytest.ini时,第二个文件没法应用这个src_*匹配模式?我已经调试过pytest也查了资料,知道-c参数是用来指定外部pytest.ini的,但实际用起来没达到预期,可能用法错了。
pytest的参数解析逻辑里,-c属于全局配置参数,但当你在pytest.main的参数列表里直接指定多个带::的测试节点时,后面的节点会被pytest当成独立的目标,这时全局的名称匹配规则(比如你在pytest.ini里设的src_*)不会应用到这些后续节点上——因为pytest认为你已经明确指定了要运行的测试对象,会跳过名称匹配的环节。
而当pytest.ini在tests目录里时,pytest加载测试目录时会自动读取这个配置,所有指定的测试节点都会先经过配置里的名称匹配规则过滤,所以两个文件的测试用例都能被识别。
有两种简单可行的解决办法:
用
-k参数替代配置里的名称匹配
如果需要指定外部配置文件,同时筛选名称为src_*的测试用例,可以把匹配规则通过-k参数传递,不用依赖pytest.ini里的配置:pytest.main(['-c','path\pytest.ini', '-k', 'src_', 'tests\testfile1', 'tests\testfile2'])这里
-k src_会匹配所有名称包含src_的测试用例,同时指定两个测试文件,所有符合条件的用例都会被执行。把测试文件作为整体指定
不要逐个指定带::的测试节点,直接指定tests目录或者多个测试文件,让pytest通过配置里的src_*规则自动匹配:pytest.main(['-c','path\pytest.ini', 'tests\testfile1', 'tests\testfile2'])这种方式下,pytest会读取外部配置的名称匹配规则,对两个文件里的所有测试用例进行过滤,符合
src_*的用例会被执行。
内容的提问来源于stack exchange,提问作者Seafood

