刚接触 Java 开发的朋友,是不是总听别人说 “写完代码要写单元测试”,但拿起 JUnit 就发懵?环境怎么配?测试方法怎么写?测完了怎么看结果?别着急,今天兔子哥就从最基础的环境配置开始,一步步讲到测试报告生成,全程大白话,零基础也能跟着学会,以后写单元测试再也不用愁!
一、先搞明白:单元测试到底是啥?为啥非要学 JUnit?
可能有新手会问,我代码能跑起来不就行了,为啥非得写单元测试?其实啊,单元测试就像给代码 “体检”,能帮你提前发现 bug。比如你写了个计算器工具类,加法学好了,但没测减法,上线后发现减法算错了,那多尴尬。而 JUnit 就是 Java 里最常用的单元测试框架,用它写测试简单又规范,几乎所有公司做 Java 开发都离不开它。
还有朋友会说,单元测试是不是很难?真不难!你想啊,单元测试就是调用你写的方法,然后看看结果对不对,跟你手动运行代码检查结果差不多,只不过用 JUnit 能自动执行,还能生成报告,效率高多了。兔子哥刚开始学的时候也怕麻烦,但用了几次就发现,写测试反而能让代码更靠谱,改代码的时候心里也有底。
二、环境配置:3 步搞定 JUnit 5,Maven/Gradle 都能用
学 JUnit 第一步肯定是搭环境,不管你用 Maven 还是 Gradle,几步就能搞定,新手别慌。
如果你用 Maven(最常见)
打开项目的 pom.xml 文件,把这段依赖贴进去,放在
xml
<dependency><groupId>org.junit.jupitergroupId><artifactId>junit-jupiter-apiartifactId><version>5.9.2version><scope>testscope>dependency><dependency><groupId>org.junit.jupitergroupId><artifactId>junit-jupiter-engineartifactId><version>5.9.2version><scope>testscope>dependency>这里的 version 用 5.9.x 就行,不用追求最新版,稳定最重要。加完记得刷新 Maven,让依赖下载下来。
如果你用 Gradle
打开 build.gradle,在 dependencies 里加这行:
groovy
testImplementation 'org.junit.jupiter:junit-jupiter:5.9.2'testRuntimeOnly 'org.junit.platform:junit-platform-launcher'然后点一下 Gradle 的同步按钮,依赖就配好了。
有朋友会问:为啥要加这两个依赖?api 是写测试用的,engine 是运行测试用的,少了哪个测试都跑不起来。配完环境,项目里的 src/test/java 目录就是放测试类的地方,这个目录不用自己建,Maven/Gradle 会自动生成。
三、写第一个测试方法:从 “Hello World” 级别的例子开始
环境搭好了,咱们写个最简单的测试练练手。假设你有个计算器类,长这样:
java
public class Calculator {// 加法方法public int add(int a, int b) {return a + b;}// 减法方法public int subtract(int a, int b) {return a - b;}}第一步:创建测试类
在 src/test/java 里建个包,最好跟 main 里的包名一样,比如 main 里是 com.example.demo,test 里也建 com.example.demo。然后新建测试类,名字就叫 CalculatorTest,记住测试类名一般是 “被测试类名 + Test”,这样找起来方便。
第二步:写测试方法
测试方法怎么写?看例子:
java
import org.junit.jupiter.api.Test;import static org.junit.jupiter.api.Assertions.assertEquals;public class CalculatorTest {// 测试加法@Testvoid testAdd() {// 创建被测试的对象Calculator calculator = new Calculator();// 调用方法得到结果int result = calculator.add(2, 3);// 断言结果是否正确(预期结果是5)assertEquals(5, result);}// 测试减法@Testvoid testSubtract() {Calculator calculator = new Calculator();int result = calculator.subtract(5, 2);// 预期结果是3assertEquals(3, result);}}这里有三个关键点要记牢:
- @Test 注解:加在方法上,告诉 JUnit 这是个测试方法,运行测试时会自动执行。
- 断言方法:比如 assertEquals (预期结果,实际结果),如果两边不一样,测试就会失败,红叉警告。
- 测试方法命名:最好能说明测试啥,比如 testAdd 就知道是测加法的,别起 test1、test2 这种名字,过几天就忘了。
写完后右键点测试类,选 “Run Tests”,如果看到绿色对勾,说明测试通过;要是红色叉号,就看看哪里错了,是不是代码写错了,还是预期结果设反了。
四、测试报告生成:不止看结果,还要有 “证据”
光自己知道测试过了还不够,团队协作或项目汇报时,得有个像样的报告。这时候就需要 JaCoCo 插件,它能生成带覆盖率的测试报告,哪些代码测了、哪些没测一目了然。
第一步:配置 JaCoCo 插件(以 Maven 为例)
在 pom.xml 的
xml
<plugins><plugin><groupId>org.jacocogroupId><artifactId>jacoco-maven-pluginartifactId><version>0.8.10version><executions><execution><goals><goal>prepare-agentgoal>goals>execution><execution><id>reportid><phase>testphase><goals><goal>reportgoal>goals>execution>executions>plugin>plugins>第二步:生成报告
在命令行里进入项目目录,执行 “mvn test” 命令,Maven 会自动运行测试并生成报告。跑完后,在项目的 target/site/jacoco 目录下,找到 index.html 文件,用浏览器打开,就能看到彩色的报告了。
报告里绿色的部分是被测试覆盖的代码,红色是没覆盖的,黄色是部分覆盖的。兔子哥每次写完测试都会看这个报告,看看有没有漏测的方法,尤其是核心逻辑,最好能做到 100% 覆盖,心里才踏实。
有朋友会问:覆盖率一定要 100% 吗?倒也不是,有些边缘代码可能很难测,但核心业务逻辑最好覆盖到,不然出 bug 的概率就高了。
五、新手常踩的坑,这些地方要注意
刚开始写 JUnit 测试,很容易在这些地方栽跟头,兔子哥帮你提前避坑:
坑 1:测试方法没加 @Test 注解
结果就是运行测试时方法不执行,还以为代码错了,其实就是忘了加注解。记住,每个测试方法都得加 @Test,少一个都不行。
坑 2:断言顺序搞反了
assertEquals (预期,实际),很多新手写成 assertEquals (实际,预期),虽然结果不对时也会报错,但提示信息会反过来,看着容易 confusion。比如应该是 assertEquals (5, result),写成 assertEquals (result, 5),报错会显示 “expected 5 but was 3”,顺序对了才好排查问题。
坑 3:测试类放错目录
把测试类放在了 src/main/java 里,结果运行时找不到。记住测试类必须放 src/test/java 目录下,Maven/Gradle 才会把它当测试类处理。
坑 4:依赖版本不对
用了 JUnit 4 的注解却加了 JUnit 5 的依赖,结果注解爆红。如果看到 @Test 注解报错,先检查依赖版本,JUnit 5 用的是 org.junit.jupiter.api.Test,JUnit 4 是 org.junit.Test,别弄混了。
六、兔子哥的一点心得,新手可以听听
学单元测试不用追求一步到位,刚开始能写出简单的测试方法,保证核心逻辑正确就行。慢慢熟悉了,再学参数化测试、异常测试这些高级用法。
其实写测试的过程也是梳理代码逻辑的过程,有时候写着测试就会发现,原来自己的代码设计有问题,比如某个方法依赖太多外部资源,测试不好写,这时候就可以优化代码结构,让代码更清晰、更易测试。
还有就是别害怕测试失败,测试失败不是坏事,说明它帮你找到了 bug,总比上线后被用户发现强。兔子哥刚开始写测试时,经常遇到测试失败,改着改着,代码质量就上去了,后来出 bug 的次数越来越少。
希望这篇教程能帮到刚开始学 JUnit 的你,从环境配置到报告生成,一步步练下来,你会发现单元测试没那么难。坚持写测试,不仅能让你的代码更靠谱,还能养成良好的开发习惯,对以后的职业发展也很有帮助。动手试试吧,你会爱上这种代码写完心里踏实的感觉!
标签: junit-jupiter-engine org.junit.jupiter
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
还木有评论哦,快来抢沙发吧~