【JUnit技术专题】「入门到精通系列」手把手+零基础带你玩转单元测试,让你的代码更加“强壮”(基本用法篇)

206 阅读3分钟

回顾一下JUnit

JUnit是一个回归测试框架,开发者使用它来实施应用程序的单元测试,以提高编码质量和加快程序编写速度。JUnit测试框架可以轻松地完成以下任意两种结合:

  • IDEA 集成开发环境
  • Gradle 项目构建管理
  • Maven 项目构建管理

JUnit的特性

JUnit测试框架的四个重要特性:测试工具、测试套件、测试运行器和测试分类。 在这里插入图片描述 ]其中,测试工具是JUnit提供的一组API,用于编写和运行单元测试;测试套件是将多个测试类组合在一起的一种方式,可以一次性运行多个测试类;测试运行器是用于运行测试的程序,可以选择要运行的测试类或测试套件;测试分类是JUnit 5中的新特性,可以根据不同的标签对测试进行分类和过滤。这些特性使得JUnit成为一款强大的测试框架,可以帮助开发者快速、准确地进行单元测试。

测试工具

测试工具是一整套固定的工具,用于进行基线测试。其目的在于确保测试能够在共享且固定的环境中运行,从而保证测试结果的可重复性。测试工具集包含以下两个方法:

  1. setUp() 方法:在所有测试调用指令发起前执行,用于初始化测试环境和准备测试数据。

  2. tearDown() 方法:在测试方法运行后执行,用于清理测试环境和资源,以确保下一个测试可以在干净的环境中运行。

具体的案例

让我们来看一个例子:

import junit.framework.*;
public class JavaTest extends TestCase {
  protected int value1, value2;
  // assigning the values
  protected void setUp(){
    value1=3;
    value2=3;
  }
 // test method to add two values
 public void testAdd(){
   double result= value1 + value2;
   assertTrue(result == 6);
 }
}

测试套件

测试套件是一种将多个测试案例捆绑在一起并同时运行的方法。在 JUnit 中,@RunWith 和 @Suite 注解被用于运行测试套件。

import org.junit.runner.RunWith;
import org.junit.runners.Suite;
//JUnit Suite Test
@RunWith(Suite.class)
@Suite.SuiteClasses({TestJunit1.class ,TestJunit2.class})
public class JunitTestSuite {
}

下面是使用 TestJunit1 和 TestJunit2 进行测试分类的示例:

建立一个TestJUnit1单元测试执行类

import org.junit.Test;
import org.junit.Ignore;
import static org.junit.Assert.assertEquals;
public class TestJunit1 {
	String message = "Robert";
	MessageModel messageUtil = new MessageModel (message);
	@Test
	public void testPrintMessage() {
		System.out.println("Inside testPrintMessage()");
		assertEquals(message, messageUtil.printMessage());
	}
}

建立一个TestJUnit2单元测试执行类

import org.junit.Test;
import org.junit.Ignore;
import static org.junit.Assert.assertEquals;
public class TestJunit2 {
   String message = "Robert";
   MessageModel messageUtil = new MessageModel (message);
   @Test
   public void testSalutationMessage() {
      System.out.println("Inside testSalutationMessage()");
      message = "Hi!" + "Robert";
      assertEquals(message,messageUtil.salutationMessage());
   }
}

测试运行器

测试运行器用于执行测试案例。以下是一个假定测试分类成立的示例:

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

测试分类

测试分类是在编写和测试 JUnit 的重要分类。几种重要的分类如下:

  • 包含一套测试断言方法的测试断言。
  • 包含规范运行多个测试工具的测试用例。
  • 包含用于收集执行测试用例结果的方法的测试结果。

案例分析

下面的案例代码:

import org.junit.Test;
import org.junit.experimental.categories.Category;

public class JunitTest {

    @Category(SlowTests.class)
    @Test
    public void slowTest() {
        // 这里是慢速测试的测试代码
    }

    @Category(FastTests.class)
    @Test
    public void fastTest() {
        // 这里是快速测试的测试代码
    }

    public interface SlowTests {
        // 慢速测试接口
    }

    public interface FastTests {
        // 快速测试接口
    }
}

在上面的代码中,我们定义了两个测试接口 SlowTests 和 FastTests,用于标记测试方法属于哪个分类。在 slowTest() 方法上,我们使用了 @Category 注解,将该方法标记为慢速测试,并将其放入 SlowTests 接口中。同样的,fastTest() 方法被标记为快速测试,并放入 FastTests 接口中。

通过这种方式,我们可以轻松地对测试进行分类,并在运行测试时只运行特定的分类。例如,我们可以只运行慢速测试,而跳过快速测试,或者反过来。这样可以大大提高测试的效率和准确性。