通过自定义管理命令运行Django单元测试
我之前有一个独立的脚本,用来测试我们数据库里的数据,里面还有一些单元测试。我没有使用Django自带的测试工具,因为那样会创建一个空的测试数据库,而我并不想要这个。
在那个脚本里,我创建了三个不同的类,都是从unittest.TestCase
继承而来的,里面有一些测试函数,直接执行SQL语句。
现在我希望能直接使用Django的ORM(对象关系映射)。最简单的方法就是通过一个自定义的管理命令来实现,命令是./manage.py datatests
。
在独立脚本中,我可以通过以下函数来调用所有的单元测试:
if __name__ == '__main__':
unittest.main()
这个函数会发现当前文件中的所有测试并运行它们。
那么,我该如何在自定义的Django管理命令中做类似的事情(运行一些测试套件)呢?
2 个回答
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):
...
2
抱歉我没有在提问前多花点时间搜索答案,不过我在另一个StackOverflow的回答中找到了这个问题的解决办法:
简单来说,可以用下面的代码代替 unittest.main()
:
suite = unittest.TestLoader().loadTestsFromTestCase(TestCaseClass)
unittest.TextTestRunner(verbosity=2).run(suite)
这段代码会加载指定的测试类中的所有测试。如果你想加载当前模块中的所有测试,可以这样创建测试套件:
suite = TestLoader().loadTestsFromName(__name__)
上面链接的StackOverflow回答里有一个完整的示例。此外,基本示例部分在unittest模块文档中也有描述。关于加载测试的其他选项,可以查看文档中的加载和运行测试部分。