当前位置: 首页 > 知识库问答 >
问题:

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

郎灿
2023-03-14

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

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

我该怎么做?

我的尝试如下:https://gist.github.com/4246674

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

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

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

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

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

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

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

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

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

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

抱歉给你留了这么长的信息。

提前感谢。

共有2个答案

樊奇思
2023-03-14

好的,让我根据我在testNG和webdriver方面的经验来回答你们的问题。

问:类上的@Test(dataProvider=)有什么意义吗<答:不。dataProvider是方法级别的注释,而不是类级别的注释。正如这里提到的。它应该是一种以对象[]格式为测试方法提供数据的方法。

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

汝才良
2023-03-14

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

 类似资料:
  • 目前,我有一个测试类,它有多个方法,所有方法都使用相同的数据提供程序。每次testng循环使用不同的方法时,它都会重新计算数据提供程序方法。有没有办法让数据提供程序运行一次? 谢谢 杰森

  • suite name=“knowledgetest”verbose=“5”configfailurepolicy=“continue”data-provider-thread-count=“10”parallel=“methods”thread-count=“5”

  • 我正在尝试通过TestNG进行多线程测试为测试实例化WebDrivers<代码>@AfterMethod在测试后关闭WebDrivers

  • 我想在类中与数据提供者并行运行测试方法。我需要一个数据提供者,它每次在新测试方法开始为给定的测试运行生成部分动态数据之前都会被调用。让我用伪代码解释一下: 我怎样才能做到这一点?

  • 我使用了test dat provider和factory来处理示例数据,更像是从具有多个值的excel行中读取数据。因此,每个映射表示每行的列名和值,并将其添加到列表中,以获得从excel读取的所有值。现在我返回

  • Edit1:我有一个Excelutility.java类,可以从中获取单元格数据,并将其传递给我的测试类中的tests方法。 为了从excel文件中读取,我按照以下方式组织了测试方法: 我想做的是: > 从sheet1读取第一行数据,将其传递到test1,继续到test2 从工作表1读取第二行数据,将其传递到test1,继续到test2 并依此类推,具体取决于excel工作表中的行数。 结果是: