首页 > 解决方案 > 单元测试定义 - 范围和模拟外部依赖项

问题描述

我对单元测试的定义感到困惑。
我认为单元测试是关于模拟外部依赖项,范围可以像 IT 测试一样大(不止一个类)。以这种思维方式,我可以在我的 UT 完整流程中进行测试,这可以帮助我快速捕获错误,(我没有使用 Spring,我没有使用外部依赖项),我想快速捕获错误,因为如果我'我正在重构,我想每隔几分钟运行一次测试,看看是否有问题,所以我需要我的测试快速运行。(这就是为什么我只想运行 UT 而不是 IT 测试)。

好像在业界,说UT的时候,UT应该很小(范围),还要mock外部依赖。我不认为这是一种好的思维方式,因为这意味着我的 UT 可能会错过 IT 捕获的错误,这意味着每隔几分钟只运行一次 UT 是不够的,我应该运行速度慢得多的 IT 测试对我不利,因为重构过程将花费我更长的时间。

那么我错过了什么?为什么不编写像 IT 一样测试完整流程但要模拟外部依赖项的 UT?谢谢

标签: javaunit-testingtestingautomated-testsintegration-testing

解决方案


通常单元测试是涵盖单个类的单个方法的测试。

在面向对象编程中,一个单元通常是一个完整的接口,例如一个类,但也可以是一个单独的方法(https://en.wikipedia.org/wiki/Unit_testing

一个区别是人们认为是一个单位。面向对象的设计倾向于将类视为单元,过程或功能方法可能会将单个函数视为一个单元。但实际上这是一个情境性的事情 - 团队决定什么是有意义的,以便他们理解系统及其测试的目的。尽管我从单元是一个类的概念开始,但我经常将一堆密切相关的类视为一个单元。我很少将类中的方法子集作为一个单元。但是你定义它并不重要(https://martinfowler.com/bliki/UnitTest.html

通常你有单元测试覆盖小块代码和集成测试,测试几个类/模块之间的集成。而且你运行单元测试的频率比 IT 测试要高得多。

小单元测试的目的是尽可能精确地定位导致错误的代码。如果您使用多个类的 It 测试失败,那么您需要一一检查所有这些类以发现问题。但是,如果涵盖单个类的单个方法的单元测试失败,那么您确切地知道问题出在哪里。


推荐阅读