TestNG 使用提供的数据初步执行 @BeforeClass 多次运行所有类方法

Posted

技术标签:

【中文标题】TestNG 使用提供的数据初步执行 @BeforeClass 多次运行所有类方法【英文标题】:TestNG Run all class methods multiple times preliminary doing @BeforeClass with supplied data 【发布时间】:2012-11-27 07:13:35 【问题描述】:

我正在使用 TestNG 和 Selenium WebDriver 为 web 应用程序编写测试套件。

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

我该怎么做?

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

尝试1 是在课堂上放置@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() 测试,然后执行自己的测试。 无效且丑陋。

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

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

抱歉,留言太长了。

提前致谢。

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

感谢您的回答。我也在考虑这个解决方案(想法№4),但认为它是无效的,因为在每个测试方法之前实例化 Web 驱动程序和登录是多余的,因为理想情况下,对所有测试方法执行一次就足够了班上。我只需要使用以不同用户身份登录的不同 Web 驱动程序实例多次执行所有操作。不管怎么说,还是要谢谢你。得到了有用的信息。【参考方案2】:

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

【讨论】:

谢谢。设法做我想要的。在构造函数上放置一个@Factory 注释并使其从数据提供者接收数据。测试类的每个实例现在都代表一个以某个用户身份登录的 Web 驱动程序,该用户正在执行一系列测试。构造函数加载属性并将指定的用户凭据存储在类字段中。 @BeforeClass 方法实例化 Web 驱动程序并使用存储的凭据登录。 @AfterClass 关闭网络驱动程序。如果有人感兴趣,完整的代码在这里。

以上是关于TestNG 使用提供的数据初步执行 @BeforeClass 多次运行所有类方法的主要内容,如果未能解决你的问题,请参考以下文章

testng运行报错 请问是为啥

testng运行报错 请问是为啥

testng和junit有啥优缺点,该如何选择

Eclipse集成testng插件(离线安装方式)

testng中DataProvider为啥两组数据只执行了一组

Selenium 中的数据提供者与 TestNG 不匹配