JUnit 单元测试。
JUnit 是一个 Java 语言的单元测试框架。它由 Kent Beck 和 Erich Gamma 建立,逐渐成为源于 Kent Beck 的 sUnit 的 xUnit 家族中最为成功的一个。 JUnit 有它自己的 JUnit 扩展生态圈。多数 Java 的开发环境都已经集成了JUnit 作为单元测试的工具。
JUnit 是由 Erich Gamma 和 Kent Beck 编写的一个回归测试框架(regression testing framework)。Junit 测试是程序员测试,即所谓白盒测试,因为程序员知道被测试的软件如何(How)完成功能和完成什么样(What)的功能。Junit 是一套框架,继承 TestCase 类,就可以用 Junit 进行自动测试了。
测试分类。
黑盒测试:不需要写代码,给输入值,看程序是否能够输出期望的值。
白盒测试:需要写代码。关注程序具体的执行流程。—> JUnit。
原先测试步骤。
一般建议的测试项目结构。
package com.geek.junitDemo;
public class Calculator {
/**
* 加法。
*
* @param a
* @param b
* @return
*/
public int add(int a, int b) {
return a + b;
}
/**
* 减法。
*
* @param a
* @param b
* @return
*/
public int sub(int a, int b) {
return a - b;
}
}
在需要测试的类所在包下创建 ./test 包,创建 CalculatorTest.java。(需要测试的类 + Test.java)。
package com.geek.junitDemo.test;
import com.geek.junitDemo.Calculator;
public class CalculatorTest {
public static void main(String[] args) {
// 创建对象。
Calculator calculator = new Calculator();
// 调用。
int result = calculator.add(1, 2);
System.out.println("result = " + result);
int subResult = calculator.sub(1, 1);
System.out.println("subResult = " + subResult);
}
}
存在的问题。
每个类需要独立运行,⇒ 一个 main()方法。
改进:使用 JUint
。
项目创建的建议。
测试类。
类名:被测试的类名 + Test。eg. CalculatorTest
包名:xxx.xxxx.test。eg. com.geek.test
测试方法。
方法名:test + 测试的方法名。eg. testAdd()。
返回值:void
参数列表:空参。
给方法加注解。
如果是第一次使用,本地可能没有依赖,IDEA 提供自动下载。(Maven Dependencies)
会自动加入到项目的 lib 目录下,并自动 Add Ad Library...
现在就可以使用了。
此时类声明处会出现绿色圈圈。点击 ta 可以运行测试。
如果测试运行成功,下面会变绿。
而测试失败则会变红警告。
断言。
一般如果测试结果为绿色也不一定说明测试结果是我们想要的。
比如,我要测试 1 + 1 是否为 2。但我调用了 sub()方法,结果为 0,不是我想要的结果,但是测试是已经通过了。
这里就需要使用断言
。
package com.geek.junitDemo.test;
import com.geek.junitDemo.Calculator;
import org.junit.Assert;
import org.junit.Test;
public class CalculatorTest {
@Test
public void testAdd() {
System.out.println("JUnit test running...");
// 创建对象。
Calculator calculator = new Calculator();
// 调用。
int result = calculator.sub(1, 2);
System.out.println("result = " + result);
// 断言。断言结果是 3。
Assert.assertEquals(3, result);
}
}
@Before & @After
如果测试方法较多,并且每个方法中有大量的重复代码,(如资源的申请,释放资源等。)
这时可以新创建两个方法,
一个用于定义执行该测试方法之前所需要执行的操作,(用 @Before 注解)。
一个用于定义执行该测试方法之后所需要执行的操作,(用 @After 注解)。
执行该测试方法前后,会自动调用这两种方法。
(并且在该类所有测试方法都生效)。
package com.geek.junitDemo.test;
import com.geek.junitDemo.Calculator;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
public class CalculatorTest {
@Before
public void before() {
System.out.println("before...");
}
@After
public void after() {
System.out.println("after...");
}
@Test
public void testAdd() {
System.out.println("JUnit test running...");
System.out.println("testAdd()...");
// 创建对象。
Calculator calculator = new Calculator();
// 调用。
int result = calculator.add(1, 2);
System.out.println("result = " + result);
// 断言。断言结果是 3。
Assert.assertEquals(3, result);
}
}