在Django中,我何时应该使用doctests而不是单元测试?

Bel*_*dez 4 python testing django doctest unit-testing

来自Django文档:

...数据库不会在doctests之间刷新,所以如果你的doctest需要某个状态,你应该考虑刷新数据库或加载一个fixture.

坦率地说,90%的测试目前都是在doctests中完成的.我的一位同事认为这是特殊的.老实说,我做的测试很少,所以我不会假装成为那个领域的大师.

在决定如何测试时,有没有人有他们使用的经验法则?

非SO回答

我的一位同事建议通过单元测试来测试模型函数和约束作为doctests和views.根据经验,这听起来怎么样?

Pau*_*lan 15

随着项目的增长,您会发现单元测试对于测试代码要好得多.

Django项目本身正在将所有doctests转换为unittests(我们将在1.3版本中完成).我们这样做的原因是,在此转换之前,测试套件中的执行顺序有时会导致难以重现错误.有时,一些代码会偶然依赖于以前运行的doctest代码.此外,切换到单元测试可以加快整体测试时间,因为我们可以更清楚地了解清除数据库的方式和时间.

单元测试的另一个优点是它们更容易维护.因为整个测试用例是自包含的,所以您要么编写另一个测试用例,要么修改小的,有针对性的测试函数以适应.

Doctests倾向于通过进化 - 你得到你的小部件的实例,添加绿色毛皮,确保毛皮是绿色,添加4条腿,确保你有4条腿和绿色毛皮,添加拇指,确保你有一个拇指,4条腿和绿色皮毛等...这意味着如果您想在绿色毛发阶段之后立即添加测试,则必须修改以下每个其他测试用例的预期结果.

您不希望进行所有这些重写,因此您最后添加了新测试.然后你添加另一个,然后过了一段时间你的测试是如此无可救药地混乱,你无法弄清楚一个特定的功能是否甚至测试!通过单元测试,由于每个测试都体现了一个特定的,具体的和有限的想法,因此更容易逻辑地重新排序测试,并添加一个不依赖于所有先前测试的新测试.此外,如果您更改add_green_fur()工作方式,则无需修改数十个测试用例结果.

另一个优点是单元测试(编写好的时候)可以准确地告诉您代码失败的位置.Failed: MyWidget.tests.test_green_fur()比"第384行的小部件测试失败"更容易调试,这通常距离实际的故障点数十到数百行.

通常,单元测试是更好的测试方法.

编辑:

为了回应你同事的想法,我恭敬地建议他没有参与一个有很多博士论文的大型项目.模型中的Doctests与视图中的一样糟糕.他们有完全相同的问题(尽管如果有的话,doctests在模型中更糟糕,因为flush它非常昂贵并且绝对有必要进行彻底的doctesting).不要低估运行测试所花费的时间.

另外,除非你有充分的理由这样做,否则不要混合你的测试类型.如果你这样做,你很快就会发现自己加倍测试,或者假设某个功能是在你没有看到的测试套件中进行测试的.

Doctests经常被吹捧为"提供文档",说明代码应该如何工作.这很好,但它不能替代用可靠的内联注释编写可读代码.如果您想要进一步的文档,请单独写出来!

你不能编写好的测试,也可以作为良好的文档.