配置Pytest发现以忽略类名

时间:2014-07-07 15:59:28

标签: python testing pytest

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忽略某个名称的测试?

4 个答案:

答案 0 :(得分:3)

这是一个较旧的问题,但它似乎是stackoverflow上唯一相关的命中,所以我想我会留下替代答案给后人。

另一种解决方法是禁用所有基于类名的发现,并仅依赖于子类发现 。换句话说:

在您的配置文件中:(setup.cfgpytest.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

基于:https://github.com/pytest-dev/pytest/issues/1879

答案 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