我们开始了一个新的项目推出了很多我们不那么熟悉的新技术,而我们没有大量的练习中的架构。换句话说,接口和服务类的东西,我们的”等等之间的相互作用重楼是相当不稳定,更使由于内部和客户的反馈。 虽然我一直在不断移动的规范沮丧,我认为这在一定程度上建立的东西,我们以前从来没有建的必要组成部分 - 如果我们只是坚持原来的设计和范围,最终产品可能会是一大堆缺乏创新,比它有用之所以成为。
我还介绍了测试驱动开发(TDD),因为好处是证据充分的和概念上我很喜欢这个主意。 两个新的东西要学 - NUnit的和嘲弄 - 但看到那些绿色的圆圈做出一切都值得。
随着时间的推移,然而,在设计这些不断变化似乎意味着,我几乎花光了一大堆更多的时间改变我的测试中,比我是在写代码本身。 仅仅出于这个原因,我已经回到测试的老办法 - 那就是,不是自动的。
虽然我毫不怀疑,该应用将远远数百个优秀的单元测试更健壮,我发现时间的权衡推出的产品是大多不能接受的。 我的问题是,那么 - 有什么,你也发现,TDD可以是一个麻烦,如果你原型的东西/构建beta版? 是否TDD去更自然地手牵手与一些地方的规格较为固定,或者开发商有在语言和技术的经验吗? 还是我做了什么根本性错误?
请注意,我不是要在这里批评TDD - 只是我不知道它总是在各种情况下最合适的。
Answer 1:
简短的回答是,TDD是测试版非常有价值的,但可能没有那么原型。
我想测试版和原型区分是非常重要的。
测试版本质上是一个生产的版本,只是仍处于开发阶段,所以你一定要在场景中使用TDD。
概念的原型 /证明你建立与把它扔了,一旦你得到的答案拿出来,然后你想要的明确意图的东西。
这是真的,项目经理往往会推动被用作生产代码的基础原型,但它抵抗是非常重要的。 如果你知道这是不可能的,把原型代码,你会生产代码,因为你知道它要在未来成为你的产品代码-这意味着你应该使用TDD与它。
当你正在学习一门新技术,大多数代码示例等是没有考虑到单元测试写成的,所以可能很难将新技术转化为单元测试的心态。 它最肯定感觉就像一个很大的开销。
根据我的经验,但是,单元测试往往真的强迫你推你正在学习新技术的边界。 很多时候,你需要研究和学习各种不同的挂钩的新技术提供的,因为你需要能够通过DI或类似的隔离技术。
相反,只有以下因循守旧的,单元测试经常迫使你学习技术,更深入的,有什么可感觉的开销实际上只是一个更深入的原型 - 一个是往往更有价值,因为它涵盖了更多的地面。
我个人认为,单元测试一种新的技术,是一个很好的学习工具。
你似乎对于测试可维护性遇到的症状有点正交的,我想。 你的试验可以Overspecified,这是一件好事已知技术时可能发生一样好(但我认为这是可能更容易落入这个陷阱时,你也同时学习一门新技术)。
这本书的xUnit测试模式描述了Overspecified测试反模式,并提供了大量的指导和模式,可以帮助你编写更易于维护的测试。
Answer 2:
我发现,彻底的测试中大量的代码扔掉早期结果和你的心窝里的空的感觉。
测试哪些需要进行测试,而不是一行代码更多。 当你弄清楚有多少是,让我知道。
Answer 3:
原型的时候,我会说这取决于原型的类型。 在进化原型,其中所述原型演变成最终的应用程序,我会尽早利用单元测试。 如果您正在使用扔掉的原型,我不会与单元测试打扰 - 最终的应用将是不一样的原型。
我不知道你所说的“测试版”的意思,因为测试版几乎是一个成品。 只要你开始对将要发货,或有被运往一个潜在的代码工作不久,确保一切都很好的测试。
现在,纯粹的测试驱动的开发可能是极端的,但要确保所有可交付的代码为试验地,在单元,集成和系统级是很重要的。
Answer 4:
有什么,你也发现,TDD可以是一个麻烦,如果你原型的东西/构建beta版?
我有...的时间吨:)
是否TDD去更自然地手牵手与一些地方的规格较为固定,或者开发商有在语言和技术的经验吗?
并不是的。 TDD的作品相当不错的不断变化的需求,但TDD是真正为确保一个稳定和合约驱动的设计:其原型并不真正需要的是非常有两件事情..
还是我做了什么根本性错误?
看起来并不像它:)你刚刚看到TDD由其他东西比黄金树..
Answer 5:
“随着时间的推移,然而,在设计这些不断变化似乎意味着,我几乎花光了一大堆更多的时间改变我的测试中比我在编写代码本身”
好。 你应该花很多时间测试。 这一点很重要,它是你如何证明你的代码是正确的。 “更少的代码比测试”是一个很好的标杆。
这意味着,你正在写的是证明你对底层技术的期望有效的测试。
您可能要考虑这样做。
有些测试是应用独立于任何技术选择的“必要”或“核心”或“持久”的特点。 专注于这些。 本不应该改变。
有些测试证实该技术或实施选择。 这些改变所有的时间。 也许是这样的技术变化导致的变化集中在这里,你应该隔离这些。
Answer 6:
- 报错路线图与运动X是令人沮丧的。 “不必花费大部分时间改变,而不是代码测试” TDD或没有TDD ..表明要么规格被彻底改变了,或者你只是在嘲弄自己又名“脆弱测试”。 我需要更多的投入从你发表进一步的评论。
- 穗/原型意味着要建立的东西作为概念或验证设计的一个证明。 根据这个定义,我会说,你并不需要,因为您的主要目标是学习/减少未知数TDD你原。 一旦你这样做,你应该扔掉你的原型,建立自己的生产版本的自动化测试(现在使用TDD)。 您运输这些客户不是“测试样机”
- 但是,如果手动测试已经为你工作好,坚持吧。 我想证明给自己和别人,我的代码工作在按下按钮 - 避免重复工作的人的无聊,并得到彻底的测试。
航运原型迟早会咬你,更难比你想象的。 从我这拿走。
Answer 7:
原型,就是要在使用“将这种东西的工作” -exploration。
因此,有没有需要进行测试。 但! 始终把你的原型远和代码从零开始!
Answer 8:
在敏捷开发中有一个“秒杀”的概念 - 一个解决方案或技术的深而窄的调查。 一旦你熟悉的事情应该是如何工作的,你用一个更高层次的质保一个新的实现开始。
有与标为“测试版”软件中的陷阱 - 所有你最终不能用于生产作为应用程序的一个重要组成部分的东西突然和你没有重做它的时间。 这很可能会回来,后来就咬你。 一个protoype确实应该只是一个原型 - 无多,不会少。
Answer 9:
我没有给你一个药方,但我有一个诊断:
如果你最终在一个调试器,你早该有更多的测试 。 即使在非常早期的原型,你想你写工作代码,对不对? 如果我不这样做TDD的,我运行一个bug,很难改造单元测试发现的bug。 人们很容易去调试。 所以,我的目标是我的TDD努力生产足够好的一组测试,这样我不需要调试器。 这样做也需要大量的练习。
如果您想重构,但这样做的风险,不是因为你早该有更多的测试 。 如果我要与一些代码来工作了几个小时,我想重构,以保持我的速度高。 如果我毫不犹豫地重构,它会伤害我的工作效率,所以我尽我所能,使重构安全和方便。 再次,测试一个很好的选择正是我需要的。
Answer 10:
对于纯粹的原型,因为人们说,不是那么有用。 但往往一个原型,将按照应用的元素。
当你盖了, 是什么,你希望继续实概念? 有哪些关键领域模型? 这是有道理的,以建立一个围绕这些测试。 然后,他们提供在其上探索的想法了坚实的基础。 通过让代码库固体和测试的一部分,它可以让你与原型走得更远比你可能没有测试。
它总是选择正确的事情,测试时的平衡。 这听起来像从你的描述你在once--有时这可能是过多采用了不少新的东西,你需要以退为进一点点来优化你的进步。
Answer 11:
我通常这个原型代码做的是写不测试(或不多),但在我的src /测试/ java或地方我把我的测试代码做的工作。 这样的话,我会不小心将它投入生产。 如果有件事情我已经原型,我喜欢,我就会创建的src / main / java的(我的杆代码)的东西,它TDD,同时拉动了代码原型一块为我添加的测试。
Answer 12:
随着时间的推移,然而,在设计这些不断变化似乎意味着,我几乎花光了一大堆更多的时间改变我的测试中,比我是在写代码本身。
我写(和运行)自动化系统的I / O测试。 该系统的I / O依赖于功能性的要求,并且不会改变系统的实施发生变化时,这样我就可以重构实现在不改变自动化测试: 如果一个测试内部实现,或只测试公众的行为?
Answer 13:
当我与新技术取得联系,我平时写了几个,我为原型的基础上使用测试。 这里的主要优点是,它可以让我习惯的技术少,易消化的零件和我记录我的文档的唯一有效的形式进展:代码。
这样一来,我可以测试的假设(当我在数据库中坚持一个空字符串会发生什么?DB2将返回一个空字符串,Oracle将返回NULL),并确保当我在原型工作,他们不会改变。
认为这项工作作为许多,微小的原型都集于一身了几个单元测试。
现在我的产品的设计会随着时间而改变,但这些尖峰的测试仍然有效:因为我现在追求不同的解决方案的基本框架不只是改变。 事实上,这些测试将允许我迁移到技术的下一个版本,因为我一直在使用的一个假设发生了变化,他们会响警报。 否则,我不得不留在当前的版本或要非常小心进行任何升级,因为我不能肯定它会打破。
Answer 14:
我会谨慎原型解雇时TDD。 这主要是因为原型往往(但不总是)演变成最终的产品。 如果你能肯定的是,原型抛出,一旦他们建立什么都这是他们开始了,那么你就可以更宽松一点。 然而,如果它有机会,要么原型将演变成最终产品,或代码的部分将被移植到最终产品,然后将努力遵循TDD的原则。
这不仅使你的代码的可测试性,但更重要的是(在我心中),它鼓励你遵循良好的软件设计原则。
Answer 15:
如果它实际上是一个原型,你打算把它扔掉,当你做了,那么采取一切途径让你通过这个阶段。 但是,问问自己,多久你的原型实际上得到扔掉与他们多久潜入你的最终产品?
有一个很好的演示在JavaOne上TDD。 其中一个非常好的结果是,你往往会多了解您的实际需求,更好的,当你不得不笔者测试,以满足他们。 这是除了所有的重构和代码质量的好处与方法走过来。
文章来源: Is unit testing a bad idea during beta/prototyping?