2010-04-19 2 views
58

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

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

ответ

-5

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

+2

На самом деле вполне можно смешать зависимости и параллелизм, взгляните на эту статью, чтобы узнать, как это делает TestNG: http: // beust.com/weblog/2009/11/28/hard-core-multicore-with-testng/ –

+0

Люди используют JUnit для множества вещей помимо модульных тестов. Почти все эти дополнительные виды использования имеют время, когда вам нужно делать что-то в определенном порядке. Это одно из основных обоснований для разработки TestNG, BTW. – Jeffiekins

0

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

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

+16

Существует много ситуаций, когда зависимости полезны, особенно для интеграции и функционального тестирования. Например, тестирование веб-сайта: сначала вы должны проверить страницу входа в систему, а затем следующую страницу и т. Д. Очистка и восстановление состояния с нуля все время непрактично и приводит к очень медленным испытаниям. Кроме того, зависимости дают вам гораздо лучшую диагностику, такую ​​как «1 тест не прошел, 99 тестов пропустили» вместо традиционных «100 тестов не удалось», что не позволяет понять, что все эти сбои на самом деле связаны с тем, что один тест не прошел. –

52

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

@Test(groups = "a") 
public void f1() {} 

@Test(groups = "a") 
public void f2() {} 

@Test(dependsOnGroups = "a") 
public void g() {} 

В этом случае г() будет работать только после того, как f1() и f2() завершили и успешно.

Вы найдете много примеров в документации: http://testng.org/doc/documentation-main.html#test-groups

+1

'dependOnGroups' чрезвычайно полезна, но мне кажется, что TestNG игнорирует« приоритет », когда оба объединяются вместе. –

+0

Однако решение Седрика имеет некоторые недостатки при работе с TestNG Eclipse Plugin, ver. 5.9.0.4 по мере того, как каждый запуск TestCase показывает сообщение о том, что эти плагины не поддерживаются этими плагинами. – honzajde

4

Если я правильно понимаю ваш вопрос в том, что вы хотите запустить тесты в определенном порядке, TestNG IMethodInterceptor можно использовать. Посмотрите на http://beust.com/weblog2/archives/000479.html о том, как использовать их.

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

1

С помощью приоритета paramenter для @Test мы можем контролировать порядок выполнения тестов.

+2

К сожалению, не в TestNG. –

+0

@MariuszJamro Не понимаю почему? Параметр «Приоритет» еще не существует в 2012 году? –

4
@Test(dependsOnMethods="someBloodyMethod") 
+3

Я мог бы отметить, что это не очень полезный ответ - я предлагаю расширить свои ответы чуть подробнее! – Zyerah

19

Для решения определенного сценария в вопросе:

@Test 
public void Test1() { 

} 

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

} 

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

} 
60

Это будет работать.

@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.

1

Piggy отступая ответа user1927494, в В случае, если вы хотите запустить один тест перед всеми другими, вы можете сделать это:

@Test() 
public void testOrderDoesntMatter_1() { 
} 

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

@Test() 
public void testOrderDoesntMatter_2() { 
} 
3

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

Добавить этот слушатель в тестовом классе:

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

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

+1

Это реальное решение, если вам нужно перенести несколько сотен тестов из junit – realcnbs

1

Указав методы испытаний должны быть выполнены в testNg.xml мы можем выполнить тестовые случаи в желаемом порядке

<suite> 
 
<test name="selenium1"> 
 
    \t \t <classes> 
 
\t \t \t <class name="com.test.SeleniumTest" > 
 
\t \t \t  <methods><include name="methodB"></include> 
 
\t \t \t   <include name="methodA"></include> 
 
\t \t \t  </methods>  
 
\t \t \t </class> 
 
\t \t </classes> 
 
    
 
\t </test> 
 
</suite>

1

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

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

4

Используйте это:

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.

1

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

<test name="Firefox Test" preserve-order="true"> 
+1

preserve-order = "true", по умолчанию в testng.xml, и он работает только для того, что вы определили только в testng.xml, поэтому разрешение для вашей проблемы добавляет приоритет @Tests – Kiran

0

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

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