[英]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.