手动单元测试与自动单元测试有哪些优缺点?

12

我能否获得手动单元测试的优缺点,并与自动化流程进行比较。


8
这句话是在询问“只有我觉得这个句子像考试题吗?”。 - skaffman
4个回答

20

这是一个奇怪的问题 - 单元测试应该是自动化的,因此可重复运行且易于运行。对于许多人(包括我),“手动单元测试”是一个矛盾的说法。

在某些情况下,手动测试可能很有用,比如在无法进行自动化测试的情况下。这些通常不是在单元测试级别进行的,而是更高级别的测试,例如集成测试、GUI测试、压力测试等。

通过单元测试,您可以一次测试代码的小部分(通常是单个方法/类)。测试本身是以代码编写的,所以它们(几乎总是)可以通过单元测试框架自动运行。

更新:现在你提供了更具体的背景,因此更容易给出具体的答案 :-)

我可以肯定地说,在软件项目的整个生命周期中,自动化单元测试的实际收益几乎总是超过其成本。设置它们的成本高于手动测试,但是你运行它们的次数越多,你就能节省更多的时间,并且你能够更早地获取有关代码在新更改中的错误位置的反馈信息。

覆盖旧代码的单元测试绝对不是易事,但是如果该产品对您的公司有价值,并且预计将继续使用多年,则仍然是值得努力的。尤其是因为在现实生活中,生产系统往往会超出其预期的寿命。

其中一个方面是,“尝试检查我们编写的所有代码路径” - 结合代码覆盖率工具的自动化单元测试,您可以自动看到最新单元测试未覆盖的代码路�� - 如果覆盖率工具集成得很好,则通常可以在IDE内部进行查看。

我推荐 与遗留代码有效地工作 - 它包含了有关如何为混乱、编写不良的遗留代码编写单元测试的宝贵知识。


好的,我们的情况是,我们有一个大型应用程序,我们将使用自动化UT。目前,我们手动准备测试数据并尝试检查我们编写的所有代码路径。 为此,我们需要进行比较分析,看看自动化是否能在长期内帮助我们。 - Debajyoti
如果我手动做这件事,那么我就在浪费时间。我可以通过一些UT框架(如VS测试或Pex)轻松地完成这个任务。 - Debajyoti
@Debajyoti,从长远来看是的。此外,手动测试不太有动力,而且容易出错。 - Péter Török
我明白你的意思,Peter。这肯定会对我有很大帮助。非常感谢你。 - Debajyoti

5
"手动单元测试"基本上是不可能的。单元测试被定义为在隔离环境中测试小的代码单元。你不能通过手动方式来实现这个。
如果你谈论的是"集成测试",那就是另一回事了:
手动集成测试的优点:
- 测试人员比开发人员便宜 - 测试人员可以智能地调整测试以适应应用程序的变化 - 它们没有自动化测试那么脆弱 - 测试人员可以发现自动化测试可能会忽略的错误 (例如未显式测试的缺失或不正确的值,或布局问题) - 不需要额外的测试软件,这可能会很昂贵和/或需要很长时间来学习 - 总是可行的; 没有你必须满足的技术要求 - 你可以直接开始; 进行单次测试的初始成本比设置和实施自动化测试低得多。
手动集成测试的缺点:
- 每次进行测试都需要支付人力成本,在长期来看,这是非常昂贵的。 - 在修复漏洞后进行完全回归测试基本上是不可能的(太昂贵)。 - 这意味着你必须对开发周期后期的更改非常保守,并且对大的更改也是如此。不要进行持续的重构 - 最好忍受糟糕的代码,而不是冒着灾难性的副作用风险。 - 你必须非常仔细地计划何时进行测试以获取最大的性价比。在某种程度上,你将不得不调整你的开发实践来反映这一点。
总之,最好同时拥有手动和自动化的集成测试;它们有时可以很好地互补,因为有些东西实际上更容易以自动化的方式进行测试,而其他东西则根本无法自动化。

3
我认为你问题的唯一真正答案是:“这没关系,因为你需要两者都有。”
自动化单元测试将使您的开发人员编写测试代码来根据他们对规格说明的理解自动验证代码。由于它们是自动化的,因此每次运行时几乎没有变化。根据定义,这些单元测试将知道软件如何在底层工作,因此可以被视为“白盒测试”-测试人员了解某些或所有底层代码。
另一方面,手动测试将从用户的角度揭示问题。您将有能力找出不熟悉底层代码和结构的实体可能遇到的错误以及程序可用性方面的问题。这被视为“黑盒测试”。

谢谢Jon。这将对我很有帮助。 - Debajyoti

0
我理解“手动测试”是指没有使用测试库进行测试。
“手动测试”的优点: - 一次性的项目 - 不需要学习库的规则
“手动测试”的缺点: - 很可能会在团队环境中引起混乱和不满 - 在测试库方面已经做了大量工作
共识:

请使用测试库

不使用流行的测试库是一个非常糟糕的习惯,您肯定会像我一样后悔选择这条路。现在,我已经被旧代码鬼魂所伤,我在所有可以使用Jest的地方使用它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接