Java Selenium 和 TestNG 同时使用“dependsOn”和“priority =”问题
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/18608666/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Selenium and TestNG Using Both 'dependsOn' and 'priority =' Issue
提问by M_Tech
I am working on implementing better workflow control in my GUI automation tests. And I first started with dependsOn but quickly found the drawback is that if one test fails, the whole rest of the suite is not run. So I switched to using 'priority=' but am seeing unexpected behavior. One example:
我正在努力在我的 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() {...}
What I want to happen:
我想要发生的事情:
- Login.
- Verify user is logged in.
- Navigate to report settings page.
- Verify the general settings and reporting period on the report settings page (in any order)
- Make some changes and save.
- Important: 10, 20, and 30 must succeed or skip the rest. If any 40 fails continue to 50 after all 40 have completed. But without dependency on any step 40s to succeed!
- 登录。
- 验证用户已登录。
- 导航到报告设置页面。
- 验证报告设置页面上的常规设置和报告周期(按任意顺序)
- 进行一些更改并保存。
- 重要提示:10、20 和 30 必须成功或跳过其余部分。如果任何 40 次失败,请在所有 40 次都完成后继续进行 50 次。但无需依赖任何步骤 40 即可成功!
What is happening:
怎么了:
- Login (priority 10).
- Save (priority 90).
- 登录(优先级 10)。
- 保存(优先级 90)。
Note: there are also 'groups' annotations but I don't think that is relevant here. Thanks in advance for any tips on how to combine priority and dependsOn successfully to control workflow, but with dependencies only used where needed.
注意:还有“组”注释,但我认为这与此处无关。在此先感谢您提供有关如何成功结合优先级和依赖项以控制工作流的任何提示,但依赖项仅在需要时使用。
Here is another sample code. I have no idea why it is running in this order: Output: 10, 20, 30, 40, etc... 110, //OK 130, 140, 150, 160, // Why were the 120 priorities skipped? 120, 120, 120, etc... 120 //Run last? Also interesting is that the group of 120s can be renumbered sequentially (121, 122, 123, etc) and still they are run last.
这是另一个示例代码。我不知道它为什么按这个顺序运行:输出:10, 20, 30, 40, etc... 110, //OK 130, 140, 150, 160, // 为什么跳过了 120 个优先级?120, 120, 120, etc... 120 //最后运行?同样有趣的是,120 组可以按顺序重新编号(121、122、123 等),但它们仍然最后运行。
Therefore the issue must be that 'dependsOn' and 'priority =' simply do not play well together. And I'm curious if anyone has gotten these two working in their environment. Who knows maybe its a but with Intellij IDEA? Anyway I need to get to the bottom of this soon to avoid costly refactoring later! Thanks again for any feedback- JR
因此,问题一定是 '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");
}
This is a much simpler example, but also showing how depends on simply breaks priorities:
这是一个简单得多的示例,但也显示了如何简单地打破优先级:
@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");
}
Should run: 10, 20, 30, 40. Runs: 10, 20, 40, 30.
应该运行:10、20、30、40。运行:10、20、40、30。
回答by Artem Yakovlev
There are a lot of defects related to dependsOnMethods annotation. I've faced similar situation in 6.5.2. Try to update your dependency to 6.8.3.
有很多与dependsOnMethods注解相关的缺陷。我在 6.5.2 中遇到过类似的情况。尝试将您的依赖项更新到 6.8.3。
回答by bangoria anjali
Don't provide priority and depends on together, you can group the tests. You can do it likeFor example,
不要提供优先级和依赖项,您可以将测试分组。你可以这样做例如,
@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");
}
Second thing for must run (succeed or skip the rest)
必须运行的第二件事(成功或跳过其余部分)
You will always be run after the methods you depend on, even if some of them have failed. This is useful when you just want to make sure that your test methods are run in a certain order but their success doesn't really depend on the success of others. A soft dependency is obtained by adding "alwaysRun=true" in your @Test annotation.
您将始终在依赖的方法之后运行,即使其中一些方法失败了。当您只想确保您的测试方法按特定顺序运行但它们的成功并不真正取决于其他人的成功时,这很有用。通过在@Test 注释中添加“alwaysRun=true”获得软依赖。
If a method depended upon fails and you have a hard dependency on it (alwaysRun=false, which is the default), the methods that depend on it are not marked as FAIL but as SKIP. Skipped methods will be reported as such in the final report (in a color that is neither red nor green in HTML), which is important since skipped methods are not necessarily failures.
如果依赖的方法失败并且您对它有硬依赖(alwaysRun=false,这是默认值),则依赖它的方法不会标记为 FAIL,而是标记为 SKIP。跳过的方法将在最终报告中报告(在 HTML 中以既非红色也非绿色的颜色),这很重要,因为跳过的方法不一定是失败的。
回答by Rishab
To make tests run even after it fails, use alwaysRunattribute along with dependsOnMethodsinstead of using priorityattribute, alwaysRunattribute let the next dependency to execute even after it fails,try the following syntax:
为了使测试即使在失败后也能运行,请使用alwaysRun属性和dependsOnMethods而不是使用优先级属性,alwaysRun属性让下一个依赖项即使在失败后也能执行,请尝试以下语法:
@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() {...}