Django - 单元测试与Doctest?

时间:2012-01-11 06:40:54

标签: python django unit-testing doctest

我即将开始我的第三个中型项目,并希望(我生命中的第一次,我承认)开始使用单元测试。 我不知道,使用哪种方法,unitests或doctests。 哪种方法最有效,或者初学者应该选择哪种方法? 感谢

1 个答案:

答案 0 :(得分:9)

我碰巧更喜欢单元测试,但两者都是优秀且完善的测试方法,两者都得到了Django的良好支持(详见here)。简而言之,每个都有一些关键的优点和缺点:

单元测试的优点

  • unittests允许轻松创建更复杂的测试。如果您的测试涉及调用多个辅助函数,迭代和其他分析,那么doctests会感觉有限。另一方面,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方法对类运行一些测试,然后在for循环中运行一个断言。在doctests中有很多方法可以做到这一点,但它们需要大量的思考 - 教师最好检查对函数的特定单独调用是否返回它们应该的值。 (在Django中尤其如此,它具有出色的单元测试工具(参见django.test.client)。

  • doctests会使代码混乱。当我编写类或方法时,我会在文档字符串中添加尽可能多的文档,以便明确该方法的作用。但是,如果您的文档字符串长度超过20行,那么您最终可以在代码中拥有尽可能多的文档。这增加了阅读和编辑的难度(我最喜欢的一个关于Python作为编程语言的东西是它的紧凑性)。

文档字符串的优点

  • 您的测试与特定的类和方法相关联。这意味着如果测试失败,您会立即知道哪个类和方法失败。您还可以使用工具来确定跨类的测试覆盖率。 (当然,如果您希望测试覆盖代码的许多不同部分,这也可能会受到限制。)

  • 您的测试就在代码旁边,这意味着它们更容易保持同步。当我对类或方法进行更改时,我经常忘记进行相应的更改对于测试用例(当然,当我运行它时,我很快就会被提醒)。将doctests放在方法声明和代码旁边可以很容易。

  • 测试用作一种文档。查看代码的人可以预先包含如何调用和使用每种方法的示例。

结论:我当然更喜欢单元测试,但是有很好的例子。