组件与集成与功能测试

时间:2016-02-05 21:59:01

标签: .net unit-testing testing functional-testing

最近我发现我对不同类型的测试的理解可能并不完全正确。

E.g。 单元测试是对一个单元的测试,其中与其他单元的交互基于模拟(假货,存根)。所以,没有与文件系统,线程,时间的交互......

对我来说,

组件测试是围绕一个组件(更多单元)的测试,我使用了两个组件,模拟和“真实”资源。它们都用于输入模拟和输出测试。无论什么似乎更合适。例如。我正在嘲笑当前仲裁状态的变化,但我断言事件存储在RTDB中。

对我来说,这些组件通常是一个应用程序的切片。

功能测试我认为是在生产中运行的应用程序(exe)周围的(黑盒子)测试。

嗯,这是真的还是不行? 组件测试仅基于模拟测试吗?如果是,为什么?我怎么能确定嘲讽足够好? 我们应该从功能测试中运行应用程序吗?为什么它与线程中app主程序的bootstrap不同? 什么是集成测试?

我想听听其他意见,你是怎么做到的。您有哪些测试,如何维护它们以及谁在您的团队中对它们负责?

干杯!

1 个答案:

答案 0 :(得分:4)

你的问题有点没有重点,但我会尝试给出答案。

此处已讨论过各种测试:What is Unit test, Integration Test, Smoke test, Regression Test?

然而,主要不是使用双重(如模拟,存根等)来区分不同类型的测试。您可以通过区分它们的不同测试来实现目标

单元测试中,目标是测试您编写的代码片段的行为,就像您期望的那样。也就是说,您正在根据您对代码行为方式的假设来测试代码。加倍(模拟)只是实现这一目标的一种手段,同时确保a)测试所有场景(包括错误情况)b)确定性测试结果(独立于时间/调度/环境条件)c)快速测试构建和执行d)简单的测试设置e)独立于库的问题(不完整,错误,......)。如果您可以使用真实库来实现所有这些标准,则不必将库加倍。例如,在大多数情况下,您不会为作为编程语言标准库一部分的容器库(列表,集合,地图......)创建双打 - 您通常会达到所有单元测试目标只需使用图书馆。

单元测试的目标不是识别有关如何与其他软件部件交互的误解。并且,由于它不是强制性的,但是完全可以将单元与之交互的软件部分加倍,在这种情况下,您甚至无法识别出这样的误解:每当您将其中一个依赖项加倍时,您将根据您的理解实现双重(可能还有你的误解)另一个组成部分。因此,识别关于如何与其他组件交互的误解是集成测试的目标。在集成测试中,您将这些组件汇集在一起​​,即您要测试的组件之间的交互。其他组件也可以链接或加倍,具体取决于与单元测试相似的标准。

一旦您意识到单元测试和集成测试的不同目标,您还将意识到不同的目标将导致构建不同的测试用例集。因此,单元测试套件仍然是一个单元测试套件,无论你是否可以与真正的图书馆相连而不是使用双打。

然后,(子)系统测试再次引入不同的目标,例如测试一组组件一起实际实现该(子)系统的所需特征。一个例子可能是组件A和B在结构列表上运行,除其他外,最终列表应该被排序。现在,A和B的开发人员可能会假设另一个人正在进行排序。并且,如果它们都不需要为自己的代码对数据进行排序,则a)两个组件都将具有不对要排序的输出进行测试的单元测试套件,以及b)将对其进行集成测试A和B之间的交互,不一定要测试来自另一个的输入是否有序。但是,通过(子)系统测试,将测试所有必需功能的存在,并检测缺失的排序。同样,(子)系统测试环境中的其他组件可以链接或加倍 - 两种情况都是可能的。

然而,您正在询问组件测试,这很可能是(子)系统测试的同义词,或描述(子)系统测试组合的术语以及构成该(子)系统的组件的集成测试。并且,您提到的功能测试最有可能(子)系统测试软件系统级别(因此,不是次级,而只是系统测试)。而且,最后在我理解的时候回答这个问题,现在应该已经很清楚,使用双打并不是对测试套件进行分类的可靠标准,但测试的各自目标是。