JUnit 是 java 编程语言理想的单元测试框架。
概述
一个正式的编写好的单元测试用例的特点是:已知输入和预期输出,即在测试执行前就已知。已知输入需要测试的先决条件,预期输出需要测试后置条件。
每一项需求至少需要两个单元测试用例:一个正检验,一个负检验。如果一个需求有子需求,每一个子需求必须至少有正检验和负检验两个测试用例。
框架
测试工具是一整套固定的工具用于基线测试。测试工具的目的是为了确保测试能够在共享且固定的环境中运行,因此保证测试结果的可重复性。它包括:
- 在所有测试调用指令发起前的 setUp() 方法。
- 在测试方法运行后的 tearDown() 方法。
1 import junit.framework.*; 2 3 public class JavaTest extends TestCase { 4 protected int value1, value2; 5 6 // assigning the values 7 protected void setUp(){ 8 value1=3; 9 value2=3; 10 } 11 12 // test method to add two values 13 public void testAdd(){ 14 double result= value1 + value2; 15 assertTrue(result == 6); 16 } 17 }
测试套件意味捆绑几个测试案例并且同时运行。在 JUnit 中,@RunWith 和 @Suite 都被用作运行测试套件。以下为使用 TestJunit1 和 TestJunit2 的测试分类:
当一个类被注解@RunWith
或扩展了一个注解的类时@RunWith
,JUnit将调用其引用的类以在该类中运行测试,而不是JUnit内置的运行器。JUnit 4中的套件是使用RunWith和一个名为Suite的自定义运行程序构建的。
@RunWith(Suite.class) @SuiteClasses(ATest.class,BTest.class,CTest.class) 公共类ABCSuite { }
例:
import org.junit.runner.RunWith; import org.junit.runners.Suite; //JUnit Suite Test @RunWith(Suite.class) @Suite.SuiteClasses({ TestJunit1.class ,TestJunit2.class }) public class JunitTestSuite { } import org.junit.Test; import org.junit.Ignore; import static org.junit.Assert.assertEquals; public class TestJunit1 { String message = "Robert"; MessageUtil messageUtil = new MessageUtil(message); @Test public void testPrintMessage() { System.out.println("Inside testPrintMessage()"); assertEquals(message, messageUtil.printMessage()); } } import org.junit.Test; import org.junit.Ignore; import static org.junit.Assert.assertEquals; public class TestJunit2 { String message = "Robert"; MessageUtil messageUtil = new MessageUtil(message); @Test public void testSalutationMessage() { System.out.println("Inside testSalutationMessage()"); message = "Hi!" + "Robert"; assertEquals(message,messageUtil.salutationMessage()); } }
测试运行器 用于执行测试案例。
测试分类是在编写和测试 JUnit 的重要分类。几种重要的分类如下:
- 包含一套断言方法的测试断言
- 包含规定运行多重测试工具的测试用例
- 包含收集执行测试用例结果的方法的测试结果
JUnit - 基本用法
创建一个类
/* * 一个传入string类型并打印输出的类。 */ public class MessageUtil { private String message; //Constructor //@param message to be printed public MessageUtil(String message){ this.message = message; } // prints the message public String printMessage(){ System.out.println(message); return message; } }
创建 Test Case 类
- 创建一个名为 TestJunit.java 的测试类。
- 向测试类中添加名为 testPrintMessage() 的方法。
- 向方法中添加 Annotaion @Test。
- 执行测试条件并且应用 Junit 的 assertEquals API 来检查。
import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class TestJunit {
String message = "Hello World";
MessageUtil messageUtil = new MessageUtil(message);
@Test
@此处实际是判断的return是否正确
/*
*该Test
注解告诉JUnit的是,public void
到其附着方法可以运行作为一个测试用例。
*为了运行该方法,JUnit首先构造一个新的类实例,然后调用带注释的方法。测试抛出的任何异常都将由JUnit报告为失败。
*如果未引发任何异常,则假定测试成功。
*/
public void testPrintMessage() {
assertEquals(message,messageUtil.printMessage());
}
}
创建 Test Runner 类
import org.junit.runner.JUnitCore; import org.junit.runner.Result; import org.junit.runner.notification.Failure;
//创建一个 TestRunner 类 public class TestRunner { public static void main(String[] args) {
//运用 JUnit 的 JUnitCore 类的 runClasses 方法来运行上述测试类的测试案例 Result result = JUnitCore.runClasses(TestJunit.class);
//获取 Result Object 的 getFailures() 方法中的失败结果 for (Failure failure : result.getFailures()) { System.out.println(failure.toString()); }
//获取 Result object 的 wasSuccessful() 方法中的成功结果 System.out.println(result.wasSuccessful()); } }