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 多次运行所有类方法的主要内容,如果未能解决你的问题,请参考以下文章