Тесты Selenium junit - как запустить тесты внутри теста в последовательном порядке? - PullRequest
2 голосов
/ 15 декабря 2011

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

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

Например.

testCreateUser
testJoinUserToRoom
testVerify
testDeleteUser

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

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

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

Есть ли способ, которым я могу этого достичь?

Спасибо.

Ответы [ 2 ]

6 голосов
/ 15 декабря 2011

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

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

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

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

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

В исходном примере у вас есть только один тест (verify), но у вас есть 4 метода, два setup (createUser, joinUserToRoom) и один teardown (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 , в котором вы можете определять зависимости от одного теста к другому.

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

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

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

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

Тогда у вас есть один тест:

@Test public void testUserNominalLifeCycle(...

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

@Test public void testUserWhoNeverJoinsARoom(...
...