我如何知道我是否有足够的单元测试范围来删除集成测试?


15

我正在使用旧系统(这意味着它是在没有测试的情况下编写的)。我们试图通过编写集成测试来测试某些系统,这些集成测试从外部测试功能。

这使我有信心重构代码的某些部分,而不必担心会破坏它。但是问题在于这些集成测试需要一个部署(2分钟以上)和很多分钟才能运行。而且,它们很难维持。它们每个都覆盖了数千行代码,当其中一个中断时,可能需要花费数小时来调试原因。

我最近为这些功能更改编写了很多单元测试,但是在提交之前,我总是做一个新的部署并运行所有集成测试,以确保我不会错过任何东西。至此,我知道我的单元测试和某些集成测试与它们的测试重叠。

我怎么知道我的良好单元测试足以覆盖不良的集成测试,以便我可以删除该集成测试?

Answers:


18

最简单的指标是问:“该集成测试上一次何时合法失败?” 如果自集成测试失败以来已经很长时间(发生了很多更改),则单元测试可能做得足够好。如果集成测试最近失败了,则存在单元测试未发现的缺陷。

我通常希望将集成测试的鲁棒性提高到可以无人值守可靠运行的程度。如果它们需要很长时间才能运行,则应将它们运行一整夜。即使它们只是偶尔运行,它们仍然是有价值的。如果这些测试太脆弱或需要人工干预,那么可能就不值得花费时间来保持它们运行,而您可以考虑丢弃那些最成功的测试。


3
+1推荐自动测试,因为这会导致一个明显的问题:“为什么要取消自动测试?”

1
是的,我同意这一点。当然,如果您没有足够好的单元测试覆盖率,那么即使这样仍然会给您带来困扰。例如,我们目前有一个集成测试套件,大约需要6个小时才能运行...但是由于我公司对兼容性的关注,我认为没有一个测试会被删除
Earlz 2013年

2
也许我应该为此提出一个新的问题,但是您是否建议每当集成测试合法失败时,我应该弄清楚如何编写一个也失败的单元测试并使它们都通过?
丹尼尔·卡普兰

2
@tieTYT:是的,听起来绝对是个好主意。单元测试很好;对您知道已经损坏的东西进行单元测试甚至更好。
2013年

7

单元测试不是测试的圣杯,它们只是用于测试代码库的众多工具之一。因此,任何数量的单元测试都不应被认为可以安全地替代其他测试。如果您的集成测试不佳,则应努力使其成为一个好的集成测试,而不要用其他东西代替它,就像用围墙和大门代替前门一样。


如果这个项目从头开始,那对我来说更有意义。但是我的第一个集成测试是“检查您是否可以登录”,最终我做了很多“检查您可以登录”的单元测试。如果更改html,集成测试将始终崩溃。这个示例是完全人为设计的,但是删除集成测试不是一个很好的例子吗?
丹尼尔·卡普兰

3
@tieTYT:通过UI测试某些东西通常会导致非常不稳定的解决方案。尽管如此,通过UI进行测试还是很重要的,在某些情况下,手动测试在这种情况下所付出的努力比尝试使测试自动化并使之保持稳定要少。因此,当您认为是这种情况时,可以从自动测试列表中删除该“集成测试”,然后将其添加到手动测试的测试计划中。
Doc Brown

@DanielKaplan是否可以将集成测试更新为更稳定?如果由于html有时更改而导致失败,则可以测试类似“用户名在登录后出现在页面上”而不是更具体的东西,例如“用户名在登录后出现在此div中”
Jen
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.