Django - 用Unitest还是Doctest?

4 投票
1 回答
698 浏览
提问于 2025-04-17 09:59

我快要开始我的第三个中型项目了,这次我想(我承认这是我第一次)开始使用单元测试。 不过我不知道该用哪种方法,是单元测试还是文档测试。 这两种方法哪个更有效,或者说初学者应该选择哪种来实现呢? 谢谢!

1 个回答

9

我个人比较喜欢单元测试,但无论是单元测试还是文档测试,这两种测试方法都很优秀,且在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作为编程语言的一点就是它的简洁性)。

文档测试的优点

  • 你的测试与特定的类和方法关联。这意味着如果一个测试失败,你立刻就知道是哪个类和方法出问题了。你还可以使用工具来确定你的测试覆盖了多少类。(当然,如果你想让一个测试覆盖代码的多个部分,这也可能会有限制)。

  • 你的测试就在代码旁边,这样更容易保持同步。当我对一个类或方法进行修改时,我常常会忘记相应地修改测试用例(当然,当我运行测试时,很快就会被提醒)。把文档测试放在方法声明和代码旁边,这样就很方便了。

  • 测试可以作为一种文档。查看你代码的人可以直接看到如何调用和使用每个方法的示例。

总结:我确实更喜欢单元测试,但两者都有很好的理由支持。

撰写回答