首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TestNG:测试的本地协作者

TestNG:测试的本地协作者
EN

Stack Overflow用户
提问于 2014-08-22 04:11:50
回答 1查看 282关注 0票数 0

假设我有一个包含三个测试方法的测试类。测试可以串行运行,也可以在两个单独的线程中运行。每个测试方法都需要自己的协作者实例(比如某种资源)。然而,这似乎并不能解决问题:

代码语言:javascript
复制
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变量最终会被重复覆盖。

那么,这样如何:

代码语言:javascript
复制
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中似乎相当麻烦。有没有其他好的“本地测试”替代方案值得考虑?

EN

回答 1

Stack Overflow用户

发布于 2014-08-24 14:26:22

我认为你可以单独设置一个线程本地容器。如下所示;创建一个Mythreadlocal容器类。

代码语言:javascript
复制
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();
  }
}

然后,您可以在MyThreadLocal中从@BeforeMethod设置包含该资源的上下文对象。在@AfterMethod中,您可以通过调用unset将其从线程本地存储中取消设置。

注取消设置threadlocal是必要的失败,这很容易导致内存不足。

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

因此,根据我的说法,回答您的问题,线程本地可能是最简单、最安全的方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25435117

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档