Порядок выполнения тестов в 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

Тесты, такие как модульные тесты? Зачем? Тесты должны быть независимыми, иначе.... вы не можете запускать тест индивидуально. Если они независимы, зачем даже вмешиваться? Плюс - что такое "порядок", если вы запускаете их в нескольких потоках на нескольких ядрах?