2013-04-18 3 views
0

У меня есть набор тестов из 6 классов, в общей сложности 120 тестов между ними.Специальные тесты TestNG в изоляции

Проблема, с которой я сталкиваюсь, заключается в том, что некоторые тесты не могут выполняться при выполнении некоторых других тестов. Например, для испытаний A, B, C, D, E, F:

  • а не может быть запущена с В или С
  • б не может быть запущен с или с
  • с не может быть запущен с а или б
  • д не может быть запущен с F
  • е можно запустить с чем-нибудь
  • е не может работать с d

Это небольшой пример, б Надеюсь, это иллюстрирует суть. Я все еще хочу использовать как можно больше параллелизма, например, d и e могут работать одновременно. Я все еще учусь с TestNG, но я попытался следующие вещи:

Группировка тестов, которые не могут быть запущены вместе в одну группу - я не мог найти способ запустить TestNG в «параллельном =» групп ", например, для" parallel = "classes", где все тесты в группе выполняются в одном потоке. Помещение каждого теста, который не может выполняться вместе в одном классе, позволит работать с классами «parallel =», но будет означать, что тесты не будут организованы с помощью тестовых функций, как они есть в настоящее время.

Зависимости от испытаний вокруг тестов - Я считал, что каждый тест зависит друг от друга (возможно, с группами?), Образуя цепочку, такую ​​как a-> b-> c. Проблема в том, что они всегда будут работать в этом порядке, что может скрыть проблемы. Еще одна проблема заключается в том, что проверка работоспособности становится проблемой, так как вы должны обеспечить, чтобы цепь была единственной и не сломалась!

Создание метода перехватчика, которая сортирует список по группе - Я не совсем уверен в этом, но я не думаю, что это будет препятствовать имея тест уже запущен в то время как другой несовместимого тест выбран в качестве «следующего бежать'.

Я видел TestNG & Selenium: Separate tests into "groups", run ordered inside each group, который, кажется, пытается достичь той же цели, но по разным причинам, поэтому решение, достигнутое там, не подходит, поскольку это не проблема зависимости, а проблема изоляции.

Есть ли что-то, что мне поможет?

Большое спасибо,

Phil

+0

Можете ли вы дать более конкретный пример этих тестов? Вместо теста A не может быть запущено с B или C, о чем * фактический * тест вы говорите? – Arran

+0

Извинения, тесты, которые я назвал a-> f, - это тесты, которые я написал, каждый из которых проверяет функцию нашего приложения. Тестируемое приложение контролирует физические ресурсы. Каждый тест указывает физический ресурс для использования и запрашивает ресурс для выполнения определенной функции. В некоторых тестах используется один и тот же ресурс, и те, которые не могут выполняться вместе. Это помогает? – Obiphil

ответ

1

Вы можете реорганизовать тесты такие, что ваш текущий список классов больше не помечается как тесты. Вместо этого вводите новые тестовые классы прокси, методы которых просто вызывают процедуры тестирования в исходных классах. Таким образом, поддержание кода в функциональной области является простым. В качестве альтернативы, поскольку прокси-классы основаны на типе ресурсов, которые они используют, вы можете поместить их в отдельные тесты внутри пакета и использовать parallel="tests".

Фактически, вам не нужно вводить эти классы прокси.Вы можете указать свои тесты, как

<test name="boiler"> 
    <classes> 
     <class name="org.example.A"> 
     <methods> 
      <include name="a1"/> 
      <include name="a2"/> 
     </methods 
     </class> 
     ... <!-- list of methods that use the boiler --> 
    </classes> 
</test> 
<test name="waterheater"> 
    <classes> 
     <class name="org.example.B"> 
     <methods> 
      <include name="b"/> 
     </methods> 
     </class> 
     ... <!-- list of methods that use the waterheater --> 
    </classes> 
</test> 

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

<test name="boiler"> 
    <classes> 
     <class name="org.example.BoilerProxy"/> 
    </classes> 
</test> 
<test name="waterheater"> 
    <classes> 
     <class name="org.example.WaterHeaterProxy"/> 
    </classes> 
</test> 
... 

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

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

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

Я создал проводки блога на основе этого ответа: http://ancient-marinator.blogspot.com/2013/05/on-testing-scheduling-your-tests.html

+0

Отличная идея, спасибо! Я не рассматривал использование тестов таким образом, и я могу расширить вашу идею, чтобы каждый «Тест» был группой, а затем аннотировать тесты, которые не могут выполняться вместе, чтобы быть в группах вместе, тем самым уменьшая проблемы обслуживания. – Obiphil

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