2011-11-05 25 views
2
之间的区别

如果你是在TDD迭代的中间,你怎么知道哪些测试失败,因为现有的代码是真正的不正确和失败,因为无论是测试本身或功能避风港尚未实施?请不要说,“你只是不在乎,因为你必须解决这两个问题。”我准备好移过那个心态。TDD做法:真正的失败和未执行的功能

我编写测试一般的做法如下:

  • 首先,我建筑师测试套件的总体结构,全部或部分转载。那就是 - 我只会写下测试的名称,提醒我想要实现的功能。我通常(至少在python中)只是从每个测试只有一行开始:self.fail()。通过这种方式,我可以通过列出我认为我想要测试的每个功能 - 比如说,一次11个测试来启用意识流。

  • 其次,我选择一个测试,并实际编写测试逻辑。

  • 第三,运行测试转轮和看到11个故障 - 10,简单地self.fail()和1这是一个真正的AssertionError。

  • 第四,我编写了导致我的测试通过的代码。

  • 第五,运行测试转轮和看到1通和10级的故障。

  • 第六,我转到步骤2

理想的情况下,而不是看到的通行证,失败和异常处理方面的测试,我想有一个第四种可能性:NotImplemented。

这里最好的做法是什么?

+0

这属于程序员.se – Ikke

+2

写入大量的单元测试才能让他们通过是一个巨大的TDD *反*模式 - 所以“最佳做法”是“不要这样做”。当所有测试都通过时,很容易解释测试结果。正如你发现的,当很多测试失败时,解释测试结果并不容易。 (注意:我不是Python开发人员,但是我在其他语言中完成了很多TDD。) –

+0

那么最好的模式是什么?思考一个功能,并在现场为其编写测试?如果这是唯一可接受的TDD模式,我会完全拒绝TDD。我很重视能够以测试名称的形式输出大量未来的单位,然后一次一个地写出测试内容。这是一个非常主流的方法,至少在django社区。但是,使用@expectedFailure修饰器不是AFAIK。 – jMyles

回答

4

许多TDD工具都有PENDING测试和FAILING测试的想法。我认为unittest2也是这样做的。

(我想你怎么做,这是写:

def test_this_thing(self): 
    pass 

...但是这是从内存...

[编辑:在2.7的单元测试,或unittest2,你可以标记试验与@skip,或者@unittest.expectedFailure装饰。See the documentation on this

+0

我想知道更多关于此。这在unittest2文档中并不明显。 – jMyles

+0

我已经用指向文档的指针更新了我的答案,如何执行此操作。希望这可以帮助! – RyanWilcox

1

大多数项目将有一个层次结构(如项目 - >套餐 - >模块 - >类),如果你可以有选择地在任何级别的,或者运行测试的任何项目报告将详细介绍这些部件可以看到状态很清楚。大多数情况下,当整个软件包或类失败时,这是因为它尚未实现。

此外,在许多测试框架可以通过从除去注解/装饰或重命名的方法/函数执行测试禁用单个测试用例。这样做的缺点是没有向您显示实现进度,但如果您决定使用固定且特定的前缀,则可以很容易地将该信息从测试源树中移出。尽管如此,我还是欢迎一个测试框架,除了更通用的测试用例状态代码(如PASS,WARNING和FAILED)之外,这个测试框架确实做出了区分,并且还有NOT_IMPLEMENTED。我想有些人可能会拥有它。

2

我用一张纸来创建一个测试表(暂存器跟踪测试,这样我就不会错过它们)。我希望你不是一次写完所有失败的测试(因为随着每个红绿重构周期的新知识的出现,这可能导致一定程度的抖动)。

要将测试标记为TO-DO或未实施,您还可以将该测试标记为[Ignore("PENDING")][Ignore("TODO")]的等效项。例如,NUnit会测试黄色而不是失败。所以红色意味着测试失败,黄色意味着TODO。

0

我现在也意识到unittest.expectedFailure装饰完成的功能全等我的需求。我以前一直以为这个装饰更适用于需要证书测试在测试运行的生产环境中可能不存在的环境条件,但在这种情况下它也是有意义的。

+0

我对这个解决方案非常满意。除非有任何重大异议,否则我将其标记为正确。 – jMyles