Django - 用Unitest还是Doctest?
我快要开始我的第三个中型项目了,这次我想(我承认这是我第一次)开始使用单元测试。 不过我不知道该用哪种方法,是单元测试还是文档测试。 这两种方法哪个更有效,或者说初学者应该选择哪种来实现呢? 谢谢!
1 个回答
我个人比较喜欢单元测试,但无论是单元测试还是文档测试,这两种测试方法都很优秀,且在Django中都有很好的支持(详细信息可以查看这里)。简单来说,它们各自有一些优缺点:
单元测试的优点
unittests
可以轻松创建更复杂的测试。如果你的测试需要调用多个辅助函数、进行循环和其他分析,文档测试可能会让你觉得受限。而unittests
就像是在写Python代码——你能在Python中做的事情,在这里都能轻松实现。比如这段代码(这是我之前写的一个单元测试的修改版):def basic_tests(self, cacheclass, outer=10, inner=100, hit_rate=None): c = cacheclass(lambda x: x + 1) for n in xrange(outer): for i in xrange(inner): self.assertEqual(c(i), i + 1) if hit_rate != None: self.assertEqual(c.hit_rate(), hit_rate) def test_single_cache(self): self.basic_tests(SingleCache, outer=10, inner=100, hit_rate=0) sc = SingleCache(lambda x: x + 1) for input in [0, 1, 2, 2, 2, 2, 1, 1, 0, 0]: self.assertEqual(sc(input), input + 1) self.assertEqual(sc.hit_rate(), .5)
我使用basic_tests方法对一个类进行一些测试,然后在一个循环中运行断言。虽然在文档测试中也可以做到这一点,但需要花费很多心思——文档测试最适合检查特定函数调用是否返回正确的值。(在Django中尤其如此,因为它有很棒的单元测试工具(见
django.test.client
)。文档测试可能会让你的代码变得杂乱。当我写一个类或方法时,我会在文档字符串中写下足够的说明,以便清楚地表达这个方法的作用。但如果你的文档字符串超过20行,你的代码中可能会有和代码一样多的文档。这会增加阅读和编辑的难度(我最喜欢Python作为编程语言的一点就是它的简洁性)。
文档测试的优点
你的测试与特定的类和方法关联。这意味着如果一个测试失败,你立刻就知道是哪个类和方法出问题了。你还可以使用工具来确定你的测试覆盖了多少类。(当然,如果你想让一个测试覆盖代码的多个部分,这也可能会有限制)。
你的测试就在代码旁边,这样更容易保持同步。当我对一个类或方法进行修改时,我常常会忘记相应地修改测试用例(当然,当我运行测试时,很快就会被提醒)。把文档测试放在方法声明和代码旁边,这样就很方便了。
测试可以作为一种文档。查看你代码的人可以直接看到如何调用和使用每个方法的示例。
总结:我确实更喜欢单元测试,但两者都有很好的理由支持。