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

Java TestNG使用提供的数据多次运行所有类方法@BeforeClass,java,selenium,webdriver,testng,selenium-webdriver,Java,Selenium,Webdriver,Testng,Selenium Webdriver,我正在使用TestNG和SeleniumWebDriver为一个webapp编写一个测试套件 我需要的是为不同的经过身份验证的用户多次运行测试类的所有方法(数据在运行时从数据库中取出)。因此,我需要将一个数据传递给具有数据提供者的类,该类提供所有用户的凭据,然后为每个用户创建一个web驱动程序(为了实验的纯度),并使用@BeforeClass方法中提供的凭据进行身份验证,运行类的所有@Test方法,并创建@AfterClass分解关闭web驱动程序 我该怎么做 我的尝试如下: 尝试1是在类上放

我正在使用TestNG和SeleniumWebDriver为一个webapp编写一个测试套件

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

我该怎么做

我的尝试如下:

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

类上的
@Test(dataProvider=)
有任何意义吗

尝试2是在方法的
@Test
注释上添加数据提供者。 它不起作用,因为这意味着测试方法在单个类运行期间被调用两次。 结果是第二次失败,因为它试图在web驱动程序未重新初始化时重复测试:浏览器已呈现另一个页面

此外,第一次和第二次尝试的缺点是,登录本身是在测试方法中完成的,而不是在
@BeforeClass
方法中完成的,因为我不知道如何向它提供来自数据提供者的数据

Attempt3是在单一方法上结合
@BeforeClass
@Test
的一次不顾一切的尝试。 它不起作用,因为如果带注释的方法具有参数列表,则
@BeforeClass
还需要
@参数。
结果是该方法被调用了三次:第一次作为类设置调用是由于上述原因失败,第二次是因为数据提供程序调用成功

然后我发现TestNG并没有提供一种使用不同数据多次调用所有类方法的方法:

我有两个其他的想法,我如何存档相同的效果

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

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

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

很抱歉给你留了这么长的信


提前感谢。

好的,让我根据我使用testNG和webdriver的经验来回答您的问题

类上的@Test(dataProvider=)有什么意义吗?
答:否。dataProvider是一个方法级注释,而不是类级注释。如前所述。它应该是一种以对象[]格式为测试方法提供数据的方法

如何实现您提到的场景?(假设我了解你的情况……)

答:您应该使用@BeforeMethod而不是@BeforeClass来实例化webdriver对象。通过这种方式,您可以为每个方法创建不同的WD对象。dataProvider可以将多个数据传递给isAuthenticated()方法。如果要在类级别传递配置文件,可以保留@BeforeClass,其中只包含属性文件加载逻辑。因此,将为整个类加载一次属性文件。显然,您还应该使用@AfterMethod关闭webdriver对象。

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

谢谢你的回答。我也在考虑这个解决方案(想法)№4) ,但认为这是无效的,因为在每个测试方法之前实例化web驱动程序并登录是多余的,因为在理想情况下,对类中的每个测试方法执行一次就足够了。我只需要对作为不同用户登录的web驱动程序的不同实例执行几次所有操作。无论如何,谢谢你。得到有用的信息,谢谢。我完全做到了我想要的。在构造函数上放置了一个
@Factory
注释,并使其从数据提供程序接收数据。test类的每个实例现在都表示一个web驱动程序,该驱动程序作为执行一系列测试的某个用户登录。构造函数加载属性并在类字段中存储指定的用户凭据
@BeforeClass
方法实例化web驱动程序并使用存储的凭据登录
@AfterClass
关闭web驱动程序。如果有人感兴趣,完整的代码在这里。