Как запустить тест дважды с помощью TestNG - PullRequest
0 голосов
/ 16 декабря 2018

Я делаю тесты автоматизации с использованием TestNG и Maven.Мне нужно выполнить один тест дважды, сначала запустив один параметр (например, состояние = 1), а затем и тот же параметр, но с другим значением (состояние = 2).

У меня много (большечем 50) методы с аннотацией @Test.Идея состоит в том, чтобы каждый тест вызывался w раз, при этом написалось как можно меньше кода.

Как дважды запустить мой тест с этими двумя состояниями?

Ответы [ 4 ]

0 голосов
/ 24 декабря 2018

Я предпочитаю ответ, предоставленный Кришнаном Махадеваном, но если вы считаете необходимым избегать кодирования, тогда можете использовать два <Test> в файле testng.xml.

<test name="Test1" preserve-order="true">
    <parameter name="State" value="State1"></parameter>

    <classes>

        <class  name="class.here" />
 </classes>

</test> <!-- Test -->


 <test name="Test2" preserve-order="true">
    <parameter name="State" value="State2"></parameter>

    <classes>

        <class  name="class.here" />
 </classes>

</test> <!-- Test -->

Так что Test1 работает с одним состоянием, а Test2 работает сдругое состояние.

используйте @Test(invocationCount = 2), чтобы повторить тот же тест

0 голосов
/ 20 декабря 2018

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

  1. Убедитесь, что вы используете TestNG 7.0.0-beta1 (последняя выпущенная на сегодня версия)
  2. В вашем комплектеXML-файл, добавьте параметр уровня набора, который захватывает все значения состояний, для которых необходимо повторить тесты, разделяя их на ,
  3. Создание реализации org.testng.IAlterSuiteListener, которая в основном разбивает параметр уровня набора на несколькопараметров, повторяет тесты в наборе, клонирует их и добавляет параметры разделения к каждому из тестов.

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

Тестовый класс выглядит следующим образом:

package com.rationaleemotions.stackoverflow.qn53803675;

import org.testng.ITestResult;
import org.testng.Reporter;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;

public class SampleTestClass {

  @Test
  @Parameters("state")
  public void testMethodOne(int state) {
    printer(state);
  }

  @Test
  @Parameters("state")
  public void testMethodTwo(int state) {
    printer(state);
  }

  private void printer(int state) {
    ITestResult result = Reporter.getCurrentTestResult();
    String methodname = result.getMethod().getMethodName();
    String testname = result.getTestContext().getName();
    String msg =
        String.format("%s() from <%s> running with state [%d]", methodname, testname, state);
    System.err.println(msg);
  }
}

Вот как будет выглядеть слушатель, изменяющий комплект

package com.rationaleemotions.stackoverflow.qn53803675;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import org.testng.IAlterSuiteListener;
import org.testng.xml.XmlSuite;
import org.testng.xml.XmlTest;

public class SimpleSuiteAlterer implements IAlterSuiteListener {

  @Override
  public void alter(List<XmlSuite> suites) {
    XmlSuite suite = suites.get(0);
    // Fetch the suite level parameter called "states" and split it by comma
    // We will get all the states that we need to run for.
    String[] states = suite.getParameter("states").split(",");
    // We are going to assume that only those <test> tags that begin with "dynamic"
    // in their names will be considered for multiple execution.
    List<XmlTest> dynamictests =
        suite
            .getTests()
            .stream()
            .filter(xmlTest -> xmlTest.getName().startsWith("dynamic"))
            .collect(Collectors.toList());

    List<XmlTest> clonedTests = new ArrayList<>();
    for (XmlTest each : dynamictests) {
      for (int i = 1; i < states.length; i++) {
        XmlTest cloned = new XmlTest(suite);
        cloned.addParameter("state", states[i]);
        cloned.setName(each.getName() + "_cloned");
        cloned.getXmlClasses().addAll(each.getClasses());
        clonedTests.add(cloned);
      }
      each.addParameter("state", states[0]);
    }
    dynamictests.addAll(clonedTests);
  }
}

Вот как XML-файл комплектавыглядит как

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="53803675_suite" parallel="false" verbose="2">
  <listeners>
    <listener class-name="com.rationaleemotions.stackoverflow.qn53803675.SimpleSuiteAlterer"/>
  </listeners>
  <parameter name="states" value="1,2"/>
  <test name="dynamic-53803675-test">
    <classes>
      <class name="com.rationaleemotions.stackoverflow.qn53803675.SampleTestClass"/>
    </classes>
  </test>
</suite>

Вот как выглядит вывод

...
... TestNG 7.0.0-beta1 by Cédric Beust (cedric@beust.com)
...
testMethodOne() from <dynamic-53803675-test> running with state [1]
testMethodTwo() from <dynamic-53803675-test> running with state [1]
testMethodOne() from <dynamic-53803675-test_cloned> running with state [2]
PASSED: testMethodOne(1)
PASSED: testMethodTwo(1)

===============================================
    dynamic-53803675-test
    Tests run: 2, Failures: 0, Skips: 0
===============================================

testMethodTwo() from <dynamic-53803675-test_cloned> running with state [2]
PASSED: testMethodOne(2)
PASSED: testMethodTwo(2)

===============================================
    dynamic-53803675-test_cloned
    Tests run: 2, Failures: 0, Skips: 0
===============================================

===============================================
53803675_suite
Total tests run: 4, Passes: 4, Failures: 0, Skips: 0
===============================================


Process finished with exit code 0
0 голосов
/ 21 декабря 2018

Использовать invocationCount - TESTNG

    @Test(invocationCount = 2)
    public void test() {
    }

Вышеупомянутый тест будет выполнен 2 раза.

Вы можете установить invocationCount global, если он применим для всех тестовнапример,

public class InvocationCount implements IAnnotationTransformer {

@SuppressWarnings("rawtypes")
@Override
public void transform(ITestAnnotation annotation, Class testClass, Constructor testConstructor, Method testMethod) {
    annotation.setInvocationCount(Integer.parseInt(number_of_times_to_execute)));
}
0 голосов
/ 18 декабря 2018

попробуйте вот так

//This method will provide data to any test method that declares that its Data Provider
//is named "test1"
@DataProvider(name = "test1")
public Object[][] createData1() {
return new Object[][] {
  { "Cedric", new Integer(36) },
  { "Anne", new Integer(37)},
 };
}

 //This test method declares that its data should be supplied by the Data Provider
 //named "test1"
 @Test(dataProvider = "test1")
public void verifyData1(String n1, Integer n2) {
 System.out.println(n1 + " " + n2);
}

см. Здесь http://testng.org/doc/documentation-main.html#parameters-dataproviders

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...