Py.test 失败,但 ./manage.py 测试工作正常
Posted
技术标签:
【中文标题】Py.test 失败,但 ./manage.py 测试工作正常【英文标题】:Py.test fails, but ./manage.py tests works fine 【发布时间】:2015-11-05 17:00:49 【问题描述】:我最近接管了一个代码库,我首先添加了 Selenium 测试并转移到 py.test。由于并行性和其他 3rd 方包,我喜欢 py.test,但我注意到 py.test 存在重大问题。
代码库是一个 Django 堆栈(Python 2.7 上的 1.8,pytest-2.6.4,目前没有 x-dist)。
1) py.test 测试比普通的 django 测试套件运行得慢(不是很好,但我可以忍受)
2) 当我通过执行 py.test
将单元测试与 Selenium 测试一起运行时,一些单元测试失败。如果我只使用 py.test 运行单元测试(使用 @skipUnless
装饰器排除),一切正常。当我使用 ./manage.py test
运行 (unittest & selenium) 时,所有测试也运行良好。
py.tests 失败(在使用 unittest 和 selenium 运行时)出现 DoesNotExist: ActionType matching query does not exist.
的奇怪错误。
py.test 运行的测试与普通的 Django 测试套件不同吗?
当我将单元测试与 Selenium 测试一起运行时,有什么建议会失败吗?
Selenium 测试在失败的单元测试之前执行,但它们触及的代码区域非常不同(不同的模块)。
【问题讨论】:
如何定义失败的测试用例? 我认为 django 和 pytest 收集测试用例的方式不同,所以你的问题可能只是测试用例的顺序。检查它们是否以相同的顺序运行,尤其是操纵ActionType
模型的部分,或者如果工作量不大,请尝试设置明确的测试顺序(这不是好的做法,因为测试用例应该是独立的,但您可能会找到它们所在的位置不是)。
【参考方案1】:
我刚刚修复了一个类似的案例。问题是查询未能返回我预期存在的对象。
事实证明它们应该是由信号处理程序创建的。这些处理程序是在导入时在signals.py 中注册的,例如
@receiver(post_save, sender=CustomUser)
def create_email_verification(sender, instance, created, **kwargs):
signals.py 是从各个模块的App configs 导入的。
事实证明,应用程序配置从未加载(由于缺少default_app_config
),但 Django 还是加载了 signals.py。然而,当通过 py.test 运行时,模块没有加载(因为它没有在其他任何地方导入),因此信号处理程序从未注册。
结论:manage.py test
似乎自动导入了一些模块,而 py.test 没有。可能有一些代码(信号处理程序)没有明确导入。
【讨论】:
以上是关于Py.test 失败,但 ./manage.py 测试工作正常的主要内容,如果未能解决你的问题,请参考以下文章
如何查看在 Django 的 manage.py test 命令期间运行了哪些测试
Django:执行manage.py test myApp时,关系“auth_user”已经存在