精选文章 TestNG源码解读(十二)

TestNG源码解读(十二)

作者:毛依依 时间: 2019-11-06 10:10:36
毛依依 2019-11-06 10:10:36

继上篇6.4 执行用例

之前看到了suiteRunner.runTest方法的具体内容就是执行每一个用例然后将执行结果put到m_suiteResults中,那么每一个xml文件中的标签里的用例是怎么执行的呢?具体来看一看,它是调用TestRunner.run方法,run方法主要工作:1.调用配置方法, 2.调用测试方法,3.捕获异常,4.收集结果,5.调用监听器等等...;

  /**
   * The main entry method for TestRunner.
   *
   * This is where all the hard work is done:
   * - Invoke configuration methods
   * - Invoke test methods
   * - Catch exceptions
   * - Collect results
   * - Invoke listeners
   * - etc...
   */
  public void run() {
    beforeRun();

    try {
      XmlTest test= getTest();
      if(test.isJUnit()) {
        privateRunJUnit(test);
      }
      else {
        privateRun(test);
      }
    }
    finally {
      afterRun();
    }
  }

然后它又调用privateRun方法:

1.首先拿到节点中的parallel,如果paraller是method或者classes或者instances或者是true则paraller为true

2.然后根据paraller拿到threadCount的值,若为false则线程数为1,否则就是设置的线程数(因此,线程数是否生效要取决于paraller)

3.然后再根据paraller判断是否是多线程并发执行用例,其中下面的方法的作用是该中的所有method加入到node中,创建测试方法集合

DynamicGraph graph = createDynamicGraph(intercept(m_allTestMethods));

 

 private void privateRun(XmlTest xmlTest) {
    String parallelMode = xmlTest.getParallel();
    boolean parallel = XmlSuite.PARALLEL_METHODS.equals(parallelMode)
        || "true".equalsIgnoreCase(parallelMode)
        || XmlSuite.PARALLEL_CLASSES.equals(parallelMode)
        || XmlSuite.PARALLEL_INSTANCES.equals(parallelMode);

    {
      // parallel
      int threadCount = parallel ? xmlTest.getThreadCount() : 1;
      // Make sure we create a graph based on the intercepted methods, otherwise an interceptor
      // removing methods would cause the graph never to terminate (because it would expect
      // termination from methods that never get invoked).
      DynamicGraph graph = createDynamicGraph(intercept(m_allTestMethods));
      if (parallel) {
      //并发执行
        if (graph.getNodeCount() > 0) {
          GraphThreadPoolExecutor executor =
              new GraphThreadPoolExecutor(graph, this,
                  threadCount, threadCount, 0, TimeUnit.MILLISECONDS,
                  new LinkedBlockingQueue());
          executor.run();
          try {
            long timeOut = m_xmlTest.getTimeOut(XmlTest.DEFAULT_TIMEOUT_MS);
            Utils.log("TestRunner", 2, "Starting executor for test " + m_xmlTest.getName()
                + " with time out:" + timeOut + " milliseconds.");
            executor.awaitTermination(timeOut, TimeUnit.MILLISECONDS);
            executor.shutdownNow();
          } catch (InterruptedException handled) {
            handled.printStackTrace();
            Thread.currentThread().interrupt();
          }
        }
      } else {
        //串行执行用例
        boolean debug = false;
        List freeNodes = graph.getFreeNodes();
        if (debug) {
          System.out.println("Free nodes:" + freeNodes);
        }

        if (graph.getNodeCount() > 0 && freeNodes.isEmpty()) {
          throw new TestNGException("No free nodes found in:" + graph);
        }

        while (! freeNodes.isEmpty()) {
          List> runnables = createWorkers(freeNodes);
          for (IWorker r : runnables) {
            //单个用例执行
            r.run();
          }
          graph.setStatus(freeNodes, Status.FINISHED);
          freeNodes = graph.getFreeNodes();
          if (debug) {
            System.out.println("Free nodes:" + freeNodes);
          }
        }
      }
    }
  }

 

 

 

拓展:mybatis的缓存机制

一级缓存:同一个sqlSession中对于完全相同的查询语句

        

1)session 级别的缓存

在同一个 sqlSession 内,对同样的查询将不再查询数据库,直接从缓存中。

2)statement 级别的缓存

避坑: 为了避免这个问题,可以将一级缓存的级别设为 statement 级别的,这样每次查询结束都会清掉一级缓存。

二级缓存:

        

 

勿删,copyright占位
分享文章到微博
分享文章到朋友圈

上一篇:Shader 渲染顺序

下一篇:代码格式化

您可能感兴趣

  • SpringBoot之定时任务三种实现方法详解

    目录 序言 一、静态:基于注解 二、动态:基于接口 三、多线程定时任务 阅读正文: 序言 SpringBoot创建定时任务,目前主要有以下三种实现方式: 一、基于注解(@Scheduled) 基于注解@Scheduled默认为单线程,开启多个任务时,任务的执行时机会受上一个任务执行时间的影响; 二、基于接口(SchedulingConfigurer) 用于实现从数据库获取指定时间来动态执行定...

  • 美团数据库运维自动化系统构建之路

    本文整理自美团点评技术沙龙第10期:数据库技术架构与实践。 美团点评技术沙龙由美团点评技术团队主办,每月一期。每期沙龙邀请美团点评及其它互联网公司的技术专家分享来自一线的实践经验,覆盖各主要技术领域。 目前沙龙会分别在北京、上海和厦门等地举行,要参加下一次最新沙龙活动?赶快关注微信公众号“美团点评技术团队”。 本次沙龙主要围绕数据库相关的主题,内容包括美团数据库自动化运维系统构建、点评侧My...

  • 历时两周,将我司的Hadoop2升级到Hadoop3,踩了几个大坑...

    文末有赠书福利 继一次超万亿规模的Hadoop NameNode性能故障排查过程之后,虽然解决了Hadoop2.6.0版本在项目中的问题,但客户依然比较担心,一是担心版本过老,还存在其他未发现的问题;二是按目前每天近千亿条的数据增长,终究会遇到NameNode的第二次瓶颈。 基于上述原因,我们决定将当前集群由Hadoop2.6.0版本升级到Hadoop3.2.1版本,且启用联邦模式。历时2周...

  • python学习001

    前言: 1、运维/网络为什么要学习编程? (1)运维/网络中所有已学的命令其实都是已经编制好的程序,创造命令就是编写程序; (2)在云计算领域中,繁琐的命令配置已经不能满足日常需求,深入发展是需要贴近业务/研发的,因此就要能够创造命令/编写程序/开发; (3)网络安全领域中,可以深入理解渗透、攻防等细节,Kali-Linux ,SDN(命令对应网络)夯实技术; (4)对于校招而言,大型互联网...

  • 芯片破壁者(十.上):风起樱花之地

    在不断升级的中美科技战中,每个人都很容易发现,在芯片上受制于人似乎是一个最难解的谜题。面对这种情况,很多国人可能都在思考:我们到底有没有可能打破“芯片枷锁”? 而从历史里寻找答案是文明的天性,在审视国家间的半导体博弈时,有一个无法绕开的话题,就是上世纪60年到到90年代,横跨数十年、关系错综复杂的美日半导体纠葛。这段历史中最为人津津乐道的有两点。一是日本在80年代一跃超过美国成为全球半导体产...

  • Go语言 | 从并发模式看channel使用技巧

    最近重看MinIO的源代码,发现纠删码模式下读取数据盘的时候,使用了更简单的并发读取方式,以前看的时候没发现,查了下Git历史记录,发现是19年新改的,新的使用channel做标记的方式的确非常巧妙,简化了代码逻辑,值得我们学习。所以今天就开篇文章,介绍下channel在并发下的两个使用技巧。 赢者为王模式 这种并发模式并不稀奇,相信很多朋友都用到过。它的核心思想就是同时开几个协程做同样的事...

  • 一线互联网大厂精选9道Java集合面试题

    作者|码农田小齐|微信公众号 今天这篇文章是单纯的从面试的角度出发,以回答面试题为线索,再把整个 Java 集合框架复习一遍,希望能帮助大家拿下面试。 先上图: 当面试官问问题时,我会先把问题归类,锁定这个知识点在我的知识体系中的位置,然后延展开来想这一块有哪些重点内容,面试官问这个是想考察什么、接下来还想问什么。 这样自己的思路不会混乱,还能预测面试官下一个问题,或者,也可以引导面试官问出...

  • 学计算机必看:程序员部落酋长,给计算机专业学生的 6 个建议!

    如果你喜欢编程,那么你真是受到了上天的眷顾。你是非常幸运的少数人之一,能够以自己喜欢的事谋生。大多数人没有这么幸运。你认为理所当然的观念“热爱你的工作”,其实是一个很现代的概念。通常的看法是,工作是一种让人很不开心的事,你为了拿工资才不得不去上班。 你工作的目的是为了攒下钱去干那些自己真正喜欢干的事,但是前提是你得等到65岁退休之后才行,而且还有不少条件。条件一,你的积蓄必须足够多;条件二,...

华为云40多款云服务产品0元试用活动

免费套餐,马上领取!
CSDN

CSDN

中国开发者社区CSDN (Chinese Software Developer Network) 创立于1999年,致力为中国开发者提供知识传播、在线学习、职业发展等全生命周期服务。