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”已经存在

在 Python/Django 中,如何配置默认测试设置?

python manage.py migrate 登陆错误

Manage.py migrate 在第 14 步“提供数据库”的 Heroku python“入门指南”中失败

从 Django 1.6 升级到 1.9:python manage.py migrate 失败