【JAVA-UT】9、Rule--个体的规范

文|码术张

#####一、如何使用Rule

下面这个测试类TimeoutTest,有两个Test方法,分别在打印一个字母后,睡眠2000毫秒和4000毫秒。

public class TimeoutTest {
  @Test
  public void should_timeout1() throws InterruptedException {
    System.out.println("A...");
    Thread.sleep(2000);
  }

  @Test
  public void should_timeout2() throws InterruptedException {
    System.out.println("B...");
    Thread.sleep(4000);
  }
}

后来公司要求,每个Test方法运行时间不能超过3000毫秒,如果超过了3000毫秒,就算失败。

如何实现这一功能?

需两步:

  1. 获得一个定时器对象

public TestRule timeout = Timeout.millis(3000);

  1. 使用Rule注解
@Rule
public TestRule timeout = Timeout.millis(3000);

修改后,测试类如下:

public class TimeoutTest {
  @Rule
  public TestRule timeout = Timeout.millis(3000);

  @Test
  public void should_timeout1() throws InterruptedException {
     System.out.println("A...");
     Thread.sleep(2000);
  }

  @Test
  public void should_timeout2() throws InterruptedException {
     System.out.println("B...");
     Thread.sleep(4000);
  }
}

运行结果为:
睡眠2000ms的Test方法成功,
睡眠4000ms的Test方法should_timeout2失败。
1541388504275.png

为什么呢?

因为本例子中,Rule限制了每一个Test方法运行时间不能超过3000ms。

可以看到Rule是如何使用的:

1541388841122.png

注意:

  1. 所要注解的对象必须声明为public。
  2. Rule只能注解TestRule类型的对象。

本例中Timeout类型是TestRule的子类型。

如果非TestRule类型或其子类型,运行时就会报错。

例如用Rule注解String类型对象。

public class TimeoutTest {
  @Rule
  public String name = "abc";

  @Test
  public void should_timeout1() throws InterruptedException {
    System.out.println("A...");
    Thread.sleep(4000);
  }
}

运行结果如下,提示@Rule要注解MethodRule或TestRule(实际上,MethodRule已经被TestRule代替了)。
1539843982099.png
#####二、 3种TestRule类的功能介绍

有哪些TestRule类呢?

当前,Junit4提供了8类TestRule:

ErrorCollector
ExpectedException
ExternalResource
TemporaryFolder
TestName
TestWatcher
Timeout
Verifier

下面介绍常用的3种。

  1. Timeout

​ Timeout规定每个test方法的可运行时间,如果这么想,就错了。
​ Timeout只是设置了一个定时器,并不规定每个test方法的运行时间。
​ 这定时器被Rule拿来使用,以达到规定每个test方法运行时间的目的。

  1. TestName

    获取当前运行的方法的名字。

    public class Sample {
      @Rule
      public TestName name = new TestName();
    
      @Test
      public void John() {
        System.out.println("my name is: " + name.getMethodName());
      }
    }
    

运行结果为:
1539929275418.png

  1. TemporaryFolderTemporaryFolder
    它是一个用于创建、删除临时文件或文件夹的工具。
    但何时创建、销毁,并不是这个工具的功能,而是Rule的功能。

    下面举例说明,如何创建文件。

public class RuleTest {
  @Rule
  public TemporaryFolder tmpFolder = new TemporaryFolder();

  @Test
  public void should_existFile() throws IOException {
    // when
    File file = tmpFolder.newFile("myfile.txt");

    // then
    assertTrue(file.isFile());
  }
}

运行中,Junit会自动创建一个文件夹junit2973493844983643175,创建的文件就在这一文件夹中。
运行结束,这个文件夹junit2973493844983643175及其中的文件会自动删除。
1540791154867.png

1540791187281.png

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值