Junit 是怎么将执行结果收集并返回的

发表于:2021-7-07 09:36

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:磊叔_GLMapper    来源:掘金

  junit 所有执行的结果都存放在 Result 中:
  // 所有 case 数
  private final AtomicInteger count;
  // 忽略执行的 case 数(被打了 ignore)
  private final AtomicInteger ignoreCount;
  // 失败 case 数
  private final AtomicInteger assumptionFailureCount;
  // 所有失败 case 的结果
  private final CopyOnWriteArrayList<Failure> failures;
  // 执行时间
  private final AtomicLong runTime;
  // 开始时间
  private final AtomicLong startTime;
  Result  中内置了一个默认的来监听器,这个监听器会在每个 case 执行完成之后进行相应的回调,Listener 如下:
  @RunListener.ThreadSafe
      private class Listener extends RunListener {
      // 设置开始时间
          @Override
          public void testRunStarted(Description description) throws Exception {
              startTime.set(System.currentTimeMillis());
          }
  
          // 执行完所有 case
          @Override
          public void testRunFinished(Result result) throws Exception {
              long endTime = System.currentTimeMillis();
              runTime.addAndGet(endTime - startTime.get());
          }
  // 执行完某个 case
          @Override
          public void testFinished(Description description) throws Exception {
              count.getAndIncrement();
          }
  // 执行完某个 case 失败
          @Override
          public void testFailure(Failure failure) throws Exception {
              failures.add(failure);
          }
  // 执行完某个ignore case
          @Override
          public void testIgnored(Description description) throws Exception {
              ignoreCount.getAndIncrement();
          }
          @Override
          public void testAssumptionFailure(Failure failure) {
          // Assumption 产生的失败
              assumptionFailureCount.getAndIncrement();
          }
      }
  JUnit 4 开始在测试中支持假设 Assumptions,在 Assumptions 中,封装了一组使用的方法,以支持基于假设的条件测试执行。假设实际就是指定某个特定条件,假如不能满足假设条件,假设不会导致测试失败,只是终止当前测试。这也是假设与断言的最大区别,因为对于断言而言,会导致测试失败。
  所以 JUnit  通过监听器机制收集所有的测试信息,最终封装到 Result 中返回。
  Junit 中有一些比较基本的概念,比如 Runner,statement 等;在初始化时,默认情况下 junit 会构建出 BlockJUnit4ClassRunner 这样的一个 Runner,并且在这个 Runner 中会持有被测试类的所有信息。Runner 运行测试并在执行此操作时将重要事件通知 RunNotifier。
  也可以使用 RunWith 调用自定义 Runner,这里只要你的 Runner 是 org.junit.runner.Runner 子类即可;创建自定义运行程序时,除了在此处实现抽象方法外,还必须提供一个构造函数,这个构造函数将包含测试的类作为参数--如:SpringRunner。
  Runner 的 run 方法内部就是构建和执行 Statement 链的过程,Statement  中描述了单元测试中需要执行的一系列操作,每个 case 均以 RunnerAfter -> TargetMethod -> RunnerBefore 的执行顺序依次执行;执行过程中,junit 通过监听器机制回调 case 调用的每个生命周期阶段,并将各个case 执行的信息进行收集汇总,最终返回执行结果 Result 。

  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号