Тесты Selenium junit - как я могу запускать тесты в рамках теста в последовательном порядке?

Я использую junit с eclipse для записи функциональных тестов.

При запуске отдельного теста он выполняется в том порядке, в котором я их устанавливаю в классе.

Eg.

testCreateUser
testJoinUserToRoom
testVerify
testDeleteUser

Однако, когда я запускаю этот тест как часть пакета (так в пакете), порядок является случайным.

Он, например, выполнит проверку, а затем удалит пользователя, затем joinuserToRoom, затем Createuser.

Мои тесты внутри пакета не зависят друг от друга. Однако каждый отдельный тест в рамках теста зависит от того, как они выполняются в правильном порядке.

Есть ли способ достичь этого?

Спасибо.

Ответ 1

Вы не можете гарантировать порядок выполнения тестовых методов в JUnit.

Порядок выполнения тестов классов в пакете гарантирован (если вы используете Suite), но порядок выполнения, если тестовые классы найдены путем отражения, не является (например, если вы используете пакет в Eclipse или набор тестов из maven или ant). Это может быть определено ant или maven, но это не определено JUnit.

В общем, JUnit выполняет методы тестирования в том порядке, в котором они определены в исходном файле, но не все JVM гарантируют это (в частности, JVM 7). Если некоторые из методов наследуются от абстрактного базового тестового класса, то это может и не быть. (Это похоже на ваше дело, но я не могу сказать из вашего описания).

Подробнее об этом см. в моем ответе на . Начал ли JUnit4 поддерживать заказ теста? Преднамеренно?.

Итак, что вы можете сделать, чтобы исправить свою проблему? Существует два решения.

В вашем первоначальном примере вы фактически получили только один тест (проверьте), но у вас есть 4 метода, две установки (createUser, joinUserToRoom) и один разрыв (deleteUser). Таким образом, ваш первый вариант - лучше определить ваши тестовые примеры, используя TestRule, в частности ExternalResource. ExternalResource позволяет определить до/после поведения для теста, аналогично @Before/@After. Однако преимущество ExternalResource заключается в том, что вы можете исключить это из своего теста.

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

public class UsesExternalResource {
     @Rule
     public ExternalResource resource= new ExternalResource() {
         @Override
         protected void before() throws Throwable {
            // create user
         };

         @Override
         protected void after() {
            // destroy user
         };
     };

     @Test
     public void testJoinUserToRoom() {
        // join user to room
        // verify all ok
     }
}

Для меня это проще и легче понять, и вы получаете независимые тесты, что хорошо. Это то, что я сделал бы, но вам нужно будет немного реорганизовать ваши тесты. Вы также можете складывать эти Правила, используя RuleChain.

Второй вариант, если вы действительно хотите ввести зависимости между вашими тестовыми методами, - это посмотреть TestNG, в котором вы может определять зависимости от одного теста к другому.

Ответ 2

Если у них есть "правильный" порядок, то это не множественные тесты, а один тест, который вы неправильно аннотировали как несколько независимых тестов.

Лучшей практикой было бы переписать их в одобренном стиле юнита (setup - act - verify), поддерживаемом методами @Before или @BeforeClass, которые выполняли любую необходимую общую настройку.

Быстрое обходное решение будет состоять в том, чтобы иметь один метод @Test-annotated, который последовательно вызывал другие методы тестирования. Это становится чем-то вроде предпочтительной альтернативы, если вы используете Junit, чтобы не выполнять строгие модульные тесты, а что-то вроде сценариев тестирования систем. Это не обязательно лучший инструмент для такого использования, но в некоторых случаях он отлично работает.

Тогда то, что у вас было бы до сих пор, имеет один тест:

@Test public void testUserNominalLifeCycle(...

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

@Test public void testUserWhoNeverJoinsARoom(...