2011-12-15 2 views
2

Я использую junit с eclipse для написания функциональных тестов.Selenium junit tests - как я могу запускать тесты в рамках теста в последовательном порядке?

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

Например.

testCreateUser 
testJoinUserToRoom 
testVerify 
testDeleteUser 

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

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

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

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

Спасибо.

ответ

6

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

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

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

Для получения дополнительной информации об этом см. Мой ответ на вопрос Has JUnit4 begun supporting ordering of test? Is it intentional?.

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

В вашем первоначальном примере у вас есть только один тест (проверка), но у вас есть 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, в котором вы можете определить зависимости от одного теста к другому.

+0

Спасибо, Мэтью, имеет смысл, я отдам это. –

0

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

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

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

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

@Test public void testUserNominalLifeCycle(... 

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

@Test public void testUserWhoNeverJoinsARoom(... 
+0

Спасибо Soru, тест внутри пакета можно запустить в любом порядке. Но тесты в рамках этих тестов должны выполняться в правильном порядке. Поэтому он должен войти в систему, когда администратор создаст пользователя и присоединяется к этому пользователю в комнату. Затем войдите в систему как пользователь и запустите тест. Я не уверен, как можно запустить такой тест без каких-либо зависимостей ...? –

+0

Для тестирования в стиле единицы вы можете иметь @Before (или @BeforeClass), который создает требуемых пользователей, и соответствующую функцию после аннотирования, которая очищает их. – soru

Смежные вопросы