#java #testng #synchronized #multiple-login #parallel-execution
#java #testng #синхронизировано #множественный вход #параллельное выполнение
Вопрос:
У меня есть веб-приложение, которое я тестирую с помощью Selenium и Maven, выполняющих параллельные тесты. На данный момент я определяю идентификаторы входа для каждого теста. Мне нужно решение, в котором у меня будет пул пользователей, доступных для тестов. Во время выполнения тесты будут выбирать идентификаторы пользователей для входа в систему из этого пула. После выполнения параллельного теста идентификатор пользователя должен быть выпущен и стать доступным для следующих тестов. Пул должен контролироваться, и тесты должны выполняться только при наличии одного или нескольких пользователей, поэтому я буду избегать сбоев из-за недоступности пользователей.
Я новичок в этом, поэтому я ищу некоторые идеи / советы, как я могу реализовать вышеизложенное. Я использую Java.
Комментарии:
1. Вам нужно будет поместить их в какое-то хранилище данных и обработать это самостоятельно. Вы в основном описываете поведение общего пула ресурсов, поэтому может быть полезно посмотреть, как работают пулы баз данных.
2. Есть ли у вас приблизительная оценка того, сколько тестов может выполняться параллельно одновременно? мы говорим о 2, 10 или 1000? Я не уверен, что это хорошая идея, чтобы ваши тесты зависели от небольшого пула, поскольку это свяжет их вместе и потенциально создаст узкие места. Представьте, что тесты выходят из строя и не освобождают пользователей, вы можете даже заблокировать всех пользователей, и больше тесты не смогут выполняться
Ответ №1:
Вы можете сделать это, определив доступность пользователя как логическое значение. Рассмотрим эти четыре класса:
Класс для определения testUser как объекта:
package theo;
public class testUser {
public String id;
public String pwd;
public boolean availability;
public String getId() {
return id;
}
public String getPwd() {
return pwd;
}
public boolean getAvailability() {
return availability;
}
public void setAvailability(boolean availability) {
this.availability = availability;
}
public testUser(String id, String pwd, boolean availability) {
this.id = id;
this.pwd = pwd;
this.availability = availability;
}
}
Класс с testUsers:
package theo;
public class testUsers {
testUser Jessica = new testUser("Jessica", "Jessica's password", true);
testUser Julie = new testUser("Julie", "Julie's password", false);
testUser Jane = new testUser("Jane", "Jane's password", true);
public testUser[] allTestUsers = {
Jessica,
Julie,
Jane
};
}
Класс с методом тестирования:
package theo;
public class testMethod extends testUsers {
public void testWhatever(testUser user) {
System.out.println("Starting test with " user.getId() "'s credentials.");
user.setAvailability(false);
System.out.println(user.getId() "'s availability is: " user.getAvailability());
String id = user.getId();
String pwd = user.getPwd();
// load login page, perform login and desired tests
// ...
// possibly logout the user
// ...
System.out.println("Login test finished, going to release user.");
// and releasing the user
user.setAvailability(true);
System.out.println(user.getId() "'s availability is: " user.getAvailability());
}
}
Класс для выполнения тестов из-за доступности пользователя:
package theo;
import org.junit.Test;
public class testDemo extends testMethod {
@Test
public void performTestDueToUserAvailability() {
for (testUser testUser: allTestUsers) {
if (testUser.getAvailability()) {
testWhatever(testUser);
}
else {
System.out.println("User locked, skipping test.");
}
}
}
}
Вывод:
Starting test with Jessica's credentials.
Jessica's availability is: false
Login test finished, going to release user.
Jessica's availability is: true
User locked, skipping test.
Starting test with Jane's credentials.
Jane's availability is: false
Login test finished, going to release user.
Jane's availability is: true
Комментарии:
1. Я бы не стал пропускать тест, когда вы запускаете набор тестов, вы хотите, чтобы все ваши тесты выполнялись
2. В общем, да, я согласен. Но «… тесты должны выполняться только тогда, когда один или несколько пользователей доступны …» Условие в performTestDueToUserAvailability() можно настроить.
3. правильно, я понимаю это предложение как ожидание доступных пользователей для запуска тестов. Ожидание, а не пропуск.
4. Я вижу. Он может просто добавить функцию для ожидания, пока user.getAvailability() не вернет true . Например, подождите максимум несколько минут и вызовите исключение TimeoutException.