定义
我认为在进行此讨论之前定义您的术语很重要。
单元测试单独测试一个单元。对我来说,这是一堂课。单元测试将创建一个对象,调用一个方法并检查结果。它回答了这个问题:“我的代码是否按照我的意图去做?”
集成测试测试系统中两个组件的组合。它侧重于组件之间的关系,而不是组件本身。它回答了“这些组件是否按预期一起工作”的问题。
系统测试测试整个软件系统。它回答了这个问题:“这个软件是否按照预期工作?”
验收测试是一个自动化的方式,让客户回答“我想这个软件是我想要的吗?”这个问题。这是一种系统测试。
请注意,这些测试都不能回答“这个软件有用吗?”这样的问题。或者“这个软件容易使用?”。
所有的自动化测试都受限于公理“端到端比你想象的要进一步”“ - 人类最终必须坐在电脑前,看看你的用户界面。
比较
单元测试是更快,更容易编写,运行更快,更容易诊断。它们不依赖于像文件系统或数据库这样的“外部”元素,因此它们更简单/更快/更可靠。大多数单元测试在重构时继续工作(并且良好的单元测试是安全重构的唯一方法)。他们绝对要求你的代码是decoupled,这很难,除非你先写测试。这些因素的结合使得TDD的红/绿/重构序列工作得很好。
系统测试很难写,因为他们必须经过这么多的设置才能达到想要测试的特定情况。它们很脆弱,因为之前软件行为的任何变化都会影响到您想要测试的情况,即使这种行为与测试无关。出于类似的原因,它们比单元测试慢得多。故障诊断可能非常困难,因为故障可能需要很长时间才能完成,而且故障涉及的软件太多。在某些软件中,系统测试非常难以自动化。集成测试处于两者之间:它们比系统测试更易于编写,运行和诊断,但覆盖范围比单元测试更广。
推荐
使用测试策略的组合来平衡每个的成本和值。
如果“经验告诉单元测试有助于确保功能并在开发周期的早期发现错误”。为什么你要“倾倒单元测试并进行集成测试”? – 2009-02-17 15:43:07
“只是为了表达一点”。旧时间练习一直是为了完成测试工作。经验表明,如果您早期进行测试(并且迭代地),则有一些优势,例如尽早发现错误。现在,如果我倾销单元测试进行集成测试,那么我会失去这种优势,但我的项目仍然存在。 – Sesh 2009-02-17 15:59:54