如何在pytest中仅运行integ目录测试并忽略unit目录?
问题的核心在于你的setup.cfg里已经配置了addopts = --verbose unit,这意味着每次运行pytest时,默认都会把unit目录作为测试目标之一。当你在命令行添加integ目录并加上--ignore=unit时,pytest实际上是同时收到了两个测试目标(unit和integ)以及忽略unit的指令,参数合并逻辑导致unit目录还是被纳入了执行范围。
下面给你几个可行的解决办法:
1. 临时覆盖配置文件中的默认测试目标
最直接的方式是在命令行中覆盖setup.cfg里的addopts,去掉默认的unit目录,只保留--verbose,然后指定integ目录:
pytest -o "addopts=--verbose" integ
这里的-o选项用来临时修改pytest的配置参数,相当于告诉pytest:这次运行不要用配置里的--verbose unit,改用--verbose,然后只跑integ目录的测试。
2. 明确指定运行目录并正确忽略unit
如果不想修改addopts,可以调整参数顺序确保--ignore=unit生效。另外,你之前用--ignore=unit/*.py报错是因为shell会先尝试展开通配符,若没有匹配到文件就会报错,解决办法是把通配符用引号括起来,让pytest自己解析:
pytest --verbose integ --ignore='unit'
如果确实需要忽略目录下的所有py文件(更推荐直接忽略目录):
pytest --verbose integ --ignore='unit/*.py'
3. 为集成测试单独创建配置文件
如果你经常需要运行集成测试,可以新建一个pytest-integ.cfg文件,内容如下:
[tool:pytest] addopts = --verbose integ
之后运行集成测试时直接指定这个配置文件:
pytest -c pytest-integ.cfg
这样就不用每次敲长命令,也不会和默认的unit测试配置冲突。
4. 极端方式:忽略所有配置文件
如果你确定不需要配置文件里的其他设置,可以用--no-config选项完全绕过配置:
pytest --no-config --verbose integ
这个方法比较极端,仅当你不需要配置中的其他参数时使用。
内容的提问来源于stack exchange,提问作者Manthan Jamdagni

