TestNG-类级测试位置的数据提供程序

TestNG-类级测试位置的数据提供程序,testng,testng-dataprovider,Testng,Testng Dataprovider,我将尝试在这里解释我的情况,以便清楚我想要什么 我在一个类中有一组方法,这些方法执行一些测试,它们都相互关联,并且必须按顺序运行,因此它们在@Test注释中有DependsOnMethod。我还使用了一个DataProvider,它在每个测试中返回7个值(n行和7列)。现在,当我将此数据提供程序置于方法级别时,它读取所有行并使用每一组可用数据执行方法1,然后转到下一个方法 我想改变这个序列,我想让它运行方法1(数据集1),方法2(数据集1),方法1(数据集2)。。。我知道很多人都有这个问题。我之

我将尝试在这里解释我的情况,以便清楚我想要什么

我在一个类中有一组方法,这些方法执行一些测试,它们都相互关联,并且必须按顺序运行,因此它们在
@Test
注释中有
DependsOnMethod
。我还使用了一个
DataProvider
,它在每个测试中返回7个值(n行和7列)。现在,当我将此数据提供程序置于方法级别时,它读取所有行并使用每一组可用数据执行方法1,然后转到下一个方法

我想改变这个序列,我想让它运行方法1(数据集1),方法2(数据集1),方法1(数据集2)。。。我知道很多人都有这个问题。我之所以再次发布这个问题,是因为我尝试了所有建议的想法

当使用Factory注释时,它使我的测试根本不在Eclipse中启动,并给出一个
NullPointerException
。我使用了一个
@BeforeClass
注释,如果我使用工厂注释,它将永远不会运行。我在类的构造函数上给出这个工厂注释

我在testng.xml文件中尝试了
groupbyinstance
标志,但也失败了:它以相同的顺序运行测试

请有人给我解释一下整件事的正确顺序好吗?如果可能的话,举个例子,因为我相信这是可以实现的,但我想我遗漏了一些东西

在此方面的任何帮助都将不胜感激

另外,我对Java不是很在行,在过去的2-3周里我一直在使用TestNG

谢谢, John

和anotation“数据集”: JavaDoc:

org.unitils.dbunit.annotation.DataSet
@Target(value={METHOD, TYPE})
@Retention(value=RUNTIME)
@Inherited
指示应在测试运行之前加载数据集的注释

如果对类进行了注释,则在执行该类中的每个测试方法之前将加载测试数据集。可以显式指定数据集文件名。如果没有指定这样的文件名,首先将尝试名为“classname.”“testmethod”.xml的数据集,如果不存在这样的文件,将尝试名为“classname”.xml的数据集。如果该文件也不存在,将引发异常。以“/”开头的文件名被视为绝对文件名。不以“/”开头的文件名相对于当前类

测试方法也可以使用DataSet进行注释,在这种情况下,您可以指定在运行此测试方法之前需要加载的数据集。同样,可以显式指定文件名,如果未指定,将使用默认名称:第一个“classname”。“methodname”.xml,如果该文件不存在,则使用“classname”.xml

示例:

 @DataSet
  public class MyTestClass extends UnitilsJUnit3 {

      public void testMethod1(){
      }

     @DataSet("aCustomFileName.xml")
      public void testMethod2(){
      }
  }
将在与类相同的目录中加载testMethod1的名为MyTestClass.xml或MyTestClass-testMethod1.xml的数据集文件。对于testMethod2,加载类所在目录中名为aCustomFileName.xml的数据集文件

  public class MyTestClass extends UnitilsJUnit3 {

      public void testMethod1(){
      }

     @DataSet
      public void testMethod2(){
      }
  }
不会加载testMethod1的任何数据集(没有类级数据集)。将为testMethod2加载名为MyTestClass.xml或MyTestClass.testMethod2.xml的数据集文件。 作者:

菲利普内文


Tim Ducheyne

最简单的方法是手动调用这些方法:

@Test(dataProvider = ...)
public void f(int n1, int n2) {
    method1(n1, n2);
    method2(n1, n2);
}
然而,按实例分组应该已经起作用了,您可以通过电子邮件将一个小类发送到testng用户列表,以便我可以复制它吗


谢谢。

你好,贝诺特,谢谢你的回复。我使用CSV文件来存储测试数据,所以我不认为这对我有多大帮助。我不能那么容易地切换到XML。出于好奇,使用Dataset注释会先运行类中的所有方法和第一行数据,然后提取XML中的下一行数据并再次在所有方法上运行吗?Hi Cedric,非常感谢您的回复,很高兴看到制造商自己帮助我们,您的产品简直棒极了,但愿我能多了解一点Java:)。这个想法很好,但是这样会禁用针对这些方法的测试注释,但我还是尝试了一下。如果这对我没有帮助,我将向testng用户组发送一个示例类。再次感谢,我会随时通知你。我尝试了你的建议,但它似乎额外运行了一次测试,比如如果我有两行数据,如果我使用一个方法读取这些值,然后在此方法中调用剩余的@test方法,然后它将执行它们两次,因为其他方法也有针对它们的测试注释,所以它将使用最后一行数据再次被调用。此外,这对报告也没有帮助,因为我想知道哪个测试失败了,哪个数据行失败了。我将在某个时候向Testng用户组发送一个示例项目。谢谢,John如果你按照我的建议,请确保从method1和method2中删除@Test标记,否则TestNG也会运行它们(这将解释你看到的双重运行)。是的,我理解你的意思,我现在实际上已经将这些方法合并到一个大方法中,这样问题就不会发生了。我想我将以编程方式处理这个流,但我必须考虑一下,但我希望看到它与TestNG一起工作,运气不好:(.顺便说一句,我已经向tetng用户google group发送了一个示例类,如果你有时间,请看一看并回复。谢谢。