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

3 投票
2 回答
1925 浏览
提问于 2025-04-16 16:39

我之前有一个独立的脚本,用来测试我们数据库里的数据,里面还有一些单元测试。我没有使用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模块文档中也有描述。关于加载测试的其他选项,可以查看文档中的加载和运行测试部分。

撰写回答