单元测试定义 - 范围和模拟外部依赖
Unit test definition - Scope and Mocking external dependencies
我对单元测试的定义感到困惑。
我认为单元测试是模拟外部依赖,范围可以像 IT 测试一样大(不止一个 class)。
以这种思维方式,我可以在我的 UT 完整流程中进行测试,这可以帮助我快速捕获错误,(我没有使用 Spring,我没有使用外部依赖项),
我想快速捕获错误,因为如果我正在进行重构,我想每隔几分钟 运行 我的测试,看看是否有什么东西坏了,所以我需要我的测试 运行 快。 (这就是为什么我只想 运行 UT 而不是 IT 测试)。
好像在业界,说到UT,UT应该small(作用域),还要mock外部依赖。
我不认为这是一个好的思考方式,因为这意味着我的 UT 可能会错过 IT 捕获的错误,这意味着 运行 每隔几分钟只使用 UT 是不够的,我应该 运行 IT 测试速度慢得多,这对我不利,因为重构过程将花费我更长的时间。
所以我错过了什么?为什么不编写像 IT 一样测试完整流程的 UT,而是模拟外部依赖项?
谢谢
通常单元测试是覆盖单个class的单个方法的测试。
In object-oriented programming, a unit is often an entire interface, such as a class, but could be an individual method (https://en.wikipedia.org/wiki/Unit_testing)
One difference is what people consider to be a unit. Object-oriented design tends to treat a class as the unit, procedural or functional approaches might consider a single function as a unit. But really it's a situational thing - the team decides what makes sense to be a unit for the purposes of their understanding of the system and its testing. Although I start with the notion of the unit being a class, I often take a bunch of closely related classes and treat them as a single unit. Rarely I might take a subset of methods in a class as a unit. However you define it doesn't really matter (https://martinfowler.com/bliki/UnitTest.html)
通常你有覆盖小块代码的单元测试和测试多个 classes/modules 之间集成的集成测试。而且你 运行 单元测试比 IT 测试更频繁。
小型单元测试的目的是尽可能精确地定位导致错误的代码段。如果您使用多个 classes 的 It 测试失败,那么您需要一一检查所有这些 classes 以找出问题。但是,如果您的单元测试涵盖单一 class 的单一方法失败,那么您就知道问题出在哪里。
定义: 单元测试是一种测试方法,旨在发现或防止那些可通过测试小型(甚至是最小的)孤立软件片段检测到的错误。
这个定义设定了单元测试范围的下限,即从最小的软件部分开始。对于上限,它留下了一定的自由度。有时人们也试图通过为术语单位提出定义来划定上限。但是,我不太关心单位是什么。相反,我根据被测软件可以有多大的问题来设置限制,这样单元测试方法仍然可以合理地应用。
例如:例如,15 行代码的单个函数将接受单元测试。但是,如果我重构我的代码以便从函数中提取两个辅助函数怎么办?根据定义,我现在还可以对辅助函数应用单元测试。但是,如果我已经有了一套完美的单元测试,它们应该仍然可以与原始函数的界面一起使用。因此,我可以保留我的测试并忽略更改的内部结构——它仍然是单元测试。
另一个例子:在 C++ 中,容器 classes 与相关的迭代器 classes 一起出现。容器 class 及其对应的迭代器 class 是紧耦合的。在许多情况下,结合单元测试方法测试这些 classes 会很好地工作。在测试迭代器时,您通常不会将它与其容器隔离开来 class,而是将两者一起测试 - 我仍然认为这是单元测试。
总结第 1 部分: 只要应用单元测试方法有意义,您也可以将它应用到紧耦合函数集甚至紧耦合 class es.
再看上面的定义,里面提到了隔离。但是请注意,这里的隔离用于 class 确定可以发现的错误类型:单元测试用于发现可以在隔离软件中找到的错误。它并没有说明您实际上必须在测试期间隔离代码。换句话说,您不必模拟依赖项。
嘲笑应该是有原因的。如果你考虑模拟一个函数或方法,你应该知道你将要解决哪个问题。如果没有问题要解决,不要嘲笑。例如,您也不要模拟 sin 或 cos 等标准库数学函数,因为它们在大多数情况下也不会引起问题。
例如,如果依赖组件 (DOC) 导致非确定性行为(随机性、时间等),您将进行模拟。然而,对于模拟,您无法找到那些错误,这些错误与关于被测函数与 DOC 的交互应该如何工作的误解有关:既然您实现了模拟,那么您就基于您的潜在误解来实现它们。这不是单元测试的缺陷:这只是为什么除了单元测试还需要集成和系统测试的原因。
第 2 部分摘要: 单元测试不一定与模拟有关。它是关于专注于寻找一种特殊类型的错误:那些你可以找到的错误 if 代码被隔离。这将所有其他错误(尤其是那些只能在集成软件中找到的错误)排除在单元测试范围之外。
我对单元测试的定义感到困惑。
我认为单元测试是模拟外部依赖,范围可以像 IT 测试一样大(不止一个 class)。
以这种思维方式,我可以在我的 UT 完整流程中进行测试,这可以帮助我快速捕获错误,(我没有使用 Spring,我没有使用外部依赖项),
我想快速捕获错误,因为如果我正在进行重构,我想每隔几分钟 运行 我的测试,看看是否有什么东西坏了,所以我需要我的测试 运行 快。 (这就是为什么我只想 运行 UT 而不是 IT 测试)。
好像在业界,说到UT,UT应该small(作用域),还要mock外部依赖。 我不认为这是一个好的思考方式,因为这意味着我的 UT 可能会错过 IT 捕获的错误,这意味着 运行 每隔几分钟只使用 UT 是不够的,我应该 运行 IT 测试速度慢得多,这对我不利,因为重构过程将花费我更长的时间。
所以我错过了什么?为什么不编写像 IT 一样测试完整流程的 UT,而是模拟外部依赖项? 谢谢
通常单元测试是覆盖单个class的单个方法的测试。
In object-oriented programming, a unit is often an entire interface, such as a class, but could be an individual method (https://en.wikipedia.org/wiki/Unit_testing)
One difference is what people consider to be a unit. Object-oriented design tends to treat a class as the unit, procedural or functional approaches might consider a single function as a unit. But really it's a situational thing - the team decides what makes sense to be a unit for the purposes of their understanding of the system and its testing. Although I start with the notion of the unit being a class, I often take a bunch of closely related classes and treat them as a single unit. Rarely I might take a subset of methods in a class as a unit. However you define it doesn't really matter (https://martinfowler.com/bliki/UnitTest.html)
通常你有覆盖小块代码的单元测试和测试多个 classes/modules 之间集成的集成测试。而且你 运行 单元测试比 IT 测试更频繁。
小型单元测试的目的是尽可能精确地定位导致错误的代码段。如果您使用多个 classes 的 It 测试失败,那么您需要一一检查所有这些 classes 以找出问题。但是,如果您的单元测试涵盖单一 class 的单一方法失败,那么您就知道问题出在哪里。
定义: 单元测试是一种测试方法,旨在发现或防止那些可通过测试小型(甚至是最小的)孤立软件片段检测到的错误。
这个定义设定了单元测试范围的下限,即从最小的软件部分开始。对于上限,它留下了一定的自由度。有时人们也试图通过为术语单位提出定义来划定上限。但是,我不太关心单位是什么。相反,我根据被测软件可以有多大的问题来设置限制,这样单元测试方法仍然可以合理地应用。
例如:例如,15 行代码的单个函数将接受单元测试。但是,如果我重构我的代码以便从函数中提取两个辅助函数怎么办?根据定义,我现在还可以对辅助函数应用单元测试。但是,如果我已经有了一套完美的单元测试,它们应该仍然可以与原始函数的界面一起使用。因此,我可以保留我的测试并忽略更改的内部结构——它仍然是单元测试。
另一个例子:在 C++ 中,容器 classes 与相关的迭代器 classes 一起出现。容器 class 及其对应的迭代器 class 是紧耦合的。在许多情况下,结合单元测试方法测试这些 classes 会很好地工作。在测试迭代器时,您通常不会将它与其容器隔离开来 class,而是将两者一起测试 - 我仍然认为这是单元测试。
总结第 1 部分: 只要应用单元测试方法有意义,您也可以将它应用到紧耦合函数集甚至紧耦合 class es.
再看上面的定义,里面提到了隔离。但是请注意,这里的隔离用于 class 确定可以发现的错误类型:单元测试用于发现可以在隔离软件中找到的错误。它并没有说明您实际上必须在测试期间隔离代码。换句话说,您不必模拟依赖项。
嘲笑应该是有原因的。如果你考虑模拟一个函数或方法,你应该知道你将要解决哪个问题。如果没有问题要解决,不要嘲笑。例如,您也不要模拟 sin 或 cos 等标准库数学函数,因为它们在大多数情况下也不会引起问题。
例如,如果依赖组件 (DOC) 导致非确定性行为(随机性、时间等),您将进行模拟。然而,对于模拟,您无法找到那些错误,这些错误与关于被测函数与 DOC 的交互应该如何工作的误解有关:既然您实现了模拟,那么您就基于您的潜在误解来实现它们。这不是单元测试的缺陷:这只是为什么除了单元测试还需要集成和系统测试的原因。
第 2 部分摘要: 单元测试不一定与模拟有关。它是关于专注于寻找一种特殊类型的错误:那些你可以找到的错误 if 代码被隔离。这将所有其他错误(尤其是那些只能在集成软件中找到的错误)排除在单元测试范围之外。