JUnit是什么?

JUnit是用于编写和运行可重复的自动化测试的开源测试框架, 这样可以保证我们的代码按预期工作。

JUnit可广泛用于工业和作为支架(从命令行)或IDE(如Eclipse)内单独的Java程序。

JUnit提供

  1. 断言测试预期结果。
  2. 测试功能共享通用的测试数据。
  3. 测试套件轻松地组织和运行测试。
  4. 图形和文本测试运行。

JUnit用于测试

  1. 整个对象
  2. 对象的一部分 - 交互的方法或一些方法
  3. 几个对象之间的互动(交互)

JUnit的特点

  1. JUnit是用于编写和运行测试的开源框架。
  2. 提供了注释,以确定测试方法。
  3. 提供断言测试预期结果。
  4. 提供了测试运行的运行测试。
  5. JUnit测试让您可以更快地编写代码,提高质量
  6. JUnit是优雅简洁。它是不那么复杂以及不需要花费太多的时间。
  7. JUnit测试可以自动运行,检查自己的结果,并提供即时反馈。没有必要通过测试结果报告来手动梳理。
  8. JUnit测试可以组织成测试套件包含测试案例,甚至其他测试套件。
  9. Junit显示测试进度的,如果测试是没有问题条形是绿色的,测试失败则会变成红色。

JUnit简单示例

使用工具:eclipse

测试类:

Calculate.java

public class Calculate {

    public int sum(int var1, int var2) {
        System.out.println("相加的值是: " + var1 + " + " + var2);
        return var1 + var2;
    }

}

CalculateTest.java

public class CalculateTest {

    Calculate calculation = new Calculate();
    int sum = calculation.sum(2, 5);
    int testSum = 7;

    @Test
    public void testSum() {
        System.out.println("@Test sum(): " + sum + " = " + testSum);
        assertEquals(sum, testSum);
    }

}

@Test的注解在 testSum()方法的上方。 这个注释指示该公共无效(public void)方法它所附着可以作为一个测试用例。
因此,testSum()方法将用于测试公开方法 sum() 。

方法 assertEquals(sum, testsum)。
assertEquals ([String message], object expected, object actual) 方法持有两个对象作为输入,并断言这两个对象相等。

如果要运行测试类,右键点击测试类,并选择 Run As -> Junit Test

JUnit注解

在本节中,我们将提到支持在JUnit4基本注释,下表列出了这些注释的概括:

注解 描述
@Test
public void method()
测试注释指示该公共无效方法它所附着可以作为一个测试用例。
@Before
public void method()
Before注释表示,该方法必须在类中的每个测试之前执行,以便执行测试某些必要的先决条件。
@BeforeClass
public static void method()
BeforeClass注释指出这是附着在静态方法必须执行一次并在类的所有测试之前。发生这种情况时一般是测试计算共享配置方法(如连接到数据库)。
@After
public void method()
After 注释指示,该方法在执行每项测试后执行(如执行每一个测试后重置某些变量,删除临时变量等)
@AfterClass
public static void method()
当需要执行所有的测试在JUnit测试用例类后执行,AfterClass注解可以使用以清理建立方法,(从数据库如断开连接)。注意:附有此批注(类似于BeforeClass)的方法必须定义为静态。
@Ignore
public static void method()
当想暂时禁用特定的测试执行可以使用忽略注释。每个被注解为@Ignore的方法将不被执行。

让我们看看一个测试类,在上面提到的一些注解的一个例子。

AnnotationsTest.java

package com.yiibai.junit;

import static org.junit.Assert.*;
import java.util.*;
import org.junit.*;

public class AnnotationsTest {

private ArrayList testList;

@BeforeClass
public static void onceExecutedBeforeAll() {
System.out.println("@BeforeClass: onceExecutedBeforeAll");
}

@Before
public void executedBeforeEach() {
testList = new ArrayList();
System.out.println("@Before: executedBeforeEach");
}

@AfterClass
public static void onceExecutedAfterAll() {
System.out.println("@AfterClass: onceExecutedAfterAll");
}

@After
public void executedAfterEach() {
testList.clear();
System.out.println("@After: executedAfterEach");
}

@Test
public void EmptyCollection() {
assertTrue(testList.isEmpty());
System.out.println("@Test: EmptyArrayList");
}

@Test
public void OneItemCollection() {
testList.add("oneItem");
assertEquals(1, testList.size());
System.out.println("@Test: OneItemArrayList");
}

@Ignore
public void executionIgnored() {
System.out.println("@Ignore: This execution is ignored");
}
}

如果我们运行上面的测试,控制台输出将是以下几点:

@BeforeClass: onceExecutedBeforeAll
@Before: executedBeforeEach
@Test: EmptyArrayList
@After: executedAfterEach
@Before: executedBeforeEach
@Test: OneItemArrayList
@After: executedAfterEach
@AfterClass: onceExecutedAfterAll

JUnit断言

在本节中,我们将介绍一些断言方法。所有这些方法都受到 Assert 类扩展了java.lang.Object类并为它们提供编写测试,以便检测故障。下表中有一种最常用的断言方法的更详细的解释。

断言描述
void assertEquals([String message], expected value, actual value)断言两个值相等。值可能是类型有 int, short, long, byte, char or java.lang.Object. 第一个参数是一个可选的字符串消息
void assertTrue([String message], boolean condition)断言一个条件为真
void assertFalse([String message],boolean condition)断言一个条件为假
void assertNotNull([String message], java.lang.Object object)断言一个对象不为空(null)
void assertNull([String message], java.lang.Object object)断言一个对象为空(null)
void assertSame([String message], java.lang.Object expected, java.lang.Object actual)断言,两个对象引用相同的对象
void assertNotSame([String message], java.lang.Object unexpected, java.lang.Object actual)断言,两个对象不是引用同一个对象
void assertArrayEquals([String message], expectedArray, resultArray)断言预期数组和结果数组相等。数组的类型可能是 int, long, short, char, byte or java.lang.Object.

让我们看的一些前述断言的一个例子。

AssertionsTest.java

package com.yiibai.junit;

import static org.junit.Assert.*;
import org.junit.Test;

public class AssertionsTest {

@Test
public void test() {
    String obj1 = "junit";
    String obj2 = "junit";
    String obj3 = "test";
    String obj4 = "test";
    String obj5 = null;
    int var1 = 1;
    int var2 = 2;
    int[] arithmetic1 = { 1, 2, 3 };
    int[] arithmetic2 = { 1, 2, 3 };

    assertEquals(obj1, obj2);

    assertSame(obj3, obj4);

    assertNotSame(obj2, obj4);

    assertNotNull(obj1);

    assertNull(obj5);

    assertTrue(var1  var2);

    assertArrayEquals(arithmetic1, arithmetic2);
}

}

在以上类中我们可以看到,这些断言方法是可以工作的。

  • assertEquals() 如果比较的两个对象是相等的,此方法将正常返回;否则失败显示在JUnit的窗口测试将中止。
  • assertSame() 和 assertNotSame() 方法测试两个对象引用指向完全相同的对象。
  • assertNull() 和 assertNotNull() 方法测试一个变量是否为空或不为空(null)。
  • assertTrue() 和 assertFalse() 方法测试if条件或变量是true还是false。
  • assertArrayEquals() 将比较两个数组,如果它们相等,则该方法将继续进行不会发出错误。否则失败将显示在JUnit窗口和中止测试。

文章转载自:易百教程 [http:/www.yiibai.com]