常见的 Java 单元测试框架有 JUnit、TestNG、Spock 等。
JUnit
JUnit 是一个 Java 单元测试框架,它是一个 Open Source 软件,遵循 Apache2.0 许可。JUnit 提供了一些注解和断言,可以使用它们编写测试代码。
示例说明
- 创建被测试类
public class Calculator {
public int add(int a, int b) {
return a + b;
}
}
- 创建测试类
import org.junit.jupiter.api.*;
import static org.junit.jupiter.api.Assertions.assertEquals;
public class CalculatorTest {
private Calculator calculator;
@BeforeEach
void setUp() {
this.calculator = new Calculator();
}
@Test
void testAdd() {
assertEquals(5, calculator.add(2, 3));
}
}
在此测试类中,我们使用了 @BeforeEach
注解来初始化 Calculator 实例。@Test
注解测试了我们的 add
方法是否能够正确执行。
- 运行测试
在 Maven 中运行测试有两种方法:在命令行中使用 mvn test
或使用 IDE 中的测试运行器。
在命令行中输入 mvn test
,你会看到以下输出信息:
[INFO] Scanning for projects...
[INFO]
[INFO] ---------< org.example:junit5-demo >----------
[INFO] Building junit5-demo 1.0-SNAPSHOT
[INFO] --------------------------------------------
[INFO]
[INFO] --- maven-resources-plugin:3.1.0:resources (default-resources) @ junit5-demo ---
...
[INFO] --- maven-surefire-plugin:2.22.2:test (default-test) @ junit5-demo ---
[INFO]
[INFO] -------------------------------------------------------
[INFO] T E S T S
[INFO] -------------------------------------------------------
[INFO] Running CalculatorTest
13:18:38.617 [main] DEBUG org.junit.platform.launcher.core.EngineDiscoveryOrchestrator - Initializing engine: junit-jupiter
13:18:38.628 [main] DEBUG org.junit.platform.launcher.core.EngineDiscoveryOrchestrator - Engine discovery finished. Details: EngineDescriptor( id = 'junit-jupiter', displayName = 'JUnit Jupiter' )
13:18:38.635 [main] INFO org.junit.jupiter.engine.execution.JupiterEngineExecutionContext - Running test method 'testAdd' with @Test()
13:18:38.635 [main] INFO org.junit.jupiter.engine.execution.JupiterEngineExecutionContext - Executing test method [testAdd] with result: success
13:18:38.636 [main] DEBUG org.junit.jupiter.engine.execution.JupiterEngineExecutionContext - Clearing execution context for test method [testAdd]
13:18:38.649 [main] INFO org.junit.jupiter.engine.execution.JupiterEngineExecutionContext - Finished executing test method [testAdd]
13:18:38.653 [main] INFO org.junit.jupiter.engine.execution.JupiterEngineExecutionContext - Finished execution of Jupiter test plan.
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.923 s - in CalculatorTest
[INFO]
...
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 7.254 s
[INFO] Finished at: 2022-01-25T13:18:39+08:00
[INFO] ------------------------------------------------------------------------
在测试完成后,也可以在生成目录 target/surefire-reports
中查看测试报告。
TestNG
TestNG 是一个测试框架,最初是为了与 JUnit 兼容但在某些方面更强大而创建的。TestNG 在 JUnit 的基础上添加了新的功能,例如测试分组、依赖性测试等。
示例说明
- 创建被测试类
public class Calculator {
public int add(int a, int b) {
return a + b;
}
}
- 创建测试类
import org.testng.annotations.*;
import static org.testng.Assert.assertEquals;
public class CalculatorTest {
private Calculator calculator;
@BeforeMethod
public void setUp() {
calculator = new Calculator();
}
@Test
public void testAdd() {
assertEquals(calculator.add(2, 3), 5);
}
}
注意:在 TestNG 中,测试用例需要使用 @Test
注解标注,而在 JUnit 中是 @Test
。
- 运行测试
在 Maven 中运行 TestNG 测试用例,需要添加 maven-surefire-plugin
插件,并指定 testng.xml
用例配置文件。
在 pom.xml 中添加以下插件:
<dependencies>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>7.5.0</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.2</version>
<configuration>
<suiteXmlFiles>
<suiteXmlFile>src/test/resources/testng.xml</suiteXmlFile>
</suiteXmlFiles>
</configuration>
</plugin>
</plugins>
</build>
在 src/test/resources/
目录下创建 testng.xml
文件:
<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd" >
<suite name="Example Suite">
<test name="Example Test">
<classes>
<class name="CalculatorTest" />
</classes>
</test>
</suite>
最后,在命令行中输入 mvn clean test
,即可运行 TestNG 测试用例。
Spock
Spock 是一种基于 Groovy 的测试框架,用于编写功能化测试和单元测试。它既支持 JUnit 接口,又提供了自己的 DSL(Junit样式的数据驱动语言)。
示例说明
- 创建被测试类
public class Calculator {
public int add(int a, int b) {
return a + b;
}
}
- 创建测试类
import spock.lang.*
class CalculatorSpec extends Specification {
def "test add method"() {
given:
Calculator calculator = new Calculator()
when:
int result = calculator.add(a, b)
then:
result == expected
where:
a | b | expected
1 | 2 | 3
3 | 4 | 7
5 | 6 | 11
}
}
在 Spock 中,使用 def
声明一个测试方法,其中 given
表示在测试前的准备工作,when
表示执行测试代码,then
表示期望输出的结果。
在 where
块中,我们可以通过添加多个数组来测试多个输入。对于每一组输入,执行 given
,when
和 then
块,从而测试方法的不同输入。
- 运行测试
由于 Spock 基于 Groovy,因此需要配置 Groovy 插件和 Spock 框架。在 pom.xml 中添加以下插件:
<build>
<plugins>
<plugin>
<groupId>org.codehaus.gmavenplus</groupId>
<artifactId>gmavenplus-plugin</artifactId>
<version>1.7.2</version>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>testCompile</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.spockframework</groupId>
<artifactId>spock-maven</artifactId>
<version>2.0-M2-groovy-3.0</version>
<executions>
<execution>
<goals>
<goal>test-compile</goal>
<goal>compile</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
运行 mvn spock:test
命令,即可运行 Spock 测试用例。
总结
JUnit、TestNG 和 Spock 都是 Java 中常用的单元测试框架。这三个框架都可以用于测试代码的正确性,但在不同的情况下可能会有不同的优劣,因此需要根据具体情况选择合适的框架来进行测试。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:常见的Java单元测试框架有哪些? - Python技术站