JUnit测试用例@BeforeClass注解

JUnit是Java中最流行的单元测试框架。明确建议将其用于单元测试。JUnit不需要服务器来测试Web应用程序,这使得测试过程变得快速。

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

什么是测试夹具

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

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

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. 分配(setup)
    2. 取消分配(tearDown)。

setup和tearDown

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

下面讨论这些JUnit注释-

setup

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

tearDown(无论判决如何)

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

注:

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

示例:使用file作为测试装置创建类

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 Test case example
JUnit Test case example
  1. createOutputFile()
  2. testFile1()
  3. deleteOutputFile()
  4. createOutputFile()
  5. testFile2()
  6. deleteOutputFile()

假设:
testFile1() 在testfile2()之前运行–这是不能保证的。

一次性设置

  • 在执行任何测试之前,并且在任何@ method(s) 之前,对于整个测试类,一个方法只能运行一次。
  • “只设置一次”对于启动服务器、打开通信等非常有用。为每次测试关闭并重新打开资源非常耗时。
  • 这可以使用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.juit.runner.JUnitCore提供的名为runClasses的方法用于运行一个或多个测试类。
  • 此方法的返回类型是结果对象(org.juit.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 guru.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

要执行我们的测试方法(上面),我们需要创建一个测试运行器。在测试运行器中,我们已经测试过了,它将根据测试是通过还是失败来返回测试结果。

有关这方面的更多详细信息,参阅下面的代码:

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(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 Test case example
JUnit Test case example

总结

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

IT赶路人

专注IT知识分享