JUnit的@Test注解与实例

什么是JUnit注释?

JUnit注释是一种特殊形式的语法元数据,可以添加到Java源代码中以获得更好的代码可读性和结构。这是Junit3和Junit4的最大区别,因为Junit4是基于注释的。

有了Junit5中的注释知识,就可以很容易地学习和实现JUnit测试。以下是重要且常用的JUnit注释列表:

编号 注释 描述
1. @Test 该注释是org.juit.TestCase的替换,后者指示它所附加到的public void方法可以作为测试用例执行。
2. @Before 如果想要在每个测试用例之前执行一些语句,如前置条件,则使用此注释。
3. @BeforeClass 如果想要在所有测试用例之前执行一些语句,例如,测试连接必须在所有测试用例之前执行,则使用此注释。
4. @After 如果想要在每个测试用例之后执行一些语句,例如重置变量、删除临时文件、变量等,则可以使用此注释。
5. @AfterClass 如果想要在所有测试用例之后执行一些语句,例如,在执行所有测试用例之后释放资源,则可以使用此注释。
6. @Ignore 如果想在测试执行期间忽略某些语句,例如在测试执行期间禁用某些测试用例,则可以使用此注释。
7. @Test (timeout=500) 如果想在测试执行期间设置一些超时,例如,如果在某个SLA(服务级别协议)下工作,并且测试需要在指定的时间内完成,则可以使用此注释。
8. @Test (expected=IllegalArgumentException.class) 如果希望在测试执行期间处理某些异常,则可以使用此注释。例如,如果想检查特定方法是否抛出指定的异常。

在本教程中,将了解-

  • JUnit注释示例
  • JUnit断言类
  • JUnit测试用例类
  • JUnit TestResult类
  • JUnit测试套件类

JUnit注释示例

让我们用简单的print语句创建一个覆盖重要JUnit注释的类,并用一个test runner类执行它:

步骤1) 考虑下面具有附加到上述注释的各种方法的Java类:

JunitAnnotationsExample.java

package guru.junit;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import java.util.ArrayList;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;
public class JunitAnnotationsExample {
    private ArrayList<String> list;
    @BeforeClass
    public static void m1() {
        System.out.println("Using @BeforeClass , executed before all test cases ");
    }
    @Before
    public void m2() {
        list = new ArrayList<String>();
        System.out.println("Using @Before annotations ,executed before each test cases ");
    }
    @AfterClass
    public static void m3() {
        System.out.println("Using @AfterClass ,executed after all test cases");
    }
    @After
    public void m4() {
        list.clear();
        System.out.println("Using @After ,executed after each test cases");
    }
    @Test
    public void m5() {
        list.add("test");
        assertFalse(list.isEmpty());
        assertEquals(1, list.size());
    }
    @Ignore
    public void m6() {
        System.out.println("Using @Ignore , this execution is ignored");
    }
    @Test(timeout = 10)
    public void m7() {
        System.out.println("Using @Test(timeout),it can be used to enforce timeout in JUnit4 test case");
    }
    @Test(expected = NoSuchMethodException.class)
    public void m8() {
        System.out.println("Using @Test(expected) ,it will check for specified exception during its execution");
    }
}

步骤2) 让我们创建一个test runner类来执行上述测试:

TestRunner.java

package guru.junit;
import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;
public class TestRunner {
    public static void main(String[] args) {
        Result result = JUnitCore.runClasses(JunitAnnotationsExample.class);
        for (Failure failure : result.getFailures()) {
            System.out.println(failure.toString());
        }
        System.out.println("Result=="+result.wasSuccessful());
    }
}

预期结果

  • 所有的测试用例将被逐个执行,并且所有的打印语句都可以在控制台上看到。
  • 正如JUnit中的@BeforeAnnotation在上表中所讨论的, @BeforeClass [方法 m1() 和m2()] 将分别在每个测试用例和所有测试用例之前执行。
  • 与JUnit中的@After相同, @After Class(方法 m3() 和M4())将分别在每个测试用例和所有测试用例之后执行。 @Ignore (方法 m6() )将被视为忽略测试。

让我们详细分析一下上述java类中使用的测试用例:

  1. 考虑如下所示的方法 m5() :
@Test
public void m5() {
    list.add("test");
    assertFalse(list.isEmpty());
    assertEquals(1, list.size());
}

在上面的方法中,当在变量“list”中添加字符串时,因此

  • list.isEmpty() 将返回False。
  • assertFalse(list.isEmpty() )必须返回TRUE。
  • 因此,测试用例将通过。

由于只在列表中添加了一个字符串,因此大小为1。

  • list.size() 必须将int值作为“1”返回。
  • 因此, assertEquals(1, list.size() )必须返回TRUE。
  • 因此,测试用例将通过。
  1. 考虑如下所示的方法 m7() :
@Test(timeout = 10)
public void m7() {
    System.out.println("Using @Test(timeout),it can be used to enforce timeout in JUnit4 test case");
}

如上所述,@ Test(timeout = 10) 注释用于在测试用例中强制超时。

  1. 考虑如下所示的方法 m8() :
@Test(expected = NoSuchMethodException.class)
public void m8() {
    System.out.println("Using @Test(expected) ,it will check for specified exception during its execution");
}

