敏捷方式:集成测试与功能测试或两者兼而有之?

时间:2009-02-17 08:20:12

标签: testing tdd scrum

我在办公室工作,现在已经做了一段时间的敏捷。我们使用Scrum进行项目管理,并混合使用XP的工程实践。它运作良好,我们不断学习和改进我们的过程。

我想告诉您我们通常的测试做法,并获得有关如何改进的反馈意见:

TDD:第一道防线 我们对单元测试非常虔诚,我会说我们的开发人员也经验丰富,可以编写全面的测试,并且总是将SUT与模拟隔离开来。

集成测试 对于我们的使用,集成测试基本上与不使用模拟的单元测试相同。这往往会抓住一些问题,这些问题在单元测试中滑落。这些测试往往难以阅读,因为它们通常涉及很多或在规范框架的before_eachafter_each部分工作,因为系统必须经常达到某个状态才能进行测试有意义。

功能测试 我们通常以结构化但手动的方式执行此操作。我们玩过Selenium和Windmill,它们很酷,但至少对我们来说还不是很好。

我想听听其他人是怎么做的。你是否认为如果集成测试或功能测试做得好,另一个可以忽略不计?

10 个答案:

答案 0 :(得分:24)

单元,集成和功能测试虽然运用相同的代码,但却从不同的角度进行攻击。正是这些观点产生了不同,如果你放弃一种类型的测试,那么从这个角度来看,某些东西可以起作用。

此外,单元测试并不是关于测试代码,特别是如果您正在练习TDD。在TDD helps you design your code better的过程中,您只需获得一系列测试的额外奖励。

您尚未提及是否正在运行持续集成服务器。我强烈建议设置一个(Hudson很容易设置)。然后,您可以针对代码的每次签入运行集成和功能测试。

答案 1 :(得分:5)

我们经历过一套坚实的硒测试实际上总结了客户对质量的期望。所以,本质上我们一直在讨论:如果编写硒测试就像编写单元测试一样简单,我们应该更少关注单元测试。

如果 某个地方的某个错误在应用程序中没有任何后果,谁真正关心?但总是存在围绕现实生活复杂性的问题;你确定你的功能测试正在捕捉正确的场景吗?可能存在由应用程序行为中不直接可见的其他系统引起的潜在复杂性。

实际上,编写硒测试(使用适当的编程语言,而非selenese)确实在您钻取初始问题后变得非常简单和有趣。但是我们还不愿意放弃我们的单元测试......

答案 2 :(得分:4)

单元测试,集成测试和功能测试都有不同的用途。你不应该因为其他人在高可靠性下运行而丢弃一个。

答案 3 :(得分:4)

我会说(这只是一个意见问题)你的功能测试是你的真正的测试。即那些实际模拟应用程序实际使用情况的测试。因此,无论如何都不要摆脱它们。

听起来你有一个体面的系统。如果你没有什么可失去的话,请保持一切。

答案 4 :(得分:3)

在我目前的客户端,我们并没有真正区分单元测试和集成测试。业务实体如此依赖于底层数据层(使用自行开发的ORM框架),实际上我们很少或根本没有真正的单元测试。

构建服务器在Team Build中设置了持续集成(CI),并且通过慢速测试(完整的测试套件需要花费一个多小时才能在服务器上运行)来防止这种情况过多。我们将测试分成了“慢”测试每天运行两次,“快速”测试作为持续集成的一部分运行。通过在测试方法上设置属性,构建服务器可以区分两者之间的差异。

通常,“慢”测试是指需要进行数据访问,使用Web服务或类似操作的任何测试。这些将被视为通用惯例的集成测试或功能测试。例如:CRUD测试,需要一组对象使用的业务验证规则测试等等。

“快速”测试更像是单元测试,您可以合理地隔离单个对象的状态和测试行为。

我会考虑在十分之一秒或更短时间内运行的任何测试都是“快速”。其他任何事情都很慢,可能不应该作为CI的一部分运行。

我同意你不应该对你用作开发的一部分的测试的“味道”过于痴迷(表达验收标准,因为测试是例外)。个别开发人员应该使用他们的判断来决定哪种类型的测试最适合他们的代码。坚持对业务实体进行单元测试可能无法揭示CRUD测试会出现的错误等等......

答案 5 :(得分:3)

我将单元测试比作确保段落中的单词拼写正确。功能测试就像确保段落有意义,并在其生活的文档中流畅。

答案 6 :(得分:1)

我倾向于不在TDD中分离各种各样的测试。对我来说,TDD是测试驱动开发,而不是单元测试驱动开发。所以我的TDD实践结合了单元测试,集成测试,功能和验收测试。这导致某些组件被某些类型的测试覆盖,而其他组件则以非常务实的方式被其他类型的测试所覆盖。

我已经问过question关于这种做法的相关性,简短的回答是,在实践中,分离是在每次构建时自动运行的快速/简单测试和较慢/复杂的测试之间运行的。

答案 7 :(得分:1)

我的公司进行功能测试,但不进行单元测试或集成测试。我试图鼓励我们采用它们,我认为它们鼓励更好的设计和更快的指示,一切都很好。如果进行功能测试,是否需要进行单元测试?

答案 8 :(得分:1)

我非常喜欢Gojko Adzic的“面子保存测试”概念,作为通过用户界面确定测试内容的方法:http://gojko.net/2007/09/25/effective-user-interface-testing/

答案 9 :(得分:0)

你应该做所有这些因为单元,集成和功能测试都有不同的用途。
对我而言,重要的一点是,写测试的方式非常重要,并且TDD没有实现,BDD(行为驱动开发)给出了一个很好的方法......