从自定义管理命令运行Django单元测试

时间:2011-04-29 12:25:50

标签: python django unit-testing testing

我曾经有一个带有一些单元测试的独立脚本来测试数据库中的数据。我没有使用内置的Django测试工具,因为这会创建一个空的测试数据库,这不是我想要的。

在该脚本中,我创建了三个扩展unittest.TestCase的不同类,其中包含一些直接执行SQL语句的测试函数。

现在我希望能够直接访问Django ORM。最简单的方法是通过自定义管理commant(./manage.py datatests)。

在独立脚本中,我可以通过以下函数调用所有单元测试:

if __name__ == '__main__':
    unittest.main()

它会发现当前文件中的所有测试并运行它们。

如何在自定义Django管理命令中执行相同的操作(运行一些测试套件)?

2 个答案:

答案 0 :(得分:2)

我很抱歉在询问之前没有长时间搜索答案,但我在另一个Stackoverflow答案中找到了解决这个问题的方法:

基本上,可以使用以下代码代替unittest.main()

suite = unittest.TestLoader().loadTestsFromTestCase(TestCaseClass)
unittest.TextTestRunner(verbosity=2).run(suite)

这将加载指定TestCaseClass中的所有测试。如果要在当前模块中加载所有测试,以这种方式创建套件将有所帮助:

suite = TestLoader().loadTestsFromName(__name__)

上面链接的Stackoverflow答案包含一个完整的示例。此外,unittest module docs基本示例部分描述了同样的事情。有关加载测试的其他选项,请参阅docs中的加载和运行测试

答案 1 :(得分:1)

您可能希望通过fixtures指定启动数据库的内容。它将为特定测试加载db的上下文。你可以用

拍摄db的快照
$ ./manage.py dumpdata my_app > fixtures/my_pre_test_db.json`

现在,在您的单元测试中,您将拥有以下内容:

class MyTestCase(TestCase):
    fixtures = ['fixtures/my_pre_test_db.json']

    def testThisFeature(self):
        ...