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

Как выполнить тесты в том порядке, в котором они были написаны?


person Badri    schedule 19.04.2010    source источник


Ответы (17)


Это сработает.

@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...) согласно документации.

person user1927494    schedule 10.09.2013

В TestNG вы используете dependsOnMethods и / или dependsOnGroups:

@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

person Cedric Beust    schedule 19.04.2010
comment
Однако решение Седрика имеет некоторые недостатки при работе с подключаемым модулем TestNG Eclipse, вер. 5.9.0.4, как и раньше, при каждом запуске TestCase показывает сообщение о том, что группы не поддерживаются этим плагином. - person honzajde; 06.07.2010
comment
dependsOnGroups чрезвычайно полезен, но мне кажется, что TestNG игнорирует priority, когда оба объединены вместе. - person G. Demecki; 02.06.2015

Чтобы обратиться к конкретному рассматриваемому сценарию:

@Test
public void Test1() {

}

@Test (dependsOnMethods={"Test1"})
public void Test2() {

}

@Test (dependsOnMethods={"Test2"})
public void Test3() {

}
person user2759895    schedule 08.09.2013

Если вы не хотите использовать параметр @Test(priority = ) в TestNG, вы можете использовать javaassist и IMethodInterceptor TestNG для определения приоритетов тестов в соответствии с порядком, в котором методы тестирования определены в тестовом классе. Это основано на решении, предоставленном здесь .

Добавьте этого слушателя в свой тестовый класс:

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);
    }
}

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

person jacobcs    schedule 24.01.2015
comment
Это реальное решение, если вам нужно перенести несколько сотен тестов из junit. - person Vitali Carbivnicii; 15.09.2015
comment
Это решает проблему сохранения порядка в случае, если вы не используете флаг зависимости в коде. - person Ankit Gupta; 19.07.2018

Использовать этот:

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 для инициализации браузеров / настройки.

Мы можем назначить приоритет, если вы написали количество тестовых примеров в своем скрипте и хотите выполнить в соответствии с назначенным приоритетом, тогда используйте: @Test(priority=0), начиная с 0,1,2,3 ....

Между тем мы можем сгруппировать количество тестовых случаев и выполнить их путем группировки. для этого мы будем использовать @Test(Groups='Regression')

В конце, как и при закрытии браузеров, мы можем использовать @AfterTest, @AfterSuite, @AfterClass аннотации.

person Bharat Mane    schedule 26.03.2016

Если я правильно понимаю ваш вопрос в том, что вы хотите запускать тесты в указанном порядке, можно использовать 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

person Kartik    schedule 28.04.2010

Копилка отступает от ответа пользователя 1927494. Если вы хотите запустить один тест раньше всех остальных, вы можете сделать это:

@Test()
public void testOrderDoesntMatter_1() {
}

@Test(priority=-1)
public void testToRunFirst() {
}

@Test()
public void testOrderDoesntMatter_2() {
}
person Big Gunz    schedule 15.05.2014

Указав методы тестирования, которые будут выполняться в 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>

person seetha    schedule 06.03.2015

Используя параметр приоритета для @Test, мы можем контролировать порядок выполнения теста.

person Madan    schedule 21.08.2012
comment
К сожалению, не в TestNG. - person Mariusz Jamro; 11.04.2013
comment
@MariuszJamro Я не понимаю, почему? Priority параметра еще не было в 2012 году? - person G. Demecki; 29.09.2015

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

По умолчанию TestNG будет запускать ваши тесты в том порядке, в котором они находятся в XML-файле. Если вы хотите, чтобы классы и методы, перечисленные в этом файле, выполнялись в непредсказуемом порядке, установите для атрибута preserve-order значение false.

person san1deep2set3hi    schedule 08.10.2015

Я столкнулся с той же проблемой, возможная причина связана с параллельным выполнением testng, и решение состоит в том, чтобы добавить параметр Priority или просто обновить preserve-order = "true" в вашем testng.xml.

<test name="Firefox Test" preserve-order="true">
person Kiran    schedule 20.05.2016
comment
preserve-order = true, по умолчанию в testng.xml и работает только для того порядка, который вы определили только в testng.xml, поэтому решение вашей проблемы - это только добавление приоритета к @Tests - person Kiran; 20.05.2016

Ответ с важным объяснением:

Есть два параметра TestNG, которые должны определять порядок выполнения тестов:

@Test(dependsOnGroups= "someGroup")

А также:

@Test(dependsOnMethods= "someMethod")

В обоих случаях эти функции будут зависеть от метода или группы,

Но отличия:

В этом случае:

@Test(dependsOnGroups= "someGroup")

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

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

Однако в этом случае:

@Test(dependsOnMethods= "someMethod")

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

Надеюсь, это ясно и поможет.

person Gavriel Cohen    schedule 02.09.2018

Есть способы выполнять тесты в заданном порядке. Однако обычно тесты должны быть повторяемыми и независимыми, чтобы гарантировать, что они тестируют только желаемую функциональность и не зависят от побочных эффектов кода за пределами того, что тестируется.

Итак, чтобы ответить на ваш вопрос, вам необходимо предоставить дополнительную информацию, например, ПОЧЕМУ важно запускать тесты в определенном порядке.

person Kelly S. French    schedule 19.04.2010
comment
Есть много ситуаций, когда зависимости полезны, особенно для интеграции и функционального тестирования. Например, тестирование веб-сайта: вы хотите сначала протестировать страницу входа, а затем следующую страницу и т. Д. Постоянная очистка и воссоздание состояния с нуля непрактична и приводит к очень медленным тестам. Кроме того, зависимости дают вам гораздо лучшую диагностику, например, 1 тест не пройден, 99 тестов пропущены вместо традиционных 100 тестов, что не помогает понять, что все эти сбои на самом деле вызваны неудачей одного теста. - person Cedric Beust; 19.04.2010

Если вам случится использовать дополнительные вещи, такие как dependsOnMethods, вы можете определить весь поток @Test в своем файле testng.xml. AFAIK, порядок, определенный в XML-файле вашего набора (testng.xml), переопределит все другие стратегии упорядочения.

person Akshay Maldhure    schedule 04.09.2017

используйте: 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>
person Ankit Gupta    schedule 14.03.2018

Такие тесты, как модульные тесты? Зачем? Тесты ДОЛЖНЫ быть независимыми, иначе .... вы не сможете запустить тест индивидуально. Если они независимы, зачем вообще мешать? Плюс - что такое «порядок», если вы запускаете их в несколько потоков на нескольких ядрах?

person TomTom    schedule 19.04.2010
comment
На самом деле вполне возможно смешивать зависимости и параллелизм. Взгляните на эту статью, чтобы узнать, как это делает TestNG: beust.com/weblog/2009/11/28/hard-core-multicore-with-testng - person Cedric Beust; 19.04.2010
comment
Люди используют JUnit для множества вещей, помимо модульных тестов. Почти во всех этих дополнительных применениях есть моменты, когда вам нужно делать что-то в определенном порядке. Это одно из основных доводов в пользу разработки TestNG, BTW. - person Jeffiekins; 30.01.2014

person    schedule
comment
Я мог бы отметить, что это не особенно полезный ответ - я предлагаю более подробно остановиться на ваших ответах! - person ; 23.04.2013