2011-04-29 116 views
2

我曾经有一个单独的脚本和一些单元测试来测试我们数据库中的数据。我没有使用内置的Django测试工具,因为这会创建一个空的测试数据库,这不是我想要的。从自定义管理命令运行Django单元测试

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

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

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

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

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

如何从定制的Django管理命令中做同样的事情(运行一些测试套件)?

回答

2

我很抱歉没有搜索的答案足够长的时间前问,但是我发现在另一个答案#1的解决了这个问题自己:

本质,而不是unittest.main()可以使用下面的代码:

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

这将加载指定Te中的所有测试stCaseClass。如果要加载当前模块中的所有测试中,创造了一套这样将有助于:

suite = TestLoader().loadTestsFromName(__name__) 

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

1

您可能希望通过fixtures指定启动数据库的内容。它会为特定的测试加载数据库的上下文。你可以采取数据库的快照与

$ ./manage.py dumpdata my_app > fixtures/my_pre_test_db.json` 

现在,在你的单元测试,你就会有这样的事情:

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

    def testThisFeature(self): 
     ... 
+1

谢谢你的职位。但在我的情况下,这不会是一个解决方案,因为我们的数据库由数百万行组成。如果不是几个小时,填充数据库将需要几分钟的时间。 – 2011-05-06 08:44:49

相关问题