初识Junit
JUnit是一个测试框架,它使用注解来标识指定测试的方法。JUnit是一个在Github上托管的开源项目。
如何在利用JUnit定义测试方法
JUnit测试是一个仅用于测试类中使用的方法,这被称为测试类。要定义某个方法是测试方法,需要使用 @Test 注解对其进行注释。
该方法用于执行测试中的代码。使用由JUnit或其他断言框架提供的断言方法来检查预期结果与实际结果。这些方法调用通常称为断言或断言语句。你需要提供一个有意义的断言结果。这使我们更容易的识别和解决问题。
JUnit测试的例子
第一篇文章我们其实已经通过JUnit简单的介绍了单元测试,现在我们再来详细介绍一下,待测试的类Calculator存在一个add(int, int)方法,以下代码显示了使用JUnit4测试这个类的方法。
import org.junit.Assert; import org.junit.Test; public class CalculatorTest { @Test public void testAdd() { int sum = Calculator.add(1, 2); Assert.assertEquals(3, sum); } } |
定义测试方法
Assert(断言)
JUnit通过Assert类提供一系列静态的方法来测试某些条件是否通过。这些断言方法通常以assert开头,它们允许您指定错误信息,预期结果和实际结果。一个断言方法比较通过测试返回预期值实际值。如果比较失败将会抛出AssertionException。
下表给出了这些方法的概述。[]括号中的参数是可选的,并且是String类型的
JUnit test suites(测试套件)
如果你有几个测试类都涉及某个类,且这个类发生了变化,你可以将它们组合成一个测试套件。运行测试套件以指定的顺序执行该套件中的所有测试类。测试套件还可以包含其他测试套件。
以下示例代码演示了测试套件的用法。它包含两个测试类(ExampleUnitTest和CalculatorTest)。如果你想添加另一个测试类,你可以将它添加到@Suite.SuiteClasses语句中。
@RunWith(Suite.class) @SuiteClasses({ExampleUnitTest.class, CalculatorTest.class}) public class AllTests { } |
Parameterized test(参数化测试)
JUnit允许你在测试类中使用参数。该类可以包含一个测试方法,并且此方法使用提供的不同参数执行。
将测试类标记为带@RunWith(Parameterized.class)注释的参数化测试。
这样的测试类必须包含一个用@Parameters注释标注的静态方法。该方法生成并返回一组数组。此集合中的每个项目都用作测试方法的参数。可以@Parameter在公共字段上使用注释来获取测试中注入的测试值。
以下代码显示了参数化测试的示例:
@RunWith(Parameterized.class) public class ParameterizedFiledTest { // fields used together with @Parameter must be public @Parameter(0) public int m1; @Parameter(1) public int m2; @Parameter(2) public int result; // creates the test data @Parameters public static Collection<Object[]> data() { Object[][] data = new Object[][]{{1, 2, 3}, {5, 3, 15}}; return Arrays.asList(data); } @Test public void testAdd() { assertEquals(result, Calculator.add(m1, m2)); } } |
或者提供类的构造函数,测试值通过构造函数传递给类
@RunWith(Parameterized.class) public class ParameterizedConstructorTest { private int m1; private int m2; private int result; public ParameterizedConstructorTest(int m1, int m2, int result) { this.m1 = m1; this.m2 = m2; this.result = result; System.out.println("ParameterizedConstructorTest"); } // creates the test data @Parameters public static Collection<Object[]> data() { Object[][] data = new Object[][]{{1, 2, 3}, {5, 3, 8}}; return Arrays.asList(data); } @Test public void testAdd() { Assert.assertEquals(result, Calculator.add(m1, m2)); } } |
JUnit Rules
Rules允许在测试类中非常灵活地添加或重新定义每个测试方法的行为。测试人员可以重用或扩展下面提供的Rules之一,或者自己编写Rules。
Verifier: 验证测试执行结果的正确性。
ErrorCollector: 收集测试方法中出现的错误信息,测试不会中断,如果有错误发生测试结束后会标记失败。
ExpectedException: 提供灵活的异常验证功能。
Timeout: 用于测试超时的Rule。
ExternalResource: 外部资源管理。
TemporaryFolder: 在JUnit的测试执行前后,创建和删除新的临时目录。
TestWatcher: 监视测试方法生命周期的各个阶段。
TestName: 在测试方法执行过程中提供获取测试名字的能力。
简单的说就是提供了测试用例执行过程中一些通用功能的共享的能力,使我们不必重复编写一些功能类似的代码。JUnit用于标注Rule的注解包括@Rule和@ClassRule,区别在于作用域不同@Rule的作用域是测试方法,@ClassRule则是测试Class。
以下代码显示了实现的使用Verifier:
public class RuleTest { private static String sequence; public static class UsesVerifier { @Rule public Verifier collector = new Verifier() { @Override protected void verify() { sequence += "verify "; } }; @Test public void example() { sequence += "test "; } } @Test public void verifierRunsAfterTest() { sequence = ""; assertThat(testResult(UsesVerifier.class), isSuccessful()); assertEquals("test verify ", sequence); } } |
有关现有Rules的更多示例,请参阅https://github.com/junit-team/junit4/wiki/Rules
上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理。