Junit4单元测试 (三) 其他类型的Runner和其他功能

Runner,即Junit的运行器!

 Runner只是一个抽象类,表示用于运行Junit测试用例的工具,通过它可以运行测试并通知Notifier运行的结果。通常我们可以在待测方法所在的类之上使用@RunWith注解来为这个测试类指定一个特定的Runner。不过在很多情况下,我们并没有这么做,那是因为,我们使用了Junit的默认Runnner------BlockJunit4ClassRunner。当我们不为测试类添加@RunWith注解的时候,其实使用的就是这个Runner,它作为默认Runner只为我们提供了基本的基于Junit生命周期的测试注解。而有更多非常规的测试需求,则需要我们为测试类添加@RunWith注解并指定特定的Runner来完成!下面列出一些比较有用的Runner。

一、Suit——它可以一次生执行全面在多个类中的测试用例,例如:

@RunWith(Suite.class)
@SuiteClasses({Person.class, People.class})
public class TestSuitMain{
//虽然这个类是空的,但依然可以运行Junit测试,运行时,它会将Person.class和//People.class中的所有测试用命都执行一遍!
}

二、Parameterized——在普通的单元测试中被@Test注解标注的测试方法只能是public void的,且不能有任何输入参数。而这时常会给我们造成困扰,因为有时候我们需要为测试方法输入参数,甚至是批量指定多个待测参数。这时Parameterized这个Runner就能满足我们的要求,用法如下:

@RunWith(Parameterized.class)
public class TestGenerateParams{
private String greeting;
public TestGenerateParams(String greeting){
super();
this.greeting = greeting;
}
@Test
public void testParams(){ System.out.println(greeting);
}

/**
 * 这里的返回的应该是一个可迭代数组,且方法必须是public static
 * @return
 */
@Parameters
public static List getParams(){
    return Arrays.asList(new String[][]{{"hello"},{"hi"},{"good morning"},{"how are you"}});
}

}

三、Category——继承自Suit,更强大,它可以让我们对测试类中被测试的方法进行分类执行,例如Person对象具有一些属性,这些属性拥有get/set方法,同时还有一些普通方法。我们可以将获取属性的get方法和普通方法进行分类测试。如:

public class PersonTest{
@Category(AttributeFun.class)
@Test
public void testGetAge(){
int age = person.getAge();
assertEquals(3, age);
}
@Category(AttributeFun.class)
@Test
public void testGetName(){
String name = person.getName();
assertEquals(“Willard”, name);
}
@Category(BehaviorFun.class)
@Test
public void testTalk(){
String message = person.talkTo(“Jimy”);
assertNotNull(message);
}
@Category(BehaviorFun.class)
@Test(timeout=200)
public void testWalk(){
person.walk();
}
}

//对应的测试执行代码如下:
@RunWith(Categories.class)
@SuiteClasses(PersonTest.class)
@IncludeCategory(AttributeFun.class)
public class CategoryTest{
//注意,如果不加@IncludeCategory注解,那么就和使用Suit具有一样的效果了。
}

四、Theories——虽意为原理或推测的意思,但我在这里以更直观的方式表述它:提供一组参数的排列组合值作为待没方法的输入参数。同时注意到在使用Theories这个Runner的时候,我们的待测方法可以拥有输入参数,而这在其它的Runner中的测试方法是不成的。下面是一个例子:

@RunWith(Theories.class)public class TheoriesTest{
@DataPoint
public static String nameValue1 = “Tony”;
@DataPoint
public static String nameValue2 = “Jim”;
@DataPoint public static int ageValue1 = 10;
@DataPoint
public static int ageValue2 = 20;
@Theory
public void testMethod(String name, int age){
System.out.println(String.format(“%s’s age is %s”, name, age));
}
}

上面的代码的意思是,将”Tony”、”Jim”、10、20四个参数以类型合法的排列组合传给待没方法。因此输出的结果必然也有2x2=4种:

Tony's age is 10

Tony's age is 20

Jim's age is 10

Jim's age is 20

不过,为了简单,我们除了可以使用@DataPoint注解来提供参数之外,还可以通过@DataPoints注解来提供参数,参照上述代码,只需要将@DataPoint注解标注的四个字段参数替换为如下的两个即可:

@DataPoints
public static String[] names = {“Tony”, “Jim”};
@DataPoints
public static int[] ageValue1 = {10, 20};

上展示了四个Junit运行器的使用示例,有这个四个运行器的支持,基本上大部分的测试需求得可以得到解决。当然Junit提供的功能远不止这些。除此之外,我们还可以使用Junit4提供的Rule/Assume/Assert等。

其中使用Rule可以为单元测试指定测试规则,下面展示了这些可用的Rule:

   Verifier: 验证测试执行结果的正确性。

   ErrorCollector: 收集测试方法中出现的错误信息,测试不会中断,如果有错误发生测试结束后会标记失败。

   ExpectedException: 提供灵活的异常验证功能。

  Timeout: 用于测试超时的Rule。

  ExternalResource: 外部资源管理。

 TemporaryFolder: 在JUnit的测试执行前后,创建和删除新的临时目录。

 TestWatcher: 监视测试方法生命周期的各个阶段。

 TestName: 在测试方法执行过程中提供获取测试名字的能力。

此外,Assume表示假设,但它实际是对待没方法的参数进行合法性校验的,如果校验不合格则直接抛异常,而不执行测试。这和Guava中的Predictions类似。Assume提供的校验规则如下:

  assumeTrue/assumeFalse、 assumeNotNull、 assumeThat、 assumeNoException

例如:(通过下述代码也可以看到,要使用参数,则应使用@Theory注解)

@Theory
public void printAge(String name, int age){
Assume.assumeTrue(age > 0);//如果参数age<=0,会抛AssumptionViolatedException异常
System.out.println(String.format(“%s’s Name is %s.”, name, age));
}

Assert是Junit提供的断言,与Assume不同,Assert是对测试结果的校验,它提供的检验规则如下:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值