Предположим, у меня есть один тестовый класс с тремя тестовыми методами. Тесты могут выполняться либо последовательно, либо в двух отдельных потоках. Для каждого метода тестирования требуется собственный экземпляр соавтора (например, какой-либо ресурс). Тем не менее, это, казалось бы, не сокращает его:
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. Есть ли какие-либо другие достойные внимания альтернативы «тестового местного»?