假设我有一个包含三个测试方法的测试类。测试可以串行运行,也可以在两个单独的线程中运行。每个测试方法都需要自己的协作者实例(比如某种资源)。然而,这似乎并不能解决问题:
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中似乎相当麻烦。有没有其他好的“本地测试”替代方案值得考虑?
发布于 2014-08-24 14:26:22
我认为你可以单独设置一个线程本地容器。如下所示;创建一个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();
}
}然后,您可以在MyThreadLocal中从@BeforeMethod设置包含该资源的上下文对象。在@AfterMethod中,您可以通过调用unset将其从线程本地存储中取消设置。
注取消设置threadlocal是必要的失败,这很容易导致内存不足。
线程本地将为执行特定测试用例的线程保证资源的本地存储。
因此,根据我的说法,回答您的问题,线程本地可能是最简单、最安全的方法。
https://stackoverflow.com/questions/25435117
复制相似问题