Перезапустите весь класс в случае неудачного теста, используя TestNG - PullRequest
0 голосов
/ 12 декабря 2018

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

Пример:

Class1:
-Class1_Test1
-Class1_Test2
-Class1_Test3
Class2:
-Class2_Test1
-Class2_Test2
-Class2_Test3

Я пытался интегрировать IRetryAnalyzer, но он просто вызывает неудачный тестовый случай.Требуется выполнить полный Class1 в случае сбоя Class1_Test2, как только произойдет сбой Class1, прежде чем он перейдет к Class2?

Причиной запроса является приложение медиапроигрывателя, а в случае сбоя воспроизведения мультимедиа из-заПроблемы с сетью / сервером. Следующие тестовые примеры перемотки вперед и назад не потребуются, поэтому потребуется перезапустить приложение и повторить все шаги перед выполнением дальнейших тестов.

Ответы [ 3 ]

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

Я использую групповой тест.Он продолжит тестирование, даже если какой-то тест не пройден в классе.

В вашем файле класса вы можете определить группу следующим образом.

public class myClass(){
    @Test(groups = {"abc"}, priority = 1)
    public void test1(){
    }
    @Test(groups = {"abc"}, priority = 2)
    public void test2(){
    }
    @Test(groups = {"abc"}, priority = 3)
    public void test3(){
    }
}

аналогично вы можете определить второй класс с тем же именем группыили другое имя группы.Приоритет определяет порядок, в котором выполняется тестовый пример.

Ваш файл Testng.xml будет выглядеть следующим образом:

<test name="any name">
  <groups>
    <run>

      <include name="abc"  />
      <include name="any other group name"  />
    </run>
  </groups>

  <classes>
    <class name="packageName.myClass"/>
    <class name="your_packageName.class2"/>
  </classes>
</test>

packageName - это путь, где расположен ваш класс Test.Если ваш тестовый класс и файлы testng.xml находятся в одном пакете, packageName не требуется.

Для получения дополнительной информации о методе теста в Testng см. эту ссылку .

0 голосов
/ 07 января 2019

Наконец-то нашли обходной путь для повторного запуска всего класса.Я бы назвал это обходным путем, так как технически TestNG не предоставляет способ для повторного выполнения @BeforeTest в случае сбоя в любой момент времени.

Наилучший возможный метод, который я нашел, - это отсутствие раздела @BeforeTest.и иметь только один раздел @Test и все тестовые случаи в качестве функций, которые будут вызываться в пределах одного определенного @Test.Таким образом, в случае сбоя в любой момент времени, @Test будет вызван, который содержит все функции в необходимом порядке, включая настройку возможностей.Логика повторных попыток перезапускает весь раздел @Test, как только наблюдается сбой.

Пример :

До изменений:

package <yourpackagename>;

<import required packages>

public class Home {
    private AppiumDriver<?> driver;
    private static final String url = "http://0.0.0.0:4723/wd/hub";

    <define your variables>

    @Parameters({"deviceOS", "DSN"})
    @BeforeTest
    public void setUp(String deviceOS, String DSN) throws InterruptedException, MalformedURLException, ParseException {
        DesiredCapabilities capabilities = new DesiredCapabilities();
        capabilities.setCapability(CapabilityType.BROWSER_NAME, "");
        capabilities.setCapability("deviceName", "FireTVStick");
        capabilities.setCapability("platformVersion", deviceOS);
        capabilities.setCapability("udid", DSN);
        capabilities.setCapability("platformName", "Android");
        capabilities.setCapability("noReset", true);
        capabilities.setCapability("fullReset", false);
        capabilities.setCapability(MobileCapabilityType.NEW_COMMAND_TIMEOUT, 1200);
        capabilities.setCapability("appPackage", "<your app package>");
        capabilities.setCapability("appActivity", "<your launcher activity>");
        driver = new AndroidDriver<>(new URL(url), capabilities);
        driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        //End of Launch Code

        System.out.println("-Testing Home Section-");
    }   


    @Parameters({"DSN"})
    @Test
    public void Test1_VideoPlaybackVerification(String DSN) throws InterruptedException, ParseException{

        //Video playback verification code starts
        .
        .
        //End of code for Video playback verification
    }


    @Test //Test Case for Pause verification
    public void Test2_PauseVerification() throws InterruptedException, ParseException{
        //Video pause verification code starts
        .
        .
        //End of code for Video pause verification
    }

    @AfterTest
    public void End() {
        driver.quit();
    }
}

После изменений:

package <yourpackagename>;

<import required packages>

@Listeners(MyTestListenerAdapter.class)
public class Home {
    private AppiumDriver<?> driver;

    <define your variables>

    public void setUp(String port, String deviceOS, String DSN, String deviceName) throws InterruptedException, MalformedURLException {
        DesiredCapabilities capabilities = new DesiredCapabilities();
        capabilities.setCapability(CapabilityType.BROWSER_NAME, "");
        capabilities.setCapability("platformVersion", deviceOS);
        capabilities.setCapability("deviceName", deviceName);
        capabilities.setCapability("udid", DSN);
        capabilities.setCapability("platformName", "Android");
        capabilities.setCapability("noReset", true);
        capabilities.setCapability("fullReset", false);
        capabilities.setCapability(MobileCapabilityType.NEW_COMMAND_TIMEOUT, 1200);
        capabilities.setCapability("appPackage", "<your app package>");
        capabilities.setCapability("appActivity", "<your launcher activity>");
        final String url = "http://127.0.0.1:"+port+"/wd/hub";
        driver = new AndroidDriver<>(new URL(url), capabilities);
        driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
    }

    public void HomeVerification(String DSN, String deviceName) throws InterruptedException, ParseException
    {
        System.out.println(deviceName+": Testing Home Section-");

        <--Your code to perform any additional task before execution-->
    }

    public void Test1_VideoPlaybackVerification(String DSN, String deviceName) throws InterruptedException, ParseException
    {       
        //Video playback verification code starts
        .
        .
        //End of code for Video playback verification
    }

    public void Test2_PauseVerification(String deviceName) throws InterruptedException, ParseException
    {

        //Video pause verification code starts
        .
        .
        //End of code for Video pause verification
    }

    @Parameters({"port", "deviceOS", "DSN", "deviceName"})
    @Test (retryAnalyzer = Retry.class)
    public void TestRun(String port, String deviceOS, String DSN, String deviceName) throws InterruptedException, ParseException, MalformedURLException {

        try {
            setUp(port, deviceOS, DSN, deviceName);
            HomeVerification(DSN, deviceName);
            Test1_VideoPlaybackVerification(DSN, deviceName);
            Test2_PauseVerification(deviceName);
        } catch (WebDriverException e) {
            // TODO Auto-generated catch block
            Reporter.log(deviceName+": Error observed while executing script!", true);
            Assert.assertTrue(false); //Fails the test case
        }

    }

    @AfterTest
    public void End() {
        driver.quit();
    }
}
0 голосов
/ 12 декабря 2018

Нет способа добиться этого в соответствии с документацией TestNg, может быть ниже ответ может помочь вам

Повторить логику - повторить весь класс, если один из тестов не пройден - селен

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