什么是JUnit注释?
JUnit注释是一种特殊形式的语法元数据,可以添加到Java源代码中以获得更好的代码可读性和结构。这是Junit3和Junit4的最大区别,因为Junit4是基于注释的。
有了Junit5中的注释知识,就可以很容易地学习和实现JUnit测试。以下是重要且常用的JUnit注释列表:
编号 | 注释 | 描述 |
---|---|---|
1. | @Test | 该注释是org.juit.TestCase的替换,后者指示它所附加到的public void方法可以作为测试用例执行。 |
2. | @Before | 如果想要在每个测试用例之前执行一些语句,如前置条件,则使用此注释。 |
3. | @BeforeClass | 如果想要在所有测试用例之前执行一些语句,例如,测试连接必须在所有测试用例之前执行,则使用此注释。 |
4. | @After | 如果想要在每个测试用例之后执行一些语句,例如重置变量、删除临时文件、变量等,则可以使用此注释。 |
5. | @AfterClass | 如果想要在所有测试用例之后执行一些语句,例如,在执行所有测试用例之后释放资源,则可以使用此注释。 |
6. | @Ignore | 如果想在测试执行期间忽略某些语句,例如在测试执行期间禁用某些测试用例,则可以使用此注释。 |
7. | @Test (timeout=500) | 如果想在测试执行期间设置一些超时,例如,如果在某个SLA(服务级别协议)下工作,并且测试需要在指定的时间内完成,则可以使用此注释。 |
8. | @Test (expected=IllegalArgumentException.class) | 如果希望在测试执行期间处理某些异常,则可以使用此注释。例如,如果想检查特定方法是否抛出指定的异常。 |
在本教程中,将了解-
- JUnit注释示例
- JUnit断言类
- JUnit测试用例类
- JUnit TestResult类
- JUnit测试套件类
JUnit注释示例
让我们用简单的print语句创建一个覆盖重要JUnit注释的类,并用一个test runner类执行它:
步骤1) 考虑下面具有附加到上述注释的各种方法的Java类:
JunitAnnotationsExample.java
package guru.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) 让我们创建一个test runner类来执行上述测试:
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(JunitAnnotationsExample.class);
for (Failure failure : result.getFailures()) {
System.out.println(failure.toString());
}
System.out.println("Result=="+result.wasSuccessful());
}
}
预期结果
- 所有的测试用例将被逐个执行,并且所有的打印语句都可以在控制台上看到。
- 正如JUnit中的@BeforeAnnotation在上表中所讨论的, @BeforeClass [方法 m1() 和m2()] 将分别在每个测试用例和所有测试用例之前执行。
- 与JUnit中的@After相同, @After Class(方法 m3() 和M4())将分别在每个测试用例和所有测试用例之后执行。 @Ignore (方法 m6() )将被视为忽略测试。
让我们详细分析一下上述java类中使用的测试用例:
- 考虑如下所示的方法 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() 必须将int值作为“1”返回。
- 因此, assertEquals(1, list.size() )必须返回TRUE。
- 因此,测试用例将通过。
- 考虑如下所示的方法 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) 注释用于在测试用例中强制超时。
- 考虑如下所示的方法 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()将抛出“没有这样的方法异常”。因此,测试将在执行时出现异常。
由于所有测试用例都通过了,这将导致测试执行成功。
实际效果
由于上面的例子中有三个测试用例,所以所有的测试用例都将逐个执行。参见下面的输出:

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) | 功能是检查条件是否为假。 |
3. | void assertNotNull(Object object) | “assertNotNull”功能是检查对象是否不为空。 |
4. | void assertNull(Object object) | “assertNull”功能是检查对象是否为空。 |
5. | void assertTrue(boolean condition) | “assertTrue”功能是检查条件是否为真。 |
6. | void fail() | 如果想抛出任何断言错误,可以使用 fail() ,它总是导致判断失败。 |
7. | void assertSame([String message] | “assertSame”功能是检查这两个对象是否引用同一对象。 |
8. | void assertNotSame([String Message] | “assertNotSame”功能是检查这两个对象是否引用了同一个对象。 |
JUnit测试用例类
要运行多个测试,可以在org.juit.TestCase包中使用TestCase类。 @Test注释告诉JUnit它所附加的这个void public 方法(这里是Test case)可以作为测试用例运行。
下表显示了org.juit.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对象的形式)。此测试结果可以是失败的,也可以是成功的。
org.juit.TestResult类中使用的重要方法见下表:
美国编号: | 方法 | 描述 |
---|---|---|
1. | void addError(Test test, Throwable t) | 如果需要向测试添加错误,则使用此方法。 |
2. | void addFailure(Test test, AssertionFailedError t) | 如果需要将故障添加到故障列表,则使用此方法。 |
3. | void endTest(Test test) | 此方法用于通知测试为 performed(completed) |
4. | int errorCount() | 此方法用于获取在测试执行期间检测到的错误。 |
5. |
Enumeration
|
此方法只返回错误集合(此处为枚举)。 |
6. | int failureCount() | 此方法用于获取在测试执行期间检测到的错误计数。 |
7. | void run(TestCase test) | 此方法用于执行测试用例。 |
8. | int runCount() | 此方法只对执行的测试进行计数。 |
9. | void startTest(Test test) | 此方法用于通知测试已开始。 |
10. | void stop() | 此方法用于测试要停止的运行。 |
JUnit测试套件类
如果想要以指定的顺序执行多个测试,可以通过将所有测试组合到一个位置来完成。这个地方叫做测试套间。
org.juit.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