将Django的系统检查纳入单元测试套件?

时间:2017-02-24 19:11:28

标签: python django unit-testing testing

我最近在我们的暂存环境中部署了一些损坏的代码。新代码失败Django's system checks(下面再现错误消息,但这个问题更为通用)。我们的单元测试套件运行得很干净。我的问题是:在部署代码之前,确保系统检查运行的正确方法是什么?

最初我猜测测试能够在不执行系统检查的情况下运行,因为我们使用pytest而不是Django的测试运行器。但是,添加一个简单的测试并调用manage.py test表明Django测试运行器也可以在不执行系统检查的情况下运行。

我的一个想法是在我们的构建管道中运行manage.py check命令,并且在非零返回值上使构建失败。这种方法的缺点是它会在提交代码之前引入另一个开发人员步骤(例如,除了运行单元测试套件外,还要记住运行manage.py check。)

另一个想法是添加一个运行系统检查的单元测试。这似乎在技术上是可行的,但它是否与Django的系统检查框架的目的和设计一致?

我注意到the documentation有一节关于编写自定义检查的测试,但这并不能解决我的要求。我没有看到关于将系统检查纳入Django文档中的测试的其他文档。

错误讯息:

SystemCheckError: System check identified some issues:

ERRORS:
myapp.MyCoolModel.linked_groups: (fields.E304) Reverse accessor for 'MyCoolModel.linked_groups' clashes with reverse accessor for 'MyCoolModel.primary_group'.
    HINT: Add or change a related_name argument to the definition for 'MyCoolModel.linked_groups' or 'MyCoolModel.primary_group'.
myapp.MyCoolModel.primary_group: (fields.E304) Reverse accessor for 'MyCoolModel.primary_group' clashes with reverse accessor for 'MyCoolModel.linked_groups'.
    HINT: Add or change a related_name argument to the definition for 'MyCoolModel.primary_group' or 'MyCoolModel.linked_groups'.

1 个答案:

答案 0 :(得分:1)

根据this ticket,没有运行检查以及测试是在1.8版本中引入的回归,并且最近已经修复。

如上所述,一个简单的解决方案似乎是创建自己的test runner,在call_command('check')的开头插入run_suite()。有关示例,请参阅actual fix