1、什么是单元测试
单元测试是针对最小的功能单元编写测试代码(Java 程序最小的功能单元是方法)单元测试就是针对单个Java方法的测试。
2、为什么要使用单元测试
-
确保单个方法运行正常;
-
如果修改了代码,只需要确保其对应的单元测试通过。
-
可以自动化运行所有测试并获得报告。
3、JUnit单元测试框架介绍
JUnit 是一个开源的Java语言的单元测试框架专门针对Java语言设计,使用最为广泛。使用断言测试期望结果,可以方便地查看测试结果。
4、JUnit应用
1、工程目录创建
最终的目录结构:
2、代码
MathUtils
package com.jr.math;
public class MathUtils {
public static int sum(int i1, int i2){
return i1 + i2;
}
}
MathUtilsTest
package com.jr.math;
import org.junit.Assert;
import org.junit.Test;
public class MathUtilsTest {
@Test
public void sumTest() {
int sum1 = MathUtils.sum(1, 1);
Assert.assertEquals(2, sum1);
int sum2 = MathUtils.sum(1, 2);
Assert.assertEquals(3, sum2);
int sum3 = MathUtils.sum(1, 3);
Assert.assertEquals(3, sum3);
}
}
输出
java.lang.AssertionError:
Expected :3
Actual :4
<Click to see difference>
at org.junit.Assert.fail(Assert.java:88)
at org.junit.Assert.failNotEquals(Assert.java:834)
at org.junit.Assert.assertEquals(Assert.java:645)
at org.junit.Assert.assertEquals(Assert.java:631)
at com.jr.math.MathUtilsTest.sumTest(MathUtilsTest.java:19)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)
at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:230)
at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:58)
3、代码说明
MathUtils的sum方法是测试目标方法,MathUtilsTest是单元测试类,sumTest是测试方法。
@Test是测试注解,只有添加了这个注解的方法才能进行单元测试。(注解是Java的一种类,后面会学习到)
Assert是断言类,用于判断方法结果和预期结果是否匹配。
测试方法中做了三次测试,显然最后一次方法的执行结果和预期结果不同,会输出报错信息。
4、Assert
常用方法:
assertEquals(100, X):断言相等。
assertArrayEquals((1,2,3, X):断言数组相等。
assertEquals(3.1416, X, 0.0001):浮点数断言相等。由于浮点型数据是有精度概念的,所以在测试浮点型值时要多添加一个delta参数,表示计算结果和预期结果之间允许的偏差。
assertNull(X):断言为nul。
assertTrue(x >0):断言为true。
assertFalse(x >0):断言为false。
assertNotEquals:断言是否不同。
assertNotNull:断言是否不为null。
5、注意事项
- JUnit测试一定要有断言,没有断言的测试方法不是标准测试方法,因为没有断言就代表没有做预期结果的比对。
- 肉眼比对不算真正的预期结果比对,因为再次测试时仍需肉眼比对,不能做到自动化,且可能存在人为失误。
- @Test是测试方法的入口,不要用main方法做为入口。
- 在创建测试类时,一般和测试目标类的包名相同。
- 不要给单元测试方法写测试方法。
5、其它几个注解【了解】
注解 | 说明 |
---|---|
@Test | 将一个方法标记为测试方法 |
@Before | 每一个测试方法调用前必执行的方法 |
@After | 每一个测试方法调用后必执行的方法 |
@BeforeClass | 所有测试方法调用前执行一次,在测试类没有实例化之前就已被加载,需用static修饰 |
@AfterClass | 所有测试方法调用后执行一次,在测试类没有实例化之前就已被加载,需用static修饰 |
@Ignore | 暂不执行该方法 |
以上几个注解了解即可,以后的工作都基于框架开发,在学习框架后会学习基于框架如何使用JUnit。