JUnit 测试用例 @Before @BeforeClass 注解

JUnit 是 Java 中最流行的单元测试框架。它明确推荐用于单元测试。JUnit 无需服务器即可测试 Web 应用程序,这使得测试过程快速。

JUnit 框架还允许快速轻松地生成测试用例和测试数据。org.Junit 包包含许多用于 JUnit 测试的接口和类,例如 Test、Assert、After、Before 等。

什么是测试夹具

在我们了解什么是测试夹具之前,让我们先研究下面的代码

此代码旨在对一个简单文件执行两个测试用例。

public class OutputFileTest {
    private File output; 
    output = new File(...);
    output.delete(); 
public void testFile1(){
        //Code to verify Test Case 1
}
    output.delete();
    output = new File(...);
public void testFile2(){
        //Code to verify Test Case 2
}
 output.delete(); 
}

这里有一些问题

  • 代码不可读
  • 代码不易维护。
  • 当测试套件复杂时,代码可能包含逻辑问题。

使用 JUnit 比较相同的代码

public class OutputFileTest		
{
    private File output; 
    @Before public void createOutputFile() 
    { 
       output = new File(...);
    }
  
	@After public void deleteOutputFile() 
    {
        output.delete(); 
    } 
     
    @Test public void testFile1() 
    {
       // code for test case objective
    } 
	@Test public void testFile2() 
    {
       // code for test case objective
    }
}

代码更具可读性和可维护性。上述代码结构是一个测试夹具。

测试夹具是 JUnit测试用例运行的上下文。通常,测试夹具包括

  • 可用于任何测试用例的对象或资源。
  • 使这些对象/资源可用的所需活动。
  • 这些活动是
    1. 分配(设置
    2. 解除分配(拆卸)。

设置和拆卸

  • 通常,在每个测试用例之前必须完成一些重复性任务。示例:创建数据库连接。
  • 同样,在每个测试用例结束时,可能有一些重复性任务。示例:在测试执行结束后进行清理。
  • JUnit 提供了有助于设置和拆卸的注解。它确保资源被释放,并且测试系统处于为下一个测试用例做好准备的状态。

这些 JUnit 注解如下讨论-

设置

JUnit 中的 @Before 注解用于在每个测试用例之前运行Java 代码的方法。也就是说,它在每次测试执行之前运行。

拆卸(无论结果如何)

@After 注解用于在每个测试用例之后运行 Java 代码的方法。这些方法即使在测试用例中抛出任何异常或断言失败的情况下也会运行。

注意

  • 允许列出任意数量的上述注解。
  • JUnit 中所有用 @Before 注解的方法都将在每个测试用例之前运行,但它们的运行顺序可能不确定。
  • 您可以从超类继承 @Before 和 @After 方法,执行顺序如下:这是 JUnit 中的标准执行过程。
  1. 执行超类中的 JUnit @Before 方法
  2. 执行此类中的 @Before 方法
  3. 执行此类中的 @Test 方法
  4. 执行此类中的 @After 方法
  5. 执行超类中的 @After 方法

示例:创建以文件作为测试夹具的类

public class OutputFileTest		
{
    private File output; 
    @Before	public void createOutputFile() 
    { 
       output = new File(...);
    }
  
	@After public void deleteOutputFile() 
    {
        output.delete(); 
    } 
     
    @Test public void testFile1() 
    {
       // code for test case objective
    } 
	@Test public void testFile2() 
    {
       // code for test case objective
    }
}

在上面的示例中,执行链将如下所示:

Setup and Teardown

  1. createOutputFile()
  2. testFile1()
  3. deleteOutputFile()
  4. createOutputFile()
  5. testFile2()
  6. deleteOutputFile()

假设

testFile1() 在 testFile2() 之前运行——这不是保证的。

仅一次设置

  • 可以为整个测试类只运行一次方法,即在任何测试执行之前,以及在任何 @Before 方法之前。
  • “仅一次设置”对于启动服务器、打开通信等非常有用。为每个测试关闭和重新打开资源非常耗时。
  • 这可以使用 JUnit 中的 @BeforeClass 注解来完成。
@BeforeClass public static void Method_Name() {	
    // class setup code here	
 }	

仅一次拆卸

  • 与仅一次设置类似,也提供了仅一次清理方法。它在所有测试用例方法和 @After 注解执行后运行。
  • 它对于停止服务器、关闭通信链接等非常有用。
  • 这可以使用 @AfterClass 注解来完成
 @AfterClass public static void Method_Name()	
 {	
    // class cleanup code here	
 }	

JUnit 测试套件

如果我们要按指定顺序执行多个测试,可以通过将所有测试组合到一个地方来完成。这个地方被称为测试套件。关于如何执行测试套件以及如何在 JUnit 中使用它的更多详细信息将在此教程中介绍。

Junit 测试运行器

JUnit 提供了一个用于执行测试用例的工具。

  • JUnitCore 类用于执行这些测试。
  • org.junit.runner.JUnitCore 提供的名为 runClasses 的方法用于运行一个或多个测试类。
  • 此方法的返回类型是 Result 对象 (org.junit.runner.Result),用于访问有关测试的信息。请参见下面的代码示例以获得更清晰的理解。
public class Test {				
			public static void main(String[] args) {									
       		Result result = JUnitCore.runClasses(CreateAndSetName.class);					
			for (Failure failure : result.getFailures()) {							
         		System.out.println(failure.toString());					
      }		
      System.out.println(result.wasSuccessful());					
   }		
}      

在上面的代码中,“result”对象经过处理,以获取我们正在执行的测试用例的失败和成功结果。

第一个 JUnit 程序

对 SDLC、Java 编程和软件测试过程基础知识的良好理解有助于理解 JUnit 程序。

让我们通过一个实际示例来理解单元测试。我们需要创建一个测试类,其中包含一个用 @Test 注解的测试方法,如下所示

MyFirstClassTest.java

package guru99.JUnit;		

import static org.JUnit.Assert.*;				

import org.JUnit.Test;		

public class MyFirstClassTest {				

    @Test		
    public void myFirstMethod(){					
        String str= "JUnit is working fine";					
        assertEquals("JUnit is working fine",str);					
    }
}		

TestRunner.java

为了执行我们的测试方法(上面),我们需要创建一个测试运行器。在测试运行器中,我们必须将测试类作为参数添加到 JUnitCore 的 runclasses() 方法中。它将根据测试是否通过或失败返回测试结果。

有关此内容的更多详细信息,请参见下面的代码

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(MyFirstClassTest.class);					
			for (Failure failure : result.getFailures()) {							
              System.out.println(failure.toString());					
      }		
      System.out.println("Result=="+result.wasSuccessful());							
   }		
}      	

输出

一旦 TestRunner.java 执行我们的测试方法,我们就会得到失败或通过的输出。请在下面找到输出说明

  1. 在此示例中,执行 MyFirstClassTest.java 后,测试通过,结果为绿色。
  2. 如果失败,它应该显示红色结果,并且可以在失败跟踪中观察到失败。请参阅下面的 JUnit GUI

JUnit program Output

摘要

  • JUnit 是一个支持多种注解的框架,用于标识包含测试的方法。
  • JUnit 提供了一个名为 @Test 的注解,它告诉 JUnit,它所使用的公共 void 方法可以作为测试用例运行。
  • 测试夹具是测试用例运行的上下文
  • 要按指定顺序执行多个测试,可以通过将所有测试组合到一个地方来完成。这个地方被称为测试套件。
  • JUnit 提供了一个用于执行测试的工具,我们可以在其中运行我们的测试用例,称为测试运行器。