我目前正在使用pytest来自动化我的测试套件。我的测试分布在几个目录中,如下所示:
|-Root
| |-Dir1
| | |-Test1
| | |-Test2
| | |-Test3
| |-Dir2
| | |-Testa
| | |-Testb
| | |-Testc
| |-Dir3
| | |-TestI
| | |-TestII
| | |-TestIII
我希望能够通过排除其他目录,在一组目录中运行测试。有些目录具有类似的名称,如"testronget_1"one_answers"testronget_1_extended"。我想排除"testronget_1",但保留"testronget_1_extended",因此我需要使用完整路径作为关键字。我注意到,当使用关键字(-k选项)时,pytest不能很好地将目录结构字符串作为参数处理。例如,如果我尝试windows风格的
py.test -k "not (rootdir1 or dir2)"
我得到一个语法错误:
SyntaxError:行连续字符后出现意外字符
另一方面,如果我尝试unix风格的
py.test -k "not (root/dir1 or dir2)"
我得到一个零分割错误:
ZeroDivisionError:整数除法或以零为模
我尝试过的事情包括:将目录字符串用单引号或双引号括起来:
py.test -k "not ('root/dir1' or dir2)"
py.test -k "not ("root/dir1' or dir2)"
使用单独的"-k":
py.test -k "not root/dir1" -k not dir2)
正在使用当前目录".">
py.test -k "not (./root/dir1 or dir2)"
逃离斜杠:
py.test -k "not (root\dir1 or dir2)"
py.test -k "not (root/dir1 or dir2)"
这些都没有解决问题。有人对如何让pytest正确处理我的路径字符串有什么建议吗?
为什么不省去解决方法,只为不同的测试组使用唯一的标记,并使用
py.test -m "not extended"
通过这种方式,测试/目录/模块名称可以更改,并且不会中断。
我正在使用一个非常相似的设置,并且我已经能够重现您所描述的行为(pytest 3.4.0
,python 3.6.4
)。
我找到了一个可能对您有用的变通方法,具体取决于您的确切布局)。基本上,我使用的是and
,而不是路径分隔符。
因此CCD_ 4变为CCD_。如果在root/dir1
下没有更多的dir1
路径元素,那么这两个表达式应该是等效的。
由于包括/
在内的表达式的行为似乎有些不一致(py.test -k root/dir1
按预期工作),因此提交错误可能是有意义的。