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

时间:2012-12-09 20:16:41

标签: java selenium webdriver testng selenium-webdriver

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

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

我该怎么做?

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

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

班级上的@Test(dataProvider=)是否意味着什么?

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

第一次和第二次尝试的缺点是登录本身是在测试方法中完成的,而不是在@Test方法中,因为我知道无法通过数据提供者提供数据。

Attempt3是一种绝望的尝试,将@BeforeClass@BeforeClass组合在一起。 它不起作用,因为如果带注释的方法具有参数列表,@Test也需要@BeforeClass。 结果是这个方法被调用了三次:由于上述原因,第一次作为类设置时,由于数据提供者成功,因此是两次。

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

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

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

看起来最实惠的Idea5就是用isAuthenticated()标记只会聚合所有其他测试方法的方法:它从数据提供者接收数据,由给定用户执行身份验证,然后运行isAuthenticated test and所有其他必要的测试。在这种情况下,@Test@BeforeClass仅设置和拆除网络驱动程序。这种方法的缺点是我失去了使用@AfterClass@BeforeMethod的能力,但这对我来说是可以承受的:看起来我不需要它们。

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

很抱歉留言。

提前致谢。

2 个答案:

答案 0 :(得分:8)

您可以尝试探索工厂以满足您的需求。 Factory允许您运行所有使用不同数据的类的@Test注释的方法。在这种情况下,您可以在ur beforeclass中初始化ur webdriver。解释here

答案 1 :(得分:2)

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

Q值。班上的@Test(dataProvider =)是否意味着什么? 答:否.dataProvider是方法级别注释而不是类级别。如上所述here。它应该是一种以Object [] []格式为Test方法提供数据的方法。

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