如上所述,@ Test(expected) 将在其执行期间检查指定的异常,因此方法M8()将抛出“没有这样的方法异常”。因此,测试将在执行时出现异常。

由于所有测试用例都通过了,这将导致测试执行成功。

实际效果

由于上面的例子中有三个测试用例,所以所有的测试用例都将逐个执行。参见下面的输出:

JUnit Annotations Example
JUnit Annotations Example

JUnit注释示例

参见以下可在控制台上看到的打印语句:

使用@BeforeClass,在所有测试用例之前执行

使用@Before注释,在每个测试用例之前执行

使用@After,在每个测试用例之后执行

使用@Before注释,在每个测试用例之前执行

使用@ Test(timeout) ,它可以用来在JUnit4测试用例中强制超时

使用@After,在每个测试用例之后执行

使用@Before注释,在每个测试用例之前执行

使用@Test(expected) ,它将在执行期间检查指定的异常

使用@After,在每个测试用例之后执行

使用@AfterClass,在所有测试用例之后执行

JUnit断言类

该类提供了一组在编写测试用例时有用的断言方法。如果任何ASSERT语句失败,则测试结果将失败。

如前所述,下表描述了重要的断言方法和说明:

编号 方法 描述
1. void assertEquals(boolean expected, boolean actual) 检查两个值是否与Object类的equals方法相似
2. void assertFalse(boolean condition) 功能是检查条件是否为假。
3. void assertNotNull(Object object) “assertNotNull”功能是检查对象是否不为空。
4. void assertNull(Object object) “assertNull”功能是检查对象是否为空。
5. void assertTrue(boolean condition) “assertTrue”功能是检查条件是否为真。
6. void fail() 如果想抛出任何断言错误,可以使用 fail() ,它总是导致判断失败。
7. void assertSame([String message] “assertSame”功能是检查这两个对象是否引用同一对象。
8. void assertNotSame([String Message] “assertNotSame”功能是检查这两个对象是否引用了同一个对象。

JUnit测试用例类

要运行多个测试,可以在org.juit.TestCase包中使用TestCase类。 @Test注释告诉JUnit它所附加的这个void public 方法(这里是Test case)可以作为测试用例运行。

下表显示了org.juit.TestCase类中提供的一些重要方法:

编号 方法 描述
1. int countTestCases() 此方法用于统计 run(TestResult tr) 方法执行的测试用例数量。
2. TestResult createResult() 此方法用于创建TestResult对象。
3. String getName() 此方法返回一个字符串,它只是一个TestCase。
4. TestResult run() 此方法用于执行返回TestResult对象的测试
5. void run(TestResult result) 此方法用于执行具有不返回任何内容的TestResult对象的测试。
6. void setName(String name) 此方法用于设置TestCase的名称。
7. void setUp() 此方法用于编写资源关联代码。创建数据库连接。
8. void tearDown() 此方法用于编写资源释放代码。执行事务操作后释放数据库连接。

JUnit TestResult类

当执行测试时,它返回一个结果(以TestResult对象的形式)。此测试结果可以是失败的,也可以是成功的。
org.juit.TestResult类中使用的重要方法见下表:

美国编号: 方法 描述
1. void addError(Test test, Throwable t) 如果需要向测试添加错误,则使用此方法。
2. void addFailure(Test test, AssertionFailedError t) 如果需要将故障添加到故障列表,则使用此方法。
3. void endTest(Test test) 此方法用于通知测试为 performed(completed)
4. int errorCount() 此方法用于获取在测试执行期间检测到的错误。
5. Enumeration errors() 此方法只返回错误集合(此处为枚举)。
6. int failureCount() 此方法用于获取在测试执行期间检测到的错误计数。
7. void run(TestCase test) 此方法用于执行测试用例。
8. int runCount() 此方法只对执行的测试进行计数。
9. void startTest(Test test) 此方法用于通知测试已开始。
10. void stop() 此方法用于测试要停止的运行。

JUnit测试套件类

如果想要以指定的顺序执行多个测试,可以通过将所有测试组合到一个位置来完成。这个地方叫做测试套间。

org.juit.TestSuite类使用的重要方法见下表:

美国编号: 方法 描述
1. void addTest(Test test) 如果要将测试添加到套件,则使用此方法。
2. void addTestSuite(Class<? extends TestCase> testClass) 如果要在将测试添加到套件时指定类,则使用此方法。
3. int countTestCases() 如果要计算测试用例的数量,则使用此方法。
4. String getName() 此方法用于获取测试套件的名称。
5. void run(TestResult result) 此方法用于执行测试,并在TestResult对象中收集测试结果。
6. void setName(String name) 此方法用于设置TestSuite的名称。
7. Test testAt(int index) 如果要返回给定索引处的测试,则使用此方法。
8. int testCount() 如果要返回套件中的多个测试,则使用此方法。
9. static Test warning(String message) 此方法返回一个测试,该测试将失败并记录一条警告消息。

总结:

  • JUnit提供了一个可移植的API,它提供了编写单元测试所需的所有重要类和Selenium注释。
  • 类,这些类在编写测试用例时非常有用。
    • org.junit.Assert
    • org.junit.TestCase
    • org.junit.TestResult
    • org.junit.TestSuite
  • 重要且常用的JUnit注解列表

@Before

@BeforeClass

@After

@AfterClass

@Test

@Ignore

IT赶路人

专注IT知识分享