2

我正在尝试第一次将 TestNG 与 @Factory 一起使用,但对我来说不起作用,我会告诉你为什么。

我有一个名为 Extend 的类,其中我有一些测试,“启动站点”,“登录”,“检查用户是否在他自己的仪表板中”等等,我希望对于从工厂传递的所有数据,这些命令测试总是相同的“启动站点”>>“登录”>>“检查用户在他的仪表板中”>>“注销”好吗?所以我有以下extend.xml 文件和类:

            <suite name="ExtendFactory"  group-by-instances="true">
              <test name="Factory"  preserve-order="true" group-by-instances="true"> 
                <classes>
                  <class name="net.whaooo.ExtendFactory">
                    <methods>
                      <include name="launchSite"></include>
                      <include name="loginTest" />
                      <include name="userIsInHisOwnDashboardTest" />
                      <include name="logoutTest" />
                    </methods>
                  </class>
                </classes>
              </test>
            </suite>

扩展类:

        public class Extend extends BaseTest{
            protected static FirefoxDriver driver;
            private String a_driver;
            private String password;

            public Extend(String a_driver, String pwd){
                this.a_driver = a_driver;
                this.password = pwd;
            }
            @BeforeTest
            public void stDriver() {
                DesiredCapabilities caps = DesiredCapabilities.firefox(); caps.setCapability(CapabilityType.ForSeleniumServer.ENSURING_CLEAN_SESSION, true); 
                driver = new FirefoxDriver(caps);
                driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
            }
            @AfterTest
            public void stopDriver() {
                driver.close();
            }   
            @Test
            public void launch() {
                launchSite(driver);
            }
            @Test (description = "Enter a valid login as driver")
            public void loginTest() {
                login(driver, a_driver, password);
            }
            @Test (description = "Check the driver is in his own dashboard")
            public void userIsInHisOwnDashboardTest(){
                userIsInHisOwnDashboardTest(driver, a_driver, password);
            }
            @Test(description="logout")
            public void logout(){
                logoutTest(driver);
            }
        }

简化工厂:

    public class ExtendFactory {
      @Factory
      public Object[] createInstances() {
           Object[] result = new Object[2]; 
              result[0] = new Extend("test1@test.com","tester");
              result[1] = new Extend("test2@test.com","tester");
            return result;
          }
    }

但我的问题是,即使我插入子句 preserve-order="true" group-by-instances="true",启动测试的顺序也不遵循 xml 文件中指定的顺序,我也试过了使用 order-by-instances="true"。谁能帮我?

4

5 回答 5

0

我认为您需要在测试用例中使用dependsOnMethods,因为您提到的流程,如果第一个方法没有执行,则执行第二个测试用例没有意义。即如果“启动站点”失败,则无需执行“登录”。这也将确保执行顺序。查看依赖方法

于 2012-06-21T13:06:19.193 回答
0

我一直在使用

@Test(dependsOnMethods = "TestName")

其中“TestName”是运行的先决条件测试。因此,对于您的登录测试,它应该具有以下注释:

@Test(dependsOnMethods = "launchSite")

我连续运行 9 次测试,并且自从添加了dependsOnMethods 后,所有测试都按顺序运行,没有任何问题

于 2012-06-21T20:52:47.643 回答
0

感谢您的回答,我最终使用@Factory 指定“order-by-instances="true"”,而不是在动态对象中插入依赖项!

于 2012-06-25T11:00:16.557 回答
0

我看到了很多问题......首先@Factory 与 group-by-instance="true" 搞砸了整个测试(它只执行一个实例并且只执行非依赖方法)。

@Factory无需按实例分组即可工作,但它首先执行所有非依赖方法,而与实例数量无关。例如..Class A {@Test public void a() {} @Test(dependsOnMethod="a") public void b() {}}...随之@Factory返回两个实例..然后执行是ref1.a, ref2.a, ref1.b, ref2.b.这有严重的问题..说A类使用大量内存然后确保它会在执行所有之前用完。

ps:不知道是不是eclipse的问题。我正在使用 testng 6.8.1 ps2:似乎 testng 打算进行回归..但它仍然不存在..@Factory它自己的类也不支持它的回归 (工厂不能设置相同)或由第三方设置。

于 2013-09-10T14:34:05.230 回答
0

在 TestClass 文件中使用依赖不是一个解决方案,因为不依赖于任何其他函数的函数仍然是随机执行的。我需要按照我提到的顺序执行测试用例。这可以在使用 TestNG 执行时使用“preserve-order”来实现,但在 TestNG 中使用分组时会失败。

如果有人可以帮助解决这个问题,请回复。

于 2014-03-18T07:02:28.637 回答