TestNG-Как можно безопасно передать счетчик текущих вызовов из invokelistener в тест без проблем с многопоточностью? - PullRequest
0 голосов
/ 16 марта 2020

Я могу установить InvocationCount для моего метода теста, используя IAnnotaionTransformer. Теперь мне нужно запустить мой тестовый метод несколько раз (InvocationCount), но с разными данными для каждого прогона.

Я пытался с IInvokedMethodListener class и переопределить метод beforeInvocation и использовал getTestMethod().getCurrentInvocationCount(), чтобы получить currentInvocationcount число.

Я делю это число, используя класс счетчика (некоторая переменная int в нем) с методом test. Используя это число, мне нужно прочитать соответствующую строку в листе Excel в методе теста. Например, если currentInvocationcount равно 0, я прочту 1-ю строку в листе Excel, а если 1, я прочту 2-ю строку в листе Excel и так далее. С одним потоком я могу успешно реализовать это последовательно, и у меня нет никаких проблем. Но с несколькими потоками и несколькими тестами последовательность отличается, и я не получаю правильную последовательность выполнения.

У меня есть синхронизированный счетчик, как показано ниже.

public class SynchronizedCounter {
    private static int ctr;
    public synchronized void setSynchroed(int ctr) {
        this.ctr=ctr;
    }
    public static synchronized int  getSynchroed() {
        return ctr;
    }
}

И я делюсь currentinvocationcount из класса InvokedMethodLister, как показано ниже. Я думал, что синхронизированный способ обмена ctr будет полезным. Но бесполезно.

@Override
synchronized public  void  beforeInvocation(IInvokedMethod arg0, ITestResult arg1) {
    SynchronizedCounter sctr=new SynchronizedCounter();
    sctr.setSynchroed(arg0.getTestMethod().getCurrentInvocationCount());
}

И я получаю доступ к значению synnchronizedcounter в тесте, как показано ниже.

@Test
public void Test1() {
    System.out.println("The calling count of Make Payment Test 1 is"+SynchronizedCounter.getSynchroed());
int counter=SynchronizedCounter.getSynchroed();
//logic below to access excel sheet with "counter"th row.
}
@Test
public void Test2() {
    System.out.println("The calling count of Make Payment Test 2 is"+SynchronizedCounter.getSynchroed());
int counter=SynchronizedCounter.getSynchroed();
//logic below to access excel sheet with "counter"th row.
}

Пожалуйста, смотрите вывод ниже. Просто для простоты понимания я сохранил только соответствующий вывод. Тест 2 и Тест 3 настроены на выполнение 12 и 15 раз. Вы можете заметить, что Test2 и Test3 получают значения, перезаписанные другими тестами (на самом деле я запускал Test1, Test4 также). Пример: после 8-го прогона Test2 Test4 установите счетчик на 6, чтобы Test2 снова использовал 6. Не уверен почему.

Счетчик вызовов теста удаления платежа 3 равен 0

Количество вызовов теста платежа 2 составляет 0

Количество вызовов теста платежа 2 равно 1

Количество вызовов в тесте на выполнение платежа 2 равно 2

Количество вызовов в тесте на выполнение платежа 1 равно 2

Количество вызовов в тесте на удаление платежей 3 равно 1

количество вызовов для теста Make Payment 2 равно 1

количество вызовов для теста Test Payment 2 равно 4

количество вызовов теста удаления платежа 3 равно 3

количество вызовов для оплаты платежа Тест 2 is5

Количество вызовов теста удаления платежа 3 равно 4

Количество вызовов теста платежа 2 составляет 6

Количество вызовов теста платежа 2 равно 8

Количество вызовов в тесте на удаление платежей 3 равно 8

Количество вызовов в тесте на оплату 2 равно 8

Количество вызовов в тесте на оплату 4 равно 6

Счетчик вызовов для проверки платежа 2 is6

T Счетчик вызовов для проверки платежа 3: 6

Счетчик вызовов для проверки платежа 2 - 7

Счетчик вызовов для проверки платежа 3 - 7

Количество вызовов для удаления Тест оплаты 3 is8

Счетчик вызовов теста Make Payment 2 равен 8

Количество вызовов теста удаления платежей 3 составляет 9

Количество вызовов теста удаления платежей 3 равно 10

Количество вызовов в тесте удаления платежей 3 составляет 11

Число вызовов в тесте удаления платежей 3 составляет 12

Как передать счетчик currentinvocation из обработчика вызовов? на тест без каких-либо проблем многопоточности безопасно?

...