Как остановить автоматизацию селена, если методы тестирования 20% или первых 20 тестовых случаев не работают? - PullRequest
1 голос
/ 27 мая 2020

У меня есть 100 тестовых примеров, если все 20% или первые 20 тестовых случаев терпят неудачу, как я могу остановить выполнение? Уже тестировали ITestResult, где мне сломать сборку?

@Test(retryAnalyzer = ReTryFail.class, dataProvider = "SanityTCTest", dataProviderClass = utility.Xlsdataprovider.class, groups = "Dashboard", alwaysRun = true)
public void Sanity_TC001(LinkedHashMap<String, String> data) throws InterruptedException, SQLException {

 Some code 
}

@Test(retryAnalyzer = ReTryFail.class, dataProvider = "SanityTCTest", dataProviderClass = utility.Xlsdataprovider.class, groups = "Dashboard", alwaysRun = true)
public void Sanity_TC002(LinkedHashMap<String, String> data) throws InterruptedException, SQLException {

 Some code 
}

@Test(retryAnalyzer = ReTryFail.class, dataProvider = "SanityTCTest", dataProviderClass = utility.Xlsdataprovider.class, groups = "Dashboard", alwaysRun = true)
public void Sanity_TC003(LinkedHashMap<String, String> data) throws InterruptedException, SQLException {

 Some code 
}
///////////////////////////////

Где я могу нарушить этот набор, если Результат: «FAIL больше 20? Требуется ли мне создать новый класс или я могу добавить его ниже?

@AfterMethod(alwaysRun = true)
public void reporterDataResults(ITestResult Result) throws InterruptedException {
    boolean flag = false;
    Testfail = TestResultStatus.Testfail;

    /*System.out.println("test fail flag in AfterMethod: " + Testfail); */
    if (Result.getStatus() == ITestResult.SKIP) {
        Resmark.put(Result.getName(), "");
        captureScreenShot(Result, "SKIP", getDriver());
        Reporter.log(Result.getName() + " is SKIPPED");
        Add_Log.info(Result.getName() + " is SKIPPED");
        TestResultTL.put(Result.getName(), "SKIP");
        if (!(getDriver() == null)) {
            closeWebBrowser();
        }
    } else if (Result.getStatus() == ITestResult.FAILURE) {

        Collection<String> values = TestResultStatus.mpaskeysnew.get(Result.getName());
        String resultout = String.join(" | ", values);
        System.out.println(resultout);
        Resmark.put(Result.getName(), resultout);

        captureScreenShot(Result, "FAIL", getDriver());
        Reporter.log(Result.getName() + " is FAIL");
        Add_Log.info(Result.getName() + " is FAIL");
        if (!(getDriver() == null)) {
            closeWebBrowser();
        }
        TestResultTL.put(Result.getName(), "FAIL");


    } else {
        captureScreenShot(Result, "PASS", getDriver());
        Resmark.put(Result.getName(), "");
        Reporter.log(Result.getName() + " is PASS");
        Add_Log.info(Result.getName() + " is PASS");
        if (!(getDriver() == null)) {
            closeWebBrowser();
        }
        TestResultTL.put(Result.getName(), "PASS");

    }
    Testskip = false;
    TestResultStatus.Testfail = false;

}

1 Ответ

1 голос
/ 28 мая 2020

Вы можете реализовать ISuiteListener, а в методе onFinish у вас будет доступ к ISuite и ISuiteResult

Тогда вы можете сделать

public void onFinish(ISuite suite) {

        final Map<java.lang.String,ISuiteResult>  res = suite.getResults();

                for (ISuiteResult r : res.values()) {
                  context =  r.getTestContext()  ;
                  failedTestCases =context.getFailedTests().size();
                 }
         }

size() даст вам номер неудавшегося теста для этого набора. Как только вы знаете это число, вы можете реализовать его, чтобы остановить выполнение, используя стратегии в this

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

Другой альтернативой является реализация ITestListener. В методе onTestFailure у вас есть доступ к ITestResult

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

Здесь я отредактировал, чтобы объяснить, как вы реализуете слушателя

import org.testng.ISuiteListener;

public class listener implements Itestlistener {
            public int i = 0;

             public void onTestFailure(ITestResult result) {

                     result.getName();
                     i++;
                     //your break logic goes here
                       if (i ==20){
                              // do something or call some function to stop execution
                             }
         }

     }

Вы можете узнать больше о слушателях testng здесь .

Для вашего EDIT выше (если вы хотите go таким образом). Хотя я все еще думаю, что вам следует реализовать слушатель, который более чище. Он будет вызываться только в том случае, если тест не пройден.

Но сделайте то же самое, что и я в методе onTestFailure, добавьте счетчик и увеличьте его до else if.

   public int i = 0;  //do this in your class

то в вашем методе

 else if (Result.getStatus() == ITestResult.FAILURE) {
    i++;  //increase counter here
    Collection<String> values = TestResultStatus.mpaskeysnew.get(Result.getName());
    String resultout = String.join(" | ", values);
    System.out.println(resultout);
    Resmark.put(Result.getName(), resultout);

    captureScreenShot(Result, "FAIL", getDriver());
    Reporter.log(Result.getName() + " is FAIL");
    Add_Log.info(Result.getName() + " is FAIL");
    if (!(getDriver() == null)) {
        closeWebBrowser();
    }
       TestResultTL.put(Result.getName(), "FAIL");
      if (i==20){
         // stop execution here
      }

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