Pytest的默认发现规则将导入所有没有Test
的{{1}}开始的类。我有一种情况,导致导入不正确的类。
我正在测试一个使用Factory Boy的django项目。 http://factoryboy.readthedocs.org/en/latest/构建名为__init__()
的Django模型。
Testimonial
此问题是class TestimonialFactory(factory.Factory):
class Meta:
model = models.Testimonial
没有factory.Factory
。所以py.test看到__init__()
imonials并尝试运行。这反过来又试图在pytest发现阶段将记录插入数据库(随后出现欢闹和失败)。
我已经通过更改pytest.ini来查找测试类来开始使用Check而不是Test来攻击解决方法:
Test
这不是我想要的。有没有办法明确告诉py.test忽略某个名称的测试?
答案 0 :(得分:3)
这是一个较旧的问题,但它似乎是stackoverflow上唯一相关的命中,所以我想我会留下替代答案给后人。
另一种解决方法是禁用所有基于类名的发现,并仅依赖于子类发现 。换句话说:
在您的配置文件中:(setup.cfg
或pytest.ini
):
[pytest]
python_classes =
在测试文件中:
class TestWillNotBeRun(object):
# Not a subclass of unittest.TestCase, so not collected regardless of name
class TestWillBeRun(unittest.TestCase):
# Still okay to use TestName convention for readability
# It just doesn't actually do anything.
class StillGoingToBeRun(unittest.TestCase):
# Relying on subclassing means *all* subclasses will be picked up, regardless of name
这样做的一个优点是它不需要更改非测试类名称。对于向用户公开这些类的库,可以有充分的理由不重命名。此外,它不需要大量重命名测试类(因为它们现在几乎可以是任何东西)。最后,与基于名称的发现不同,非测试代码不太可能以某种方式成为unittest.TestCase的子类。 (我确信有人有例外。)
缺点是您必须确保所有您的测试类必须是unittest.TestCase
的子类。对于我的所有代码,这已经是真的,所以没有成本。但这并不一定是普遍的。
答案 1 :(得分:3)
这是我使用的一个简单的解决方案,但有一些开销。
class DisablePyTestCollectionMixin(object):
__test__ = False
class TestimonialFactory(DisablePyTestCollectionMixin):
pass
答案 2 :(得分:1)
将所有测试放入以test_
开头的文件中,并将其添加到pytest.ini
:
[pytest]
python_files=test_*.py
这将指示pytest仅在test_*.py
个文件中发现测试。
答案 3 :(得分:1)
您应该使用pytest.ini文件,其类名称与全局匹配。
#pytest.ini file
[pytest]
python_classes = !Test
这将使pytest忽略所有以Test开头的测试类。
此处有更多信息:https://docs.pytest.org/en/latest/example/pythoncollection.html#changing-naming-conventions