JUnit 注解教程及示例:什么是 @Test 和 @After

什么是JUnit注解?

JUnit注解是一种特殊形式的句法元数据,可以添加到Java源代码中,以提高代码可读性和结构。变量、参数、包、方法和类都可以被注解。注解是在Junit4中引入的,它使Java代码更具可读性和简洁性。这是Junit3和Junit4之间的主要区别,Junit4是基于注解的。

有了Junit5中注解的知识,就可以轻松学习和实现JUnit测试。下面是重要且常用的JUnit注解列表

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

JUnit注解示例

让我们创建一个包含重要JUnit注解并带有简单打印语句的类,并使用测试运行器类执行它。

步骤 1) 考虑下面的java类,它有各种附加到上述注解的方法。

JunitAnnotationsExample.java

package guru99.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) 让我们创建一个测试运行器类来执行上面的测试

TestRunner.java

package guru99.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中的@Before注解和@BeforeClass(方法m1()和m2())将分别在每个和所有测试用例之前执行。
  • 同样地,JUnit中的@After和@AfterClass(方法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() 必须返回整数值“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() 将抛出“NoSuchMethodException”。结果,测试将带异常执行。

由于所有测试用例都已通过,因此测试执行成功。

实际结果

由于上述示例中有三个测试用例,所有测试用例将逐一执行。请参阅下面的输出

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) 功能是检查条件是否为false。
3. void assertNotNull(Object object) “assertNotNull”功能是检查对象是否不为null。
4. void assertNull(Object object) “assertNull”功能是检查对象是否为null。
5. void assertTrue(boolean condition) “assertTrue”功能是检查条件是否为true。
6. void fail() 如果您想抛出任何断言错误,您可以使用 fail(),它总是导致失败的判定。
7. void assertSame([String message] “assertSame”功能是检查两个对象是否引用同一个对象。
8. void assertNotSame([String message] “assertNotSame”功能是检查两个对象是否不引用同一个对象。

JUnit 测试用例类

要运行多个测试,TestCase类在org.junit.TestCase包中可用。@Test注解告诉JUnit,它所附加的这个public void方法(此处为Test Case)可以作为测试用例运行。

下表显示了 org.junit.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 对象的形 式)。此 TestResult 对象可用于分析结果对象。此测试结果可以是失败或成功。

请参见下表,其中列出了 org.junit.TestResult 类中使用的重要方法

序号 方法 描述
1. void addError(Test test, Throwable t) 如果您需要向测试添加错误,则使用此方法。
2. void addFailure(Test test, AssertionFailedError t) 如果您需要向失败列表中添加失败,则使用此方法。
3. void endTest(Test test) 此方法用于通知测试已执行(完成)
4. int errorCount() 此方法用于获取测试执行期间检测到的错误。
5. Enumeration<TestFailure> errors() 此方法只返回一个错误集合(此处为Enumeration)。
6. int failureCount() 此方法用于获取测试执行期间检测到的错误计数。
7. void run(TestCase test) 此方法用于执行测试用例。
8. int runCount() 此方法只计算已执行的测试数量。
9. void startTest(Test test) 此方法用于通知测试已开始。
10. void stop() 此方法用于停止测试运行。

JUnit Test Suite 类

如果您想按指定顺序执行多个测试,可以通过将所有测试组合到一个位置来完成。这个位置称为测试套件。

请参见下表,其中列出了 org.junit.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