Selenium和TestNG使用'dependsOn'和'priority ='问题

时间:2013-09-04 08:14:06

标签: java selenium selenium-webdriver testng

我正在GUI自动化测试中实现更好的工作流程控制。我首先从dependsOn开始,但很快发现缺点是,如果一个测试失败,整个套件的其余部分都不会运行。所以我切换到使用'priority =',但我看到了意想不到的行为。一个例子:

@Test(priority = 10)
public void login(){...}

@Test(priority = 20, dependsOnMethods = "login")
public void verifyUserLogin() {...}

@Test(priority = 30, dependsOnMethods = "verifyUserLogin")
public void navigateToReportSettings() {...}

@Test(priority = 40, dependsOnMethods = "navigateToReportSettings")
public void verifyGeneralSettings() {...}

@Test(priority = 40, dependsOnMethods = "navigateToReportSettings")
public void verifyReportingPeriod() {...}
...
@Test(priority = 90, dependsOnMethods = "navigateToReportSettings")
public void saveReportSettings() {...}

我想要发生什么:

  1. 登录。
  2. 验证用户是否已登录。
  3. 导航至报告设置页面。
  4. 在报告设置页面(按任意顺序)验证常规设置和报告周期
  5. 进行一些更改并保存。
  6. 重要提示:10,20和30必须成功或跳过其余部分。如果任何40次失败,则在所有40次完成后继续失败。但是不依赖任何步骤40s才能成功!
  7. 发生了什么:

    1. 登录(优先级10)。
    2. 保存(优先级90)。
    3. 注意:还有“群组”注释,但我不认为这与此相关。 提前感谢有关如何组合优先级和依赖于成功控制工作流程的任何提示,但只能在需要时使用依赖项。

      这是另一个示例代码。 我不知道为什么它按此顺序运行: 输出: 10,20,30,40等... 110,//好的 130,140,​​150,160,//为什么跳过了120个优先级? 120,120,120等... 120 //跑到最后? 同样有趣的是120s组可以按顺序重新编号(121,122,123等),但它们仍然是最后一次运行。

      因此问题必须是'dependsOn'和'priority ='根本不能很好地结合在一起。而且我很好奇是否有人让这两个人在他们的环境中工作。谁知道它可能是一个但与Intellij IDEA?无论如何,我需要尽快到底,以避免以后进行昂贵的重构!再次感谢任何反馈 - JR

      @Test(priority = 10, groups = "A")
      public void login(){
      
      System.out.println("10");
      
      }
      
      
      @Test(priority = 20, groups = {"A", "B"})
      public void openUserAdministrationTest() {
      
          System.out.println("20");
      
      }
      
      @Test(priority = 30, groups = {"A", "B"})
      public void usersTabTest() {
      
          System.out.println("30");
      
      }
      
      @Test(priority = 40, groups = {"A", "B"})
      public void createUserTabTest() {
      
          System.out.println("40");
      
      }
      
      
      @Test(priority = 50, groups = {"A", "B"})
      public void userCreationDataEntryTest() {
      
          System.out.println("50");
      
      }
      
      @Test(priority = 60, groups = {"A", "B", "C"})
      public void userRolesTest() {
      
          System.out.println("60");
      
      }
      
      @Test(priority = 70, groups = {"A", "B"})
      public void saveUserTest() {
      
          System.out.println("70");
      
      }
      
      @Test(priority = 80, groups = {"A", "B"})
      public void closeUserAdminAndLogoutTest() {
      
          System.out.println("80");
      
      }
      
      @Test(priority = 90, groups = "A")
      public void loginNavigateToUserAdmin() {
      
          System.out.println("90");
      }
      
      @Test(priority = 100, groups = {"A", "D"})
      public void verifyUserSearchUserReturned() {
      
          System.out.println("100");
      
      }
      
      @Test(priority = 110, groups = {"A", "D"})
      public void reOpenNewUserTest() {
      
          System.out.println("110");
      
      }
      
      @Test(priority = 120, groups = {"A", "E"}, dependsOnMethods = "reOpenNewUserTest")
      public void verifyNewUserUserNameTest() {
      
          System.out.println("120");
      }
      
      @Test(priority = 120, groups = {"A", "E"}, dependsOnMethods = "reOpenNewUserTest")
      public void verifyNewUserFullNameTest() {
      
          System.out.println("120");
      }
      
      @Test(priority = 120, groups = {"A", "E"}, dependsOnMethods = "reOpenNewUserTest")
      public void verifyNewUserDepartmentTest() {
      
          System.out.println("120");
      }
      
      @Test(priority = 120, groups = {"A", "E"}, dependsOnMethods = "reOpenNewUserTest")
      public void verifyNewUserPhoneNumberTest() {
      
          System.out.println("120");
      }
      
      @Test(priority = 120, groups = {"A", "E"}, dependsOnMethods = "reOpenNewUserTest")
      public void verifyNewUserEmailTest() {
      
          System.out.println("120");
      }
      
      //      Note: password and active verified by user login
      
      @Test(priority = 120, groups = {"A", "E"}, dependsOnMethods = "reOpenNewUserTest")
      public void verifyNewUserActiveCheckedTest() {
          System.out.println("120");
      }
      
      @Test(priority = 120, groups = {"A", "E"}, dependsOnMethods = "reOpenNewUserTest")
      public void verifyNewUserLanguageTest() {
      
          System.out.println("120");
      }
      
      @Test(priority = 120, groups = {"A", "E"}, dependsOnMethods = "reOpenNewUserTest")
      public void verifyNewUserDateFormatTest() {
      
          System.out.println("120");
      }
      
      @Test(priority = 120, groups = {"A", "E"}, dependsOnMethods = "reOpenNewUserTest")
      public void verifyNewUserNumberFormatTest() {
      
          System.out.println("120");
      }
      
      @Test(priority = 120, groups = {"A", "E"}, dependsOnMethods = "reOpenNewUserTest")
      public void verifyNewUserReportingPeriodTest() {
      
          System.out.println("120");
      }
      
      @Test(priority = 120, groups = {"A", "E"}, dependsOnMethods = "reOpenNewUserTest")
      public void verifyNewUserReportingPeriodExampleTest() {
      
          System.out.println("120");
      }
      
      @Test(priority = 120, groups = {"A", "E"}, dependsOnMethods = "reOpenNewUserTest")
      public void verifyNewUserReferencePeriodTest() {
      
          System.out.println("120");
      }
      
      @Test(priority = 120, groups = {"A", "E"}, dependsOnMethods = "reOpenNewUserTest")
      public void verifyNewUserReferencePeriodExampleTest() {
      
          System.out.println("120");
      }
      
      @Test(priority = 120, groups = {"A", "E"}, dependsOnMethods = "reOpenNewUserTest")
      public void verifyNewUserShowAnnotationsCheckedTest() {
          System.out.println("120");
      }
      
      @Test(priority = 130, groups = {"A", "C"})
      public void verifyNewUserRoleTest() {
      
          System.out.println("130");
      }
      
      
      @Test(priority = 140, groups = {"A", "C"})
      public void verifyNewUserFunctionalRoleTest() {
      
          System.out.println("140");
      
      }
      
      @Test(priority = 150, groups = {"A", "C"})
      public void verifyUserAdminCloseAndLogoutTest() {
      
          System.out.println("150");
      
      }
      
      @Test(priority = 160, groups = {"A", "C"})
      public void verifyUserLogin() {
      
          System.out.println("160");
      
      }
      

      这是一个更简单的例子,但也显示了如何依赖于简单地打破优先级:

      @Test(priority = 10)
      public void test10(){
          System.out.println("10");
      }
      
      @Test(priority = 20, dependsOnMethods = "test10")
      public void test20() {
          System.out.println("20, depends on 10");
      }
      
      @Test(priority = 30, dependsOnMethods = "test20")
      public void test30() {
          System.out.println("30, depends on 20");
      }
      
      @Test(priority = 40, dependsOnMethods = "test10")
      public void test40() {
          System.out.println("40, depends on 10");
      }
      

      应该跑:10,20,30,40。 运行:10,20,40,30。

3 个答案:

答案 0 :(得分:2)

不提供优先级并依赖于一起,您可以对测试进行分组。你可以这样做 例如,

@Test(priority = 10, groups = { "10" })
public void test10() {
    System.out.println("10");
}

@Test(dependsOnMethods = "test10", groups = { "10" })
public void test20() {
    System.out.println("20, depends on 10");
}

@Test(dependsOnGroups = { "10" })
public void test30() {
    System.out.println("30, depends on 20");
}

@Test(dependsOnMethods = "test30")
public void test40() {
    System.out.println("40, depends on 10");
}

必须运行的第二件事(成功或跳过其余部分)

您将始终在依赖的方法之后运行,即使其中一些方法失败了。当您只想确保您的测试方法按特定顺序运行但是它们的成功并不真正取决于其他人的成功时,这非常有用。通过添加" alwaysRun = true"来获得软依赖性。在@Test注释中。

如果依赖的方法失败并且您对它有一个硬依赖(alwaysRun = false,这是默认值),依赖它的方法不会标记为FAIL而是标记为SKIP。跳过的方法将在最终报告中报告(在HTML中颜色既不是红色也不是绿色),这很重要,因为跳过的方法不一定是失败。

答案 1 :(得分:1)

有很多与dependsOnMethods注释相关的缺陷。我在6.5.2中遇到过类似的情况。尝试将您的依赖关系更新为6.8.3。

答案 2 :(得分:1)

要在测试失败后运行测试,请使用 alwaysRun 属性以及 dependsOnMethods ,而不是使用优先级属性, alwaysRun < / strong>属性让下一个依赖项在失败后执行,请尝试以下语法:

@Test
public void login(){...}

@Test(dependsOnMethods = "login")
public void verifyUserLogin() {...}

@Test(dependsOnMethods = "verifyUserLogin")
public void navigateToReportSettings() {...}

@Test(dependsOnMethods = "navigateToReportSettings", alwaysRun=true)
public void verifyGeneralSettings() {...}

@Test(dependsOnMethods = "navigateToReportSettings", alwaysRun=true)
public void verifyReportingPeriod() {...}
...
@Test(dependsOnMethods = "navigateToReportSettings")
public void saveReportSettings() {...}