📝 博主首页 : 「测试界的飘柔」 ,同名公众号 :「伤心的辣条」
📝 面试求职: 「面试试题小程序」 ,内容涵盖 测试基础、Linux操作系统、MySQL数据库、Web功能测试、接口测试、APPium移动端测试、Python知识、Selenium自动化测试相关、性能测试、性能测试、计算机网络知识、Jmeter、HR面试,命中率杠杠的。(大家刷起来…)
📝 职场经验干货:
本篇文章旨在介绍单元测试的基本概念,介绍如何使用Mockito+PowerMock进行单元测试,对开发中坏代码进行预检测。在实际开发中,如果我们想保证代码的高质量,那必然需要写大量单元测试,需要对代码的各类各行及各分支覆盖的非常全面,而伴随而来的是我们又会面临代码在提交合并跑流水线的时间过长等问题,因此后续的文章将介绍一些涉及到单元测试的效率问题和其优化方法。
一、单元测试是什么?
单元测试(unit testing)是指对软件中的最小可测试单元进行检查和验证。它是软件测试中的一种基本方法,也是软件开发过程中的一个重要步骤。单元测试的目的是在于确保软件的每个独立模块都被正确地测试,并且没有潜在的缺陷或漏洞。在单元测试中,需要对每个模块进行测试,以确保它们能够按照预期的方式工作,并且没有任何错误或漏洞。
单元测试通常包括以下几个步骤:
确定测试范围:在开始测试之前,需要确定测试的范围,即要测试的功能或模块:函数、方法或类。
确定测试目标:确定要测试的功能或行为,并编写测试用例。
编写测试代码:根据确定的测试范围和测试目标,编写测试代码和用例,测试其功能或行为,这些代码和用例应该覆盖软件中的每个模块。
执行测试用例:使用测试工具(如JUnit、TestNG、Mock等)执行测试用例,以确保每个模块都按照预期的方式工作。
分析测试结果:在测试完成后,需要分析测试结果,以确定是否存在缺陷或漏洞。
修复缺陷或漏洞:如果发现缺陷或漏洞,需要修复它们,以确保软件的质量。
二、单元测试意义
提高代码质量和可靠性:单元测试可以检测和修复代码中的错误和缺陷,从而提高代码的质量和可靠性。
支持代码重构:单元测试可以在代码重构时提供保障,避免代码重构后引入新的错误和缺陷。
减少调试时间:单元测试可以快速定位和修复代码中的错误,从而减少调试时间和成本。
改善代码设计:单元测试要求程序员编写可测试的代码,这可以促进代码的模块化和松耦合,从而改善代码的设计和可维护性。
提高开发效率:单元测试可以自动化执行,从而节省开发人员的时间和精力,提高开发效率。
三、jar包引入
注意:本篇文章介绍的是Mockito框架和PowerMock框架的使用
Mockito 是一个流行的 Java 单元测试框架,用于模拟(mock)对象以便进行单元测试。它可以帮助开发人员创建和管理模拟对象,以便在测试过程中替换那些不容易构造或获取的对象,从而达到测试被测代码的行为,而无需依赖于实际的外部系统或服务。
Mockito的主要特点包括:
模拟对象:Mockito 允许创建模拟对象,这些模拟对象具有与真实对象相似的行为,但实际上只是虚拟的对象实例。通过模拟对象,可以模拟外部依赖、交互行为等,从而使测试更加独立和可控。
验证行为:Mockito 提供了丰富的 API 来验证模拟对象的交互行为,例如方法是否被调用、调用次数、参数匹配等。通过验证行为,可以确保被测代码按预期执行了与外部系统的交互。
Stubbing 方法:Mockito 允许对模拟对象的方法进行 Stubbing,即定义当调用某个方法时应该返回的值。这样可以模拟不同的场景和条件,以覆盖多种测试情况。
灵活性:Mockito 提供了简洁且易于使用的 API,支持与 JUnit、TestNG 等测试框架集成。同时,它还提供了丰富的功能和扩展,可以满足各种测试场景的需求。
PowerMock是一个强大的Java单元测试框架,它扩展了JUnit和TestNG的功能,允许开发者模拟静态方法、私有方法、构造函数以及最终类。PowerMock的出现,解决了传统单元测试工具无法覆盖的测试场景,使得测试更加全面和深入。
PowerMock的主要特点包括:
模拟静态方法:PowerMock能够模拟Java中的静态方法,这是传统测试框架所无法做到的。
模拟私有方法:通过PowerMock,开发者可以轻松测试类的私有方法。
模拟构造函数:PowerMock允许模拟对象的构造过程,这对于测试依赖于特定构造行为的代码非常有用。
模拟最终类:PowerMock提供了模拟Java最终类(final classes)的能力,打破了Java语言层面的限制。
高级模拟特性:包括模拟回调、结果和序列等高级功能,使得测试更加灵活和强大。
1. 各jar包版本依赖关系
方式一:目前来说SpringBoot默认的Mock框架是Mockito,和junit一样,只需要依赖spring-boot-starter-test就可以。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
方式二:如果是单独添加依赖,那么可以按照如下添加依赖 推荐此方式
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<powermock.version>2.0.7</powermock.version>
<mockito.core.version>2.13.0</mockito.core.version>
</properties>
<dependencies>
<!-- powermock jar引入 -->
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-mockito2</artifactId>
<version>${powermock.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-support</artifactId>
<version>${powermock.version}</version>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4</artifactId>
<version>${powermock.version}</version>
<exclusions>
<exclusion>
<groupId>org.objenesis</groupId>
<artifactId>objenesis</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- mockito jar引入 -->
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>${mockito.core.version}</version>
<exclusions>
<exclusion>
<groupId>org.objenesis</groupId>
<artifactId>objenesis</a