繁体   English   中英

TestNG:测试本地合作者

[英]TestNG: Collaborators local to a test

假设我有一个带有三种测试方法的测试类。 测试可以串行运行,也可以在两个单独的线程中运行。 每个测试方法都需要其自己的协作者实例(例如某种资源)。 但是,这似乎并没有减少它:

public class MyTestClass {
    private Resource resource;

    @BeforeMethod public void setupResource() {}
    @AfterMethod public void tearDownResource() {}

    @Test public void testMethod1() {}
    @Test public void testMethod2() {}
    @Test public void testMethod3() {}
}

串行运行时这似乎可行,但是如果我们并行运行三个测试方法(具有方法粒度),则似乎是因为所有三个测试都是通过同一实例调用的,因此resource变量最终会被重复覆盖。

因此,如何:

public class MyTestClass {
    private static ThreadLocal<Resource> resource;

    @BeforeMethod public void setupResource() {}
    @AfterMethod public void tearDownResource() {}

    @Test public void testMethod1() {}
    @Test public void testMethod2() {}
    @Test public void testMethod3() {}
}

这似乎是合理的,而且如果我抛出@DataProvider并测试监听器,它似乎也可能会陈旧(如果正确实现了setupResource()tearDownResource() ,那么如果有两个线程可以运行测试,第三个方法从第一个开始没有任何“剩菜”)。

话虽如此,拥有@BeforeMethod@AfterMethod并将合作者( Resource )包装在ThreadLocal中似乎很麻烦。 还有其他值得考虑的“本地测试”替代方法吗?

我认为您可以单独设置一个threadlocal容器。 像下面这样: 创建一个Mythreadlocal容器类。

public class ThreadLocalContextObject{
  private Resource resource;
  // getter and setter for above
}

public class MyThreadLocal {
  public static final ThreadLocal threadLocal = new ThreadLocal();

  public static void set(ThreadLocalContextObject ctx) {
    threadLocal.set(ctx);
  }

  public static void unset() {
    threadLocal.remove();
  }
  public static ThreadLocalContextObject get() {
    return threadLocal.get();
  }
}

然后从@BeforeMethod您可以在MyThreadLocal中设置包含资源的上下文对象。 @AfterMethod您可以通过调用unset从@AfterMethod存储中取消设置它。

请注意,取消线程本地设置是必要的失败,这很容易导致内存不足。

threadlocal将为执行特定测试用例的线程保证资源的本地存储。

所以回答我的问题,根据我的看法,threadlocal可能是最简单,最安全的方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM