JUnit 注解教程及示例:什么是 @Test 和 @After
什么是JUnit注解?
JUnit注解是一种特殊形式的句法元数据,可以添加到Java源代码中,以提高代码可读性和结构。变量、参数、包、方法和类都可以被注解。注解是在Junit4中引入的,它使Java代码更具可读性和简洁性。这是Junit3和Junit4之间的主要区别,Junit4是基于注解的。
有了Junit5中注解的知识,就可以轻松学习和实现JUnit测试。下面是重要且常用的JUnit注解列表
序号 | 注解 | 描述 |
---|---|---|
1. | @Test | 此注解替代了org.junit.TestCase,表示它所附加的public void方法可以作为测试用例执行。 |
2. | @Before | 如果您想在每个测试用例之前执行一些语句(例如前置条件),则使用此注解。 |
3. | @BeforeClass | 如果您想在所有测试用例之前执行一些语句,例如测试连接必须在所有测试用例之前执行,则使用此注解。 |
4. | @After | 如果您想在每个测试用例之后执行一些语句,例如重置变量、删除临时文件、变量等,则可以使用此注解。 |
5. | @AfterClass | 如果您想在所有测试用例之后执行一些语句,例如在执行所有测试用例后释放资源,则可以使用此注解。 |
6. | @Ignores | 如果您想在测试执行期间忽略某些语句,例如在测试执行期间禁用某些测试用例,则可以使用此注解。 |
7. | @Test(timeout=500) | 如果您想在测试执行期间设置一些超时,例如如果您在某些SLA(服务级别协议)下工作,并且测试需要在指定时间内完成,则可以使用此注解。 |
8. | @Test(expected=IllegalArgumentException.class) | 如果您想在测试执行期间处理一些异常,则可以使用此注解。例如,如果您想检查特定方法是否抛出指定异常。 |
JUnit注解示例
让我们创建一个包含重要JUnit注解并带有简单打印语句的类,并使用测试运行器类执行它。
步骤 1) 考虑下面的java类,它有各种附加到上述注解的方法。
JunitAnnotationsExample.java
package guru99.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) 让我们创建一个测试运行器类来执行上面的测试
TestRunner.java
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(JunitAnnotationsExample.class); for (Failure failure : result.getFailures()) { System.out.println(failure.toString()); } System.out.println("Result=="+result.wasSuccessful()); } }
预期结果
- 所有测试用例将逐一执行,所有打印语句都可以在控制台上看到。
- 如上表所述,JUnit中的@Before注解和@BeforeClass(方法m1()和m2())将分别在每个和所有测试用例之前执行。
- 同样地,JUnit中的@After和@AfterClass(方法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() 必须返回整数值“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() 将抛出“NoSuchMethodException”。结果,测试将带异常执行。
由于所有测试用例都已通过,因此测试执行成功。
实际结果
由于上述示例中有三个测试用例,所有测试用例将逐一执行。请参阅下面的输出
请参阅控制台上显示的以下打印语句
使用 @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) | 功能是检查条件是否为false。 |
3. | void assertNotNull(Object object) | “assertNotNull”功能是检查对象是否不为null。 |
4. | void assertNull(Object object) | “assertNull”功能是检查对象是否为null。 |
5. | void assertTrue(boolean condition) | “assertTrue”功能是检查条件是否为true。 |
6. | void fail() | 如果您想抛出任何断言错误,您可以使用 fail(),它总是导致失败的判定。 |
7. | void assertSame([String message] | “assertSame”功能是检查两个对象是否引用同一个对象。 |
8. | void assertNotSame([String message] | “assertNotSame”功能是检查两个对象是否不引用同一个对象。 |
JUnit 测试用例类
要运行多个测试,TestCase类在org.junit.TestCase包中可用。@Test注解告诉JUnit,它所附加的这个public void方法(此处为Test Case)可以作为测试用例运行。
下表显示了 org.junit.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 对象的形 式)。此 TestResult 对象可用于分析结果对象。此测试结果可以是失败或成功。
请参见下表,其中列出了 org.junit.TestResult 类中使用的重要方法
序号 | 方法 | 描述 |
---|---|---|
1. | void addError(Test test, Throwable t) | 如果您需要向测试添加错误,则使用此方法。 |
2. | void addFailure(Test test, AssertionFailedError t) | 如果您需要向失败列表中添加失败,则使用此方法。 |
3. | void endTest(Test test) | 此方法用于通知测试已执行(完成) |
4. | int errorCount() | 此方法用于获取测试执行期间检测到的错误。 |
5. | Enumeration<TestFailure> errors() | 此方法只返回一个错误集合(此处为Enumeration)。 |
6. | int failureCount() | 此方法用于获取测试执行期间检测到的错误计数。 |
7. | void run(TestCase test) | 此方法用于执行测试用例。 |
8. | int runCount() | 此方法只计算已执行的测试数量。 |
9. | void startTest(Test test) | 此方法用于通知测试已开始。 |
10. | void stop() | 此方法用于停止测试运行。 |
JUnit Test Suite 类
如果您想按指定顺序执行多个测试,可以通过将所有测试组合到一个位置来完成。这个位置称为测试套件。
请参见下表,其中列出了 org.junit.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