Как заставить другие тестовые случаи ждать некоторое время, пока тестовый пример выполняет действие в параллельном выполнении TestNG - PullRequest
0 голосов
/ 07 марта 2020

Я запускаю свои тесты параллельно. Много раз у меня возникали проблемы с выбором значений из выпадающего списка реакций. Предположим, мне нужно было выбрать значение из выпадающего списка, мне нужно было выполнить 2 операции: 1. Нажмите на выпадающую кнопку. 2. Выберите значение из выпадающего списка.

Иногда во время параллельного выполнения после выполнения первого шага запускается следующий поток, поэтому окно переключается. Когда он переключается обратно в первое окно и выполняет второй шаг, раскрывающийся список больше не присутствовал, поэтому тестовый набор не пройден.

Раскрывающийся список выглядит следующим образом:

enter image description here

Есть ли в любом случае я заставлю другие потоки ждать некоторое время, пока этот поток не выполнит действие?

Что я пробовал? Попробуйте 1: Во многих местах они сказали, что мы не можем приостановить поток из другого потока. Но все же я попробовал с этим. Кажется, что все потоки TestNG имеют имя, содержащее «TestNG», поэтому я использовал его для его идентификации. Затем добавили еще одно условие: если идентификатор этого потока не совпадает с идентификатором моего потока, я могу заставить его ждать.

public void stopThisThread(long threadId) throws Throwable{
        synchronized(this) {
            System.out.println("Stop other threads called...");
            Set<Thread> threadSet = Thread.getAllStackTraces().keySet();
            try {           
                for(Thread t : threadSet) {
                    System.out.println("Inside loop : " + printThread(t));
                    if(t.getName().contains("TestNG") && t.getId()!=threadId) {
                        t.wait();
                        System.out.println("Wait is called on " + t.getId());
                    }
                }
            }catch(Throwable t) {
                t.printStackTrace();
            }
        }
    }

Как и ожидалось, он не работал. Это бросило java.lang.IllegalMonitorStateException Попробуйте 2 Я подумал, вместо того, чтобы вызывать wait из другого потока, почему бы нам не вызвать wait из того же потока, а затем позволить ему возобновить работу. Итак, здесь test2 выберет значение из выпадающего списка. Итак, я заставил поток test1 ждать. После того, как test2 завершил работу, я подумал вызвать notify, чтобы test1 возобновил свою работу. Это также не сработало.

@Test
public synchronized void test1() throws Throwable {
    System.out.println("test1 - " + printThread(Thread.currentThread()));       
    int i = 0;
    while(true) {           
        System.out.println("test1");
        if(i == 0)
            Thread.currentThread().wait();
        Thread.sleep(2000);         
    }
}

@Test
public synchronized void test2() throws Exception{
    System.out.println("test2 - " + printThread(Thread.currentThread()));
    int i = 0;
    while(true) {
        System.out.println("test2");
        Thread.sleep(2000);
        if(++i == 5)
            Thread.currentThread().notifyAll();
    }
}

Это выдает java.lang.IllegalMonitorStateException в обоих тестовых случаях.

Может кто-нибудь помочь мне в этом?

Ответы [ 2 ]

0 голосов
/ 11 марта 2020

@ Илья Спасибо за ответ. Я не хочу, но я должен. Я проверил с другими вариантами. Наконец нашел join

@Test
public void test1() throws Throwable {
    System.out.println("test1 - " + printThread(Thread.currentThread()));               
    while(true) {           
        System.out.println("test1");            
        Thread.sleep(2000);         
        i++;            
    }
}

@Test
public void test2() throws Throwable {
    System.out.println("test2 - " + printThread(Thread.currentThread()));   
    int j = 0;
    while(true) {
        System.out.println("test2");
        if(j==0)
            Thread.currentThread().join(10000);
        Thread.sleep(2000); 
        j++;
    }
}

@Test
public void test3() throws Throwable {
    System.out.println("test3 - " + printThread(Thread.currentThread()));   
    int j = 0;
    while(true) {
        System.out.println("test3");
        if(j==0)
            Thread.currentThread().join(10000);
        Thread.sleep(2000); 
        j++;
    }
}

Вывод получился следующим образом:

test2 - 14 - TestNG-test=test-2 - false
test2
test3 - 15 - TestNG-test=test-3 - false
test3
test1 - 13 - TestNG-test=test-1 - false
test1
test1
test1
test1
test1
test1
test3
test2
test1
test3
test2
test1

Таким же образом я изменил свой проект. Теперь я могу выбрать значение выпадающего без каких-либо хлопот.

0 голосов
/ 08 марта 2020

Поддержка управления потоками - слишком сложная задача, и вы получите много проблем с ней.

Сохраняйте свои тесты настолько независимыми, насколько это возможно.

Для запуска тестов в Параллельно вы можете использовать такой инструмент, как Selenoid . Настройте его один раз, и у вас будет хорошая среда для запуска ваших тестов.

Я думаю, это поможет вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...