何时在新项目中引入单元测试?

时间:2010-01-08 19:53:32

标签: unit-testing tdd agile

首先让我说明没有单元测试的编码只是简单的疯狂。如果没有单元测试,我总是害怕在没有注意的情况下破坏某些东西。所以我都是单元测试,我更喜欢使用TDD

然而,我的问题是;什么时候开始新项目时应该引入单元测试?生活在TDD的精神中,项目的第一个代码行应该是单元测试。然而,无论我多么喜欢TDD给我的模糊感觉,我经常发现当你有没有时从一开始就很难开始进行单元测试。通常我发现在没有测试的情况下“欺骗”和编码更容易,并在我看到项目的进展时引入测试。

人们对此有何看法?我什么时候应该在开始新项目时引入单元测试?

12 个答案:

答案 0 :(得分:5)

您应该可以从单元测试开始。如果您发现很难这样做,那么您可能没有将这些要求分解为原子位,至少在我的经验中如此。

答案 1 :(得分:2)

恕我直言,第一个交付给利益相关者的应该有80%以上的测试覆盖率,第一个可交付成果应该在第一次(可能是第二次)迭代结束时。

除此之外,关于人们如何与TDD理念保持一致,这是个人偏好的问题。

答案 2 :(得分:2)

  • 你应该明确地在新项目中引入TDD - 这样更容易。
  • 告诉他们如何帮助人们不要这样做
  • 每天都有技术领导力树立榜样会产生重大影响。
  • “我们需要80%覆盖率”这样的任意措施不会削减它。为什么不是81%?这完全是关于培养对代码覆盖率的判断感以及值得测试的内容。

你必须真正有兴趣帮助对方并且利用受教育的时刻

每天都有一名学生被TDD大师责骂。他说:“你为什么不进行测试第一次开发?你是开发人员。你应该做开发人员测试!”

这位大师用卷起的报纸袭击了学生,每天都像这样骂学生一年,直到有一天,一位快乐,极端的编程教练出现了。

极端编程教练听到开发人员说“我正在努力解决这个该死的功能,我无法做到这一点。”

教练微笑着说:“再次告诉我你是怎么做到的......”

学生再次举起他的榜样并运行失败的代码。

“当我按下此按钮并将滑块移动到4时,它应该输出42而不是41 !.您认为我应该怎么做?”

快乐的XP教练再次笑了(他做了很多),并说“再次这样做,但这次让我输入......”

在你知道之前,学生和教练一起写了一个TDD考试,但由于学生有动力完成他的工作,他忘了抗拒,并且分散了对敏捷哲学的元讨论。

然后学生说“啊哈!我明白了。这就是我们编写单元测试的原因”

......在那一刻,学生开悟了。 KA清!

- )

答案 3 :(得分:2)

我通常从最重要的功能开始,然后使用从外到内的方法从那里开始。这通常意味着从一些UI开始。

我这样做的方法是创建所需的UI。由于我们通常无法使用TDD开发UI,因此我只需使用所选技术创建View。那里没有测试,但是我将UI连接到一些API(最好使用声明性数据绑定),这就是测试开始的时候。

所以我经常在没有测试的情况下写一个Humble Object,但是当我开始编写一个高于1的Cyclomatic Complexity程度的代码时,我就开始首先编写单元测试。

对于库而言,这意味着有时我甚至在创建SUT库之前创建测试套件库。

答案 4 :(得分:1)

我通常在写完第一个不明显正确的函数后立即编写我的第一个测试用例。例如:

我可以:

class HelloWorld
{

  int value;

  int getValue() { return value; }
}

并没有任何测试。但是一旦我这样做了:

class HelloWorld
{

  int value;

  int getValue() { return value; }

  int doSomething() { blah blah blah }
}

我写了一个测试用例。

答案 5 :(得分:1)

我的模式是我通常首先开始编写一个新项目,而且只要我有一个具有一些功能的类,我就会为它创建一个单元测试。换句话说,我很早就将单元测试项目作为解决方案的一部分。

(我目前没有练习TDD,虽然我确实看到了好处)。

答案 6 :(得分:1)

  

我经常发现“欺骗”更容易   没有测试的代码   开始,并在我做的时候介绍测试   看看项目的进展情况。

所以你处于不知道下一步(或第一次)做什么的状态,你最舒服的动作是编码。这可能不太好。如果您不知道下一步该做什么,那么您应该设计,并使用TDD进行设计,并通过编写测试来表达我们的设计。我认为你应该更严格地练习TDD,看看它带你去哪里;我希望它能够让您编写更少的错误代码并更快地进入流程。我们需要练习任何足以让它舒服的技术,听起来TDD仍然不是100%舒适。

  

你是如何到达卡内基音乐厅的?   练习,兄弟,练习!

答案 7 :(得分:1)

  

然而,无论我多么喜欢TDD给我的模糊感觉,我常常发现很难从一开始就没有任何东西开始进行单元测试。通常我发现在没有测试的情况下从一开始就“欺骗”和编码更容易,并在我看到项目的进展时引入测试。

我发现编写测试有助于实现问题和解决方案,换句话说,设计,我开始编写代码时就开始编写测试。测试有助于了解代码是否有效,它们有时表明创意有多糟糕,它们有助于避免编写不可测试的代码,它们有助于重构。不,真的,我喜欢在早期阶段进行测试,我发现它们有助于了解项目的进展情况:)

答案 8 :(得分:1)

我建议在第一行代码处启动TDD。

TDD对我来说是一种“设计”方法,可以帮助我创建干净且有效的面向对象的代码。当我编写一个测试单元类时,我实际上是在描述对话框我希望用我想要构建的对象。

所以,它实际上有助于我这样做,特别是当我不清楚代码应该做什么时。

正如您所解释的那样,副作用也是在构建的应用程序的镜像上构建一个很好的测试工具。

答案 9 :(得分:1)

  

我经常发现很难开始   从一开始就进行单元测试   当你什么都没有的时候。

我首先对设计有一个大概的了解:我试图设想我可能需要实现那些功能的类。这种设计不一定是最后一种;这只是一个起点。

然后我选择一点功能开始并询问“它属于哪里?”。这给了我将要开始的课程,并询问“我该如何测试它 - 我怎么知道该方法有效?”。我制作了一系列测试并选择最简单的测试;这将是我的第一次测试。

答案 10 :(得分:1)

免责声明:我是一个老派,硬核,瀑布的家伙,而不是TDD(我了解敏捷,X-prog,TDD等等,不想开始宗教战)。

你问何时“介绍”单元测试,但不要定义“介绍”。我读它的方式,你的意思是“开始测试”。

让我们看一下老派......一旦您查看并签署了系统文档,您就可以编写并查看系统/集成测试规范。只要您对详细设计文档进行了审核和签署,就可以开始编写和审核您的单元测试规范。

没有详细的设计doc?对于方法论来说,你 NOT 已准备好开始编码,更不用考虑单元测试了。

假设你有&同意详细设计文件,其余的是品味问题。

您可以先编写测试用例,或让其他人在编写代码的同时编写测试用例;你可以根据需要进行测试,等等。

老派说编写代码,然后通过一些静态代码分析工具(Splint,CppCheck等)运行它,然后才开始运行单元测试(可能在代码之前完成)。

不要忘记黄金法则 - 如果要求,架构,设计不是完成已审核您正在沙滩上建造房屋 - 请 n编码或单元测试。

但订购是您的选择。什么最适合您,您的团队,您当前的项目?和ymmv

答案 11 :(得分:0)

  1. 创建必要的接口 进行测试。
  2. 编写测试。
  3. 编写代码以通过测试。
  4. 重复。