7

我正在使用 TestNG 和 Selenium WebDriver 为 webapp 编写测试套件。

我需要的是为不同的经过身份验证的用户多次运行测试类的所有方法(数据在运行时提取:从数据库中)。所以我需要将数据传递给具有数据提供程序的类,它提供所有用户的凭据,然后我需要为每个用户创建一个 Web 驱动程序(为了实验的纯度)并在@BeforeClass方法中使用提供的凭据进行身份验证,运行所有@Test类的方法,并@AfterClass拆除关闭网络驱动程序。

我怎样才能做到这一点?

我的尝试在这里: https ://gist.github.com/4246674

Attempt1 是@Test(dataProvider="getUsersIdAndName")在课堂上放置一个。它不起作用,因为事实证明@Test(dataProvider=),类并不意味着应该使用提供的数据调用类的所有方法。结果是根本没有调用该方法,因为没有数据可以传递给它的参数。我得到奇怪的测试报告,其中该方法被标记为通过,执行时间为 0 秒。(这是一个在 NetBeans 中打开的 Maven 项目,如果这有意义的话。)

@Test(dataProvider=)上课有什么意义吗?

Attempt2 是@Test在方法的注释上添加 dataProvider 。它不起作用,因为这意味着在单个类运行期间调用了两次测试方法。结果是第二次失败,因为它试图重复测试,而 Web 驱动程序没有重新初始化:浏览器已经呈现另一个页面。

第一次和第二次尝试也有缺点,即登录本身是在测试方法中完成的,而不是在@BeforeClass方法中,因为我不知道如何从数据提供者那里提供数据。

Attempt3 是对单一方法的组合@BeforeClass和绝望尝试。@Test它不起作用,因为@BeforeClass还要求@Parameters带注释的方法是否具有参数列表。结果是这个方法被调用了 3 次:第一次是因为上述原因而失败时作为类设置,而在成功时因为数据提供者被调用了两次。

然后我发现 TestNG 没有提供一种方法来使用不同的数据多次调用所有类方法:http: //comments.gmane.org/gmane.comp.java.testng.user/864

关于如何归档相同的效果,我还有另外两个想法。

Idea4是@Test(dataProvider=)在每个测试方法上放置一个,每个方法都会自己进行身份验证和isAuthenticated()测试,然后进行自己的测试。无效且丑陋。

看起来最实惠的 Idea5 是使用@Test一种方法进行标记,该方法将聚合所有其他测试方法:它从数据提供者接收数据,执行给定用户的身份验证,然后运行 ​​isAuthenticated 测试和所有其他必要的测试。在这种情况下@BeforeClass@AfterClass只是设置和拆除 web 驱动程序。这种方法的缺点是我失去了使用能力@BeforeMethod@AfterMethod但这对我来说是负担得起的:看起来我不需要它们。

有没有更好的方法来存档相同的效果?

对不起,长消息。

提前致谢。

4

2 回答 2

8

您可以根据自己的需要尝试探索工厂。Factory 将允许您运行具有不同数据的类的所有使用 @Test 注释的方法。在这种情况下,你可以在你的课前初始化你的 webdriver。在这里解释。

于 2012-12-10T09:19:09.973 回答
2

好的,让我根据我对 testNG 和 webdriver 的经验来回答你的问题。

问:类上的@Test(dataProvider=) 是否意味着任何东西?
A. 不,dataProvider 是方法级别的注释,而不是类级别。正如这里提到的。它应该是一个以 Object[][] 格式为 Test 方法提供数据的方法。

Q. 如何实现您提到的场景?(假设我了解您的情况..)
A. 您应该使用 @BeforeMethod 而不是 @BeforeClass 来实例化 webdriver 对象。这样,您可以为每种方法创建不同的 WD 对象。并且 dataProvider 可以将多个数据传递给 isAuthenticated() 方法。如果你想在类级别传递一个配置文件,你可以保留@BeforeClass,其中只包含属性文件加载逻辑。这样该属性文件将为整个类加载一次。显然,您还应该使用 @AfterMethod 来关闭 webdriver 对象。

于 2012-12-09T22:44:40.283 回答