敏捷方式:整合testing与functiontesting还是两者兼而有之?
我现在在一个敏捷的办公室工作了一段时间。 我们使用Scrum进行项目pipe理,并混合使用XP的工程实践。 它运作良好,我们不断吸取教训,改进我们的过程。
我想告诉你我们通常的testing做法,并获得有关如何改进的反馈意见:
TDD:第一道防线我们对于unit testing非常虔诚,我会说我们的开发人员也有足够的经验来编写全面的testing,并且总是把SUT与Mock隔离。
集成testing对于我们的使用,集成testing基本上与没有使用模拟的unit testing相同。 这往往会遇到一些unit testing中遇到的问题。 这些testing往往难以阅读,因为它们通常涉及大量的工作,或者在规范框架的before_each
和after_each
部分中工作,因为为了使testing有意义,系统必须经常达到一定的状态。
functiontesting我们通常以结构化但是手动的方式来做这件事。 我们玩过Selenium和Windmill,这很酷,但对我们来说至less还不够。
我想听听别人怎么做。 你认为如果集成testing或functiontesting做得不错,另一个可以忽略不计?
单元,集成和functiontesting,尽pipe使用相同的代码,但是从不同的angular度来攻击它。 正是这些观点造成了不同,如果你放弃了一种types的testing,那么从这个angular度来看,一些东西可能会发挥作用。
此外,unit testing并不是真正的testing你的代码,特别是如果你正在练习TDD。 TDD的过程可以帮助你更好地devise你的代码 ,你只需要在最后得到一套testing的附加奖励。
您还没有提到是否有持续集成服务器运行。 我强烈build议设置一个( 哈德森很容易设置)。 然后,您可以对代码的每次检入都运行集成和functiontesting。
我们已经体验到一套稳定的seleniumtesting实际上总结了客户对质量的期望。 所以,从本质上讲,我们一直在讨论这个问题:如果编写seleniumtesting和编写unit testing一样简单,我们应该把重点放在unit testing上。
如果在应用程序中有某个地方没有任何后果的错误,谁真的关心? 但是总是存在着关于现实生活复杂性的问题。 你确定你的functiontesting正在捕获正确的情况? 在应用程序的行为中,其他系统可能会导致其他系统不能直接看到的底层复杂性。
事实上,编写seleniumtesting(使用适当的编程语言,而不是selenese),一旦你钻出最初的问题, 确实变得非常简单和有趣。 但是我们不愿意放弃我们的unit testing呢。
unit testing,集成testing和functiontesting都有不同的目的。 你不应该因为其他人正在高度可靠地运行而丢弃它。
我会说(这只是一个意见问题),你的functiontesting是你真正的testing。 即那些实际上模拟您的应用程序的实际使用情况的testing。 出于这个原因,无论如何,永远不要摆脱它们。
这听起来像你有一个体面的系统去。 如果你没有任何损失,请保留所有内容。
在我现在的客户端,我们并没有真正区分unit testing和集成testing。 业务实体如此依赖于底层数据层(使用本土ORM框架),实际上我们很less或没有真正的unit testing。
构build服务器在Team Build中使用持续集成(CI)进行设置,为了防止由于慢速testing(完整的testing套件需要一个多小时才能在服务器上运行)而导致这种情况发生,我们将testing分为“慢速”每天运行两次的testing以及作为持续集成一部分的“快速”testing。 通过在testing方法上设置属性,构build服务器可以分辨两者之间的差异。
一般来说,“慢”testing是需要进行数据访问,使用Web服务或类似的任何testing。 这些将被认为是通用惯例的集成testing或functiontesting。 例如:CRUDtesting,需要一组对象的业务validation规则testing等等。
“快速”testing更像unit testing,您可以合理地隔离单个对象的状态和testing行为。
我会考虑在十分之一秒或更短时间内运行的testing是“快”的。 其他任何事情都很慢,可能不应该作为CI的一部分运行。
我同意你不应该太过于挂在你作为开发的一部分的testing的“味道”(表示验收标准,因为testing是当然的例外)。 个人开发者应该根据自己的判断来决定哪种types的testing最适合他们的代码。 坚持对一个商业实体进行unit testing可能不会揭示一个CRUDtesting将会出现的错误,等等。
我把unit testing比喻为确保段落中的单词拼写正确。 functiontesting就像确保段落是有意义的,并且在其内部生成的文档中stream动良好。
我倾向于不把TDD中的各种testing分开。 对我来说,TDD是testing驱动的开发,而不是unit testing驱动的开发。 所以我的TDD实践结合了unit testing,集成testing,function和验收testing。 这导致某些组件被某些types的testing覆盖,而其他组件则以非常实用的方式被其他types的testing覆盖。
我问了一个关于这个练习的相关性的问题 ,最简单的答案是,实际上,在每个构build时自动运行快速/简单的testing,而慢速/复杂的testing运行较less。
我的公司进行functiontesting,但不是单元或集成testing。 我试图鼓励我们采用他们,我认为他们鼓励更好的devise和更快的迹象表明,一切都很好。 如果你做functiontesting,你需要unit testing吗?
我非常喜欢Gojko Adzic的“脸部保存testing”的概念,以此来确定您通过UI进行testing的方式: http : //gojko.net/2007/09/25/effective-user-interface-testing/
你应该做所有这些,因为单元,集成和functiontesting都有不同的目的。
属于我的一个重要的一点是写testing的方式是非常重要的,TDD是不够的,BDD(行为驱动开发)给出了一个很好的方法… … –