【问题标题】:Rerun whole class in case of failed test case using TestNG在使用 TestNG 失败的测试用例的情况下重新运行整个班级
【发布时间】:2018-12-12 05:33:08
【问题描述】:

我有一个使用 Appium 和 TestNG 开发的脚本设置。 TestNG xml 包含多个类的执行,每个类都有多个测试用例。

例子:

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

我尝试集成 IRetryAnalyzer 但这只是调用失败的测试用例。要求是执行完整的 Class1 以防 Class1_Test2 在 Class1 失败后立即执行到 Class2 之前?

询问的原因是该应用程序是一个媒体播放器,如果由于网络/服务器问题导致媒体播放失败,则不需要执行下一个前进和后退测试用例,需要重新启动应用程序并在执行进一步测试之前重试所有步骤。

【问题讨论】:

  • 您使用的是哪个测试版本?
  • TestNG 版本为 6.14.2

标签: java testing testng


【解决方案1】:

根据 TestNg 文档没有办法实现这一点,可能下面的答案可以帮助你

Retry Logic - retry whole class if one tests fails - selenium

【讨论】:

    【解决方案2】:

    我正在使用小组测试。即使类中的某些测试失败,它也会继续测试。

    在您的类文件中,您可以定义如下组。

    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中测试方法的更多信息请参考this link

    【讨论】:

      【解决方案3】:

      终于找到了重新运行整个课程的解决方法。我认为这是一种解决方法,因为从技术上讲,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();
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2018-12-31
        • 1970-01-01
        • 2014-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-07
        • 2023-03-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多