单元测试的局限性是什么?

时间:2019-07-16 16:16:43

标签: unit-testing software-design qa black-box-testing

经过大约(2)个工作日的工作,寻找要达到的目的的 right 类型的单元测试,我觉得我想要一些无法获得的东西。阅读(8)年前的帖子后: What are "bad" attributes in unit tests? 我现在相信我要测试一个荒谬的配置。

我实质上是在尝试使用Google测试框架对各种因素的组合(各种变化,如n = 729种不同的配置)进行黑盒测试,似乎我在问不可能的事情。我只是想一次测试太多的东西,就像评论中的某人写道。

我知道自动化是软件质量检查中非常有用的工具(我的应用程序是基于桌面的,以供将来参考),但是在此之前,我的简单单元测试仅更改了每种配置的一个参数,并且仍然需要大量工作结束。与我现在想做的相比,这是最容易的部分。由于需要我进行很多思考/外部操作,因此我基本上不考虑该选项。

我已将旧链接复制到下面昨天的帖子中,描述了我的问题以及我想测试哪些内容以供参考: Are there efficient methods of black box testing that can avoid redundancy?

对于任何人在单元测试中提出过多要求的意见,我将不胜感激。

2 个答案:

答案 0 :(得分:1)

您所做的很可能不是真正的单元测试。

单元测试是关于在小的孤立的代码段中发现错误。这意味着,您通常只测试类的单个函数或方法,在极少数情况下,测试代码的部分稍大(!)。请参见https://stackoverflow.com/a/55153145/5747415,或者,要了解单元测试与集成测试等其他测试阶段有何区别,请参见https://stackoverflow.com/a/56120843/5747415

仍然认为您正在进行单元测试吗?那么也许黑匣子不是要走的路。

虽然您可以在单元测试期间应用黑盒测试方法,但是单元测试是最接近代码级别的测试阶段(例如,与集成测试相比):开发人员通常为其创建单元测试自己在处理代码时拥有自己的代码,这意味着他们那时无论如何都知道它。由于这个原因和其他原因,单元测试更自然地以玻璃盒测试的方式进行。

由于要创建输入值集的笛卡尔积,因此详尽的黑盒测试会导致大量测试用例。但是,在典型代码中,有一些早期处理的特殊情况(例如错误情况)。例如,如果第一个参数无效,则代码可能会立即退出并出现异常。然后,使用剩余参数的笛卡尔积的每种组合测试场景“第一个参数无效”是没有价值的。在严格的黑盒测试中,您无法了解“第一个参数无效”情况下的提前退出,但是在单元测试中,您将利用这些知识。

仍然相信所有组合都很重要吗?

那么,很有可能函数/方法/类或您正在进行单元测试的任何东西都太大了,应该分成较小的函数。您尚未在问题中显示任何代码,这对于单元测试问题而言是不常见的。

答案 1 :(得分:1)

我相信您面临的问题不是因为单元测试本身,而是因为您的单元测试中缺少方法。

如果您的特定问题是测试用例过多(检查的可能性太多),我强烈建议您使用以下两种方法进行选择(基于 https://www.guru99.com/equivalence-partitioning-boundary-value-analysis.html):

等价类划分

定义在系统中执行相同路径的输入值类。 例如。如果您有一个检查输入整数是否 >= 18 的方法 isAdult,您可以将输入分为三类:

  • 无效的年龄值(即输入 < 0)
  • 非成年人年龄(0 <= 输入 < 18)
  • 成年年龄(输入 > 18( 通过从每个等价类中为您的测试用例选择一个代表值,您可以很好地覆盖整个输入值空间。

边界值分析

让您从等价类中选择最有效的代表。这是通过探索两个等价类之间的边界来完成的,那里通常具有最大的错误检测潜力。 但我不想详细介绍-如果您​​有兴趣,可以查看例如https://www.guru99.com/equivalence-partitioning-boundary-value-analysis.html 一些示例和视觉效果(在两种方法上)。

工具支持

在定义等价类时,您(理论上)甚至可以在此元级别上工作并与测试用例交互。无需关心从等价类生成的许多测试用例。在实践中,诸如 https://www.devmate.software/(我个人使用的工具)或 https://www.tricentis.com/products/automate-continuous-testing-tosca/(对我来说太贵 - 并且不确定它是否明确支持等价类分区)之类的工具允许您通过从您的等价类自动生成和管理测试用例代码。

单元测试最佳实践

如果您还有其他问题(除了“测试用例过多”方面),您还应该评估您的单元测试并尝试坚持常见的最佳实践。你可以找到一些关于好/坏单元测试的例子,例如这里:https://www.devmate.software/good-unit-tests-vs-bad-unit-tests-with-c-and-nunit-examples/ 基本上,他们归结为

  • 应用可维护测试用例的方法
  • 使测试用例定义和代码对其他人可解释和可读(无需进一步解释)
  • 遵守单元测试的规定(可重复,只测试一个单元,与系统的其余部分分离)。