Как использовать TestNG для создания сценариев многопользовательских тестов? - PullRequest
1 голос
/ 07 декабря 2011

Что мне нужно сделать, это создать тестовые примеры пользовательского интерфейса для нашего приложения, и мы решили использовать Selenium с TestNG (мы все еще открыты для других вариантов, если есть значительные преимущества).

Тесты, которые мы пытаемся создать, - это тесты, в которых несколько пользователей взаимодействуют друг с другом с помощью приложения . По сути, нам нужно, чтобы несколько пользователей одновременно входили в наше приложение и выполняли различные действия. Существует связь между действиями пользователей, поэтому им необходимо синхронизировать свое взаимодействие в некоторых точках (например, пользователю нужно подождать, пока другой пользователь выполнит действие, прежде чем он сможет выполнить свое действие). Это означает, что там также должна быть какая-то общая информация между пользователями (я просто думал о совместном использовании объекта, который позаботится о точках синхронизации).

Как мне структурировать мой сценарий, где мне нужно описать действия различных пользователей, которые будут работать параллельно с использованием TestNG?

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

EDIT:
Лучшее, что я мог до сих пор делать, - это создать тест, в котором каждый метод @Test выполняет действия каждого пользователя, а затем создать пакет, в котором я определяю, что методы теста должны выполняться параллельно. Пример:

public class MultiUserTest {
    @Test
    public void user1Interaction() {
        User user1 = new User();
        // user1 performs actions
    }

    @Test
    public void user2Interaction() {
        User user2 = new User();
        // user2 performs actions
    }
}

Затем создайте Test Suite, где я указываю, что методы MultiUserTest должны выполняться параллельно.

Однако мне не очень нравится это решение. Мне не нравится тот факт, что я полагаюсь на конфигурацию XML (Test Suite), чтобы описать правильное поведение моего теста (что не будет очевидным, если взглянуть на код Java). Мне также не нравится тот факт, что я не смогу просто запустить тест, используя плагин TestNG на Eclipse, выполнив «Run As - TestNG Test». Опять же, любое предложение очень приветствуется. Спасибо!

1 Ответ

0 голосов
/ 23 декабря 2011

Я думаю, что вы можете использовать любую среду тестирования, которая вам нравится.

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

подход, который я бы порекомендовал вам, это использовать ExecutorService framework из java.util.concurrent пакета.

Итак, прежде всего вам нужно создать исполнителя

ExecutorService executorService = Executors.newFixedThreadPool(2);

Следующее использованиеисполнитель для асинхронного запуска задач с использованием метода submit и синхронизации действий с использованием метода get .

См. пример кода ниже

@Test
public void test() throws Exception {

    final User firstUser = new User();

    Future<?> firstUserAction = executorService.submit(new Runnable() {
        @Override
        public void run() {
            firstUser.doSomething();
            firstUser.doSomethingElse();
        }
    });

    final User secondUser = new User();
    Future<?> secondUserAction = executorService.submit(new Runnable() {
        @Override
        public void run() {
            secondUser.doSomething();
        }
    });


    // synchronization
    firstUserAction.get();
    secondUserAction.get();
    // synchronized now

    secondUserAction = executorService.submit(new Runnable() {
        @Override
        public void run() {
            secondUser.doSomethingElse();
        }
    });




}
...