2016-12-05 4 views
0

Я учусь делать модульное тестирование с TestNG. Я хотел передать уникальное значение переменной «val» для каждого потока из пула потоков, но он не собирает его.Выполнение многопоточных модульного теста с TestNG

здесь класса TestNG:

public class NewTest { 

    int val = 0; 

    /*@Test(dataProvider = "dp") 
    public void f(Integer n, String s) { 
    }*/ 
    @BeforeMethod 
    public void beforeMethod() { 
     long id = Thread.currentThread().getId(); 
     System.out.println("beforeMethod. Thread id is: " + id); 



    } 

    @AfterMethod 
    public void afterMethod() {/* 
     long id = Thread.currentThread().getId(); 
     System.out.println("After test-method. Thread id is: " + id);*/ 
    } 


    @DataProvider 
    public Object[][] dp() { 
    return new Object[][] { 
     new Object[] { 1, "a" }, 
     new Object[] { 2, "b" }, 
    }; 
    } 
    @BeforeClass 
    public void beforeClass() { 

    } 

    @AfterClass 
    public void afterClass() { 
    } 

    @BeforeTest 
    public void beforeTest() { 
     val++; 
    } 

    @AfterTest 
    public void afterTest() { 
    } 

    @BeforeSuite 
    public void beforeSuite() { 
    } 

    @AfterSuite 
    public void afterSuite() { 
    } 

    @Test(threadPoolSize = 5, invocationCount = 5, timeOut = 1000) 
    public void methodOne(){ 
     System.out.println("Value of val from MethodOne::"+val); 
    } 
} 

и выход:

[ThreadUtil] Начиная исполнитель неактивности: 1000мс работников: 5 threadPoolSize: 5 beforeMethod. Идентификатор потока: 15 beforeMethod. Тема идентификатор: 12 beforeMethod. Идентификатор потока: 14 beforeMethod. Идентификатор темы: 13 beforeMethod. Идентификатор Нити: 16 Значения Вала от метадон :: 1 Значение из Вала от метадон :: 1 Значение Вала от метадон :: 1 Значение Вала от метадон :: 1 Значение Вала от метадон :: 1 ПРОШЛО: метадон ПРОШЛО: метадон ПРОШЕЛ: метадон ПРОШЕЛ: метадон ПРОШЕЛ: метадон

================================ =============== тест по умолчанию

тесты запуска: 5, Отказы: 0, Кузова: 0

============ =================================== По умолчанию люкс Всего тесты запуска: 5, Отказы: 0, Кузова: 0

[TestNG] Время, затраченное на [FailedReporter прошел = 0 не удалось = 0 пропущено = 0]: 1 мс [TestNG] Время, затраченное на [email protected]: 50 мс [TestNG] Время взято [email protected]: 7 мс [TestNG] Время, затраченное [email protected]: 9 мс [TestNG] Время, затраченное org.testng.reporters.jq.Main @ 1d16f93d: 40 мс [TestNG] Время, затраченное на [email protected]: 4 мс

ответ

0

быть осторожным: @BeforeTest не является @BeforeMethod (@BeforeSuite ->@BeforeTest ->@BeforeClass ->@BeforeMethod, и @BeforeGroup, который является конкретным).

Затем @BeforeTest является вызов только один раз <test>: в вашем образце, только один раз и val всегда 1.

+0

Я изменил приращение шага в @BeforeMethod, но до сих пор я получаю тот же результат. – focode

+0

Не могли бы вы обновить свой вопрос с Обновит ed sample? – juherr

0

вы можете использовать ThreadLocal, как показано ниже: (Но, пожалуйста, помните, что TestNG гарантирует, что только @BeforeMethod>@Test >@AfterMethod аннотированные методы будут работать на одной и той же теме.

public class NewTest { 
    private static ThreadLocal<Long> val = new ThreadLocal<>(); 

    @BeforeMethod 
    public void beforeMethod() { 
     long id = Thread.currentThread().getId(); 
     val.set(id); 
     printer("beforeMethod"); 
    } 

    @AfterMethod 
    public void afterMethod() { 
     printer("afterMethod"); 
     //usage of thread locale done. Lets reset it. 
     val.set(null); 
    } 

    @Test (threadPoolSize = 5, invocationCount = 5, timeOut = 1000) 
    public void methodOne() { 
     printer("methodOne"); 
    } 

    private static void printer(String prefix) { 
     System.err.println("Thread ID in the method " + prefix + "() is " + val.get()); 
    } 
}