Порядок выполнения тестов в TestNG
Как настроить порядок выполнения тестов в TestNG?
Например:
public class Test1 {
@Test
public void test1() {
System.out.println("test1");
}
@Test
public void test2() {
System.out.println("test2");
}
@Test
public void test3() {
System.out.println("test3");
}
}
В приведенном выше наборе порядок выполнения тестов произволен. Для одного исполнения выход может быть:
test1
test3
test2
Как выполнить тесты в том порядке, в котором они были написаны?
Ответы
Ответ 1
Это сработает.
@Test(priority=1)
public void Test1() {
}
@Test(priority=2)
public void Test2() {
}
@Test(priority=3)
public void Test3() {
}
priority
поддерживает порядок выполнения, но не гарантирует, что предыдущий уровень приоритета завершен. test3
может начинаться до завершения test2
. Если требуется гарантия, объявите зависимость.
В отличие от решений, объявляющих зависимости, тесты, которые используют priority
, будут выполняться, даже если один из тестов завершится с ошибкой. Эта проблема с зависимостями может быть обработана с помощью @Test(...alwaysRun = true...)
в соответствии с documentation.
Ответ 2
В TestNG вы используете dependOnMethods и/или dependOnGroups:
@Test(groups = "a")
public void f1() {}
@Test(groups = "a")
public void f2() {}
@Test(dependsOnGroups = "a")
public void g() {}
В этом случае g() будет запускаться только после того, как f1() и f2() завершатся и будут выполнены.
В документации вы найдете много примеров: http://testng.org/doc/documentation-main.html#test-groups
Ответ 3
Чтобы рассмотреть конкретный сценарий, о котором идет речь:
@Test
public void Test1() {
}
@Test (dependsOnMethods={"Test1"})
public void Test2() {
}
@Test (dependsOnMethods={"Test2"})
public void Test3() {
}
Ответ 4
Если вы не хотите использовать параметр @Test(priority = )
в TestNG, вы можете использовать библиотеку javaassist и TestNG IMethodInterceptor
, чтобы определить приоритеты тестов в соответствии с порядком, с помощью которого методы тестирования определены в классе испытаний. Это основано на решении здесь.
Добавьте этого слушателя в свой тестовый класс:
package cs.jacob.listeners;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import javassist.NotFoundException;
import org.testng.IMethodInstance;
import org.testng.IMethodInterceptor;
import org.testng.ITestContext;
public class PriorityInterceptor implements IMethodInterceptor {
public List<IMethodInstance> intercept(List<IMethodInstance> methods, ITestContext context) {
Comparator<IMethodInstance> comparator = new Comparator<IMethodInstance>() {
private int getLineNo(IMethodInstance mi) {
int result = 0;
String methodName = mi.getMethod().getConstructorOrMethod().getMethod().getName();
String className = mi.getMethod().getConstructorOrMethod().getDeclaringClass().getCanonicalName();
ClassPool pool = ClassPool.getDefault();
try {
CtClass cc = pool.get(className);
CtMethod ctMethod = cc.getDeclaredMethod(methodName);
result = ctMethod.getMethodInfo().getLineNumber(0);
} catch (NotFoundException e) {
e.printStackTrace();
}
return result;
}
public int compare(IMethodInstance m1, IMethodInstance m2) {
return getLineNo(m1) - getLineNo(m2);
}
};
IMethodInstance[] array = methods.toArray(new IMethodInstance[methods.size()]);
Arrays.sort(array, comparator);
return Arrays.asList(array);
}
}
Это в основном определяет номера строк методов и сортирует их по возрастанию порядка их номера строки, т.е. порядок, по которому они определены в классе.
Ответ 5
Используйте это:
public class TestNG
{
@BeforeTest
public void setUp()
{
/*--Initialize broowsers--*/
}
@Test(priority=0)
public void Login()
{
}
@Test(priority=2)
public void Logout()
{
}
@AfterTest
public void tearDown()
{
//--Close driver--//
}
}
Обычно TestNG предоставляет количество аннотаций. Мы можем использовать @BeforeSuite, @BeforeTest, @BeforeClass
для инициализации браузеров/настроек.
Мы можем назначить приоритет, если вы написали количество тестовых примеров в своем script и хотите выполнить в соответствии с назначенным приоритетом, затем используйте:
@Test(priority=0)
начиная с 0,1,2,3....
Между тем мы можем группировать количество тестовых примеров и выполнять их путем группировки.
для этого мы будем использовать @Test(Groups='Regression')
В конце, как закрытие браузеров, мы можем использовать аннотации @AfterTest, @AfterSuite, @AfterClass
.
Ответ 6
Если я правильно понимаю ваш вопрос в том, что вы хотите запускать тесты в указанном порядке, можно использовать TestNG IMethodInterceptor. Посмотрите http://beust.com/weblog2/archives/000479.html о том, как использовать их.
Если вы хотите запустить некоторую предварительную инициализацию, взгляните на IHookable http://testng.org/javadoc/org/testng/IHookable.html и связанный поток http://groups.google.com/group/testng-users/browse_thread/thread/42596505990e8484/3923db2f127a9a9c?lnk=gst&q=IHookable#3923db2f127a9a9c
Ответ 7
@Test(dependsOnMethods="someBloodyMethod")
Ответ 8
Определив методы тестирования, которые будут выполняться в testNg.xml, мы можем выполнить тестовые примеры в нужном порядке
<suite>
<test name="selenium1">
<classes>
<class name="com.test.SeleniumTest" >
<methods><include name="methodB"></include>
<include name="methodA"></include>
</methods>
</class>
</classes>
</test>
</suite>
Ответ 9
Используя приоритетный параграф для @Test, мы можем контролировать порядок выполнения теста.
Ответ 10
Piggy отключение user1927494 ответ,
Если вы хотите запустить один тест перед всеми остальными, вы можете сделать это:
@Test()
public void testOrderDoesntMatter_1() {
}
@Test(priority=-1)
public void testToRunFirst() {
}
@Test()
public void testOrderDoesntMatter_2() {
}
Ответ 11
Порядок методов в файле класса непредсказуем, поэтому вам нужно либо использовать зависимости, либо явно указывать свои методы в XML.
По умолчанию TestNG будет запускать ваши тесты в том порядке, в котором они находятся в файле XML. Если вы хотите, чтобы классы и методы, перечисленные в этом файле, выполнялись в непредсказуемом порядке, установите для атрибута сохранения-заказа значение false
Ответ 12
Я столкнулся с одной и той же проблемой, возможная причина связана с параллельным выполнением testng, и решение заключается в добавлении опции Priority или просто обновлении preserve-order = "true" в вашем testng.xml.
<test name="Firefox Test" preserve-order="true">
Ответ 13
Существуют способы выполнения тестов в заданном порядке. Обычно тесты должны быть повторяемыми и независимыми, чтобы гарантировать, что он тестирует только желаемую функциональность и не зависит от побочных эффектов кода вне того, что тестируется.
Итак, чтобы ответить на ваш вопрос, вам нужно предоставить дополнительную информацию, такую как ПОЧЕМУ, что важно запускать тесты в определенном порядке.
Ответ 14
В случае использования дополнительных материалов, таких как dependsOnMethods
, вы можете определить весь поток @Test в файле testng.xml. AFAIK, порядок, определенный в вашем XML файле пакета (testng.xml), переопределит все другие стратегии упорядочения.
Ответ 15
use: preserve-order = "true" enabled = "true", который будет выполнять тестовые сценарии так, как вы написали.
<suite name="Sanity" verbose="1" parallel="" thread-count="">
<test name="Automation" preserve-order="true" enabled="true">
<listeners>
<listener class-name="com.yourtest.testNgListner.RetryListener" />
</listeners>
<parameter name="BrowserName" value="chrome" />
<classes>
<class name="com.yourtest.Suites.InitilizeClass" />
<class name="com.yourtest.Suites.SurveyTestCases" />
<methods>
<include name="valid_Login" />
<include name="verifyManageSurveyPage" />
<include name="verifySurveyDesignerPage" />
<include name="cloneAndDeleteSurvey" />
<include name="createAndDelete_Responses" />
<include name="previewSurvey" />
<include name="verifySurveyLink" />
<include name="verifySurveyResponses" />
<include name="verifySurveyReports" />
</methods>
</classes>
</test>
</suite>
Ответ 16
Ответ с важным объяснением:
Существует два параметра " TestNG ", которые должны определять порядок выполнения тестов:
@Test(dependsOnGroups= "someGroup")
А также:
@Test(dependsOnMethods= "someMethod")
В обоих случаях эти функции будут зависеть от метода или группы,
Но различия:
В этом случае:
@Test(dependsOnGroups= "someGroup")
Этот метод будет зависеть от всей группы, поэтому не обязательно, что сразу после выполнения зависимой функции этот метод также будет выполняться, но он может произойти позже в ходе выполнения и даже после выполнения других тестов.
Важно отметить, что в случае, когда в одном и том же наборе тестов в этом параметре используется более одного использования, это безопасный рецепт для проблем, потому что сначала будут запускаться зависимые методы всего набора тестов, а только потом методы, которые зависят от них.
Однако в этом случае:
@Test(dependsOnMethods= "someMethod")
Даже если этот параметр используется более одного раза в одном и том же наборе тестов, зависимый метод все равно будет выполнен после немедленного выполнения зависимого метода.
Надеюсь, что это ясно и помочь.
Ответ 17
Тесты, такие как модульные тесты? Зачем? Тесты должны быть независимыми, иначе.... вы не можете запускать тест индивидуально. Если они независимы, зачем даже вмешиваться? Плюс - что такое "порядок", если вы запускаете их в нескольких потоках на нескольких ядрах?