我和团队已经完成了一些项目,其中我们采用了单元测试,对于我们的代码…但是代码先进行单元测试。在开发过程的某个时候,首先编写测试,然后编写代码,使我们更加体验TDD风格,这是很自然的。
现在我们想做下一步,尝试从一开始就用TDD开始一个新的项目。这里的问题…从哪里开始?当我没有代码的时候,我会写什么第一个测试?
假设有一个上下文想想,我必须开发一个互联网应用程序,以文档为中心,有一点工作流程和别的东西。
但是让我们从一开始就开始:首先,我想创建一个简单的页面,其中列出了存储在数据库表中的所有文档(元数据)(很简单,呃)。
哪个是我写的第一个测试?让我们说我正在使用Hibernate来访问数据库…我会测试这个ipathetical方法getAllDocuments()?但是我应该用一个模拟对象替代Hibernate吗?那么我在测试什么?
我在这里有一点混乱,而且getAlDocuments()可能永远不会是一个生产方法…所有的文档集合将被排序和过滤的东西…它有意义吗?
任何建议将不胜感激
编辑:
在阅读你的答案(和类似的线程在http://programmers.stackexchange.com)后,我有一个更好的视野的TDD,但我仍然有一个dubt。
我总是认为TDD是关于单元测试的第一…从来没有想过端对端测试。
但是让我问道:TDD说你必须写一个测试,看看一个编译错误;那么你创建类和方法,你会得到测试失败;然后实现该方法并通过测试。在测试失败之前,您不能编写代码;在所有测试通过之前,您不能再写另一个测试。我在这里吗
我如何进行端到端测试作为我的第一个测试?我应该写所有的代码,在所有的层,让该测试通过。但是,我将有一堆课程和方法都通过我的端到端测试进行测试(不应该将其称为集成测试)?这意味着我不再需要单元测试,因为我已经有一个覆盖我的代码的测试。而且我不能写出一个已经通过的测试,而是针对TDD原则。
请帮助我了解这一步
您正在开始一个新项目,您可能有一组功能。您应该有一些验收标准,您将要实现的功能。这些标准可以定义您的顶级测试。我们开始采用端到端测试(有时候这可能很难,因为它涉及不存在的UI)或这些接受标准的集成测试。一旦测试失败,您将继续实施与大型测试相关的功能,但每个功能将再次通过集成或单元测试来驱动。如果所有顶级测试都通过,该功能将完成。
如果您跳过大型测试(端到端,集成),您将开发一套经过良好测试的单元,这些单元在集成在一起时不起作用,或者由于单元测试定义的本地范围,您的架构将不会很好。集成和端到端测试为您提供全球范围。
这在书Growing Object-Oriented Software Guided by Tests中用大例子(Java)进行了描述。