前言

最近在做项目里的自动化测试工作,使用的是TestNG测试框架,主要涉及的测试类型有接口测试以及基于业务实际场景的场景化测试。由于涉及的场景大多都是大数据的作业开发及执行(如MapReduce、Spark、Hql等任务的执行),而这些任务的执行都需要耗费较多的时间。举一个普遍的例子,其中一条场景测试用例是:

  • 执行一个MapReduce作业,校验作业的执行结果和执行日志。

对于一个最简单的MR任务,如果YARN集群资源充足,它的执行时间也要花上将近一分钟的时间。更不用说当YARN集群计算资源饱和时,任务还需要持续等待资源分配等。当测试回归用例集里包含了大量此类的用例时,如果还用传统的单线程执行方式,则一次自动化回归将会耗费大量的时间。

多线程并行执行

基于上述场景,我们可以考虑将自动化用例中相互之间没有耦合关系,相对独立的用例进行并行执行。如,我可以通过起不同的线程同时去执行不同的MR任务、Spark任务,每个线程各自负责跟踪任务的执行情况。

此外,即使是单纯的接口自动化测试,如果测试集里包含了大量的用例时,我们也可以借助于TestNG的多线程方式提高执行速度。

必须要指出的是,通过多线程执行用例时虽然可以大大提升用例的执行效率,但是我们在设计用例时也要考虑到这些用例是否适合并发执行,以及要注意多线程方式的通病:线程安全与共享变量的问题。建议是在测试代码中,尽可能地避免使用共享变量。如果真的用到了,要慎用synchronized关键字来对共享变量进行加锁同步。否则,难免你的用例执行时可能会出现不稳定的情景(经常听到有人提到用例执行地不稳定,有时100%通过,有时只有90%通过,猜测可能有一部分原因也是这个导致的)。

TestNG中的多线程使用姿势

网友评论