2012-01-17 103 views
0

我会试着在这里解释我的场景,以便清楚我想要什么。TestNG - Dataprovider Class级别的测试注册

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

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

当使用厂注解,它使我的测试没有在Eclipse中开始播放,给人一种NullPointerException。我使用@BeforeClass注释,如果使用工厂注释,该注释从不运行。我在该类的构造函数上给出了该工厂注释。

我试图在的testng.xml文件中group-by-instance国旗,但仍失败:它运行在相同的顺序测试。

请有人可以解释以正确的顺序对我来说这件事?如果可能,举个例子,因为我确信这可以实现,但我想我错过了某个地方。

任何帮助,这是非常感谢。

P.S.我对Java并不擅长,过去2-3周我一直在使用TestNG。

感谢, 约翰

回答

0

随着anotation “数据集”: 的JavaDoc:

org.unitils.dbunit.annotation.DataSet 
@Target(value={METHOD, TYPE}) 
@Retention(value=RUNTIME) 
@Inherited 

注解表明一个数据集应在试运行前加载。

如果一个类被注释,测试数据集将每个类中的测试方法的执行之前加载。数据集文件名可以明确指定。如果没有指定这样的文件名,首先会尝试一个名为'classname'。'testmethod'.xml的数据集,如果没有这样的文件存在,'classname'.xml将被尝试。如果该文件也不存在,则会抛出异常。以'/'开头的文件名被绝对处理。不以'/'开头的文件名与当前类相关。

的测试方法也可以用在这种情况下,您可以指定需要运行这个测试方法之前要加载的数据集的数据集进行注解。同样,可以显式指定文件名,如果未指定,则会使用缺省值:first'classname'。'methodname'.xml,如果该文件不存在'classname'.xml。

例子:

@DataSet 
    public class MyTestClass extends UnitilsJUnit3 { 

     public void testMethod1(){ 
     } 

    @DataSet("aCustomFileName.xml") 
     public void testMethod2(){ 
     } 
    } 

将加载名为MyTestClass.xml或MyTestClass-testMethod1.xml为testMethod1在同一目录类数据集文件。对于testMethod2,加载与该类相同的目录中名为aCustomFileName.xml的数据集文件。

public class MyTestClass extends UnitilsJUnit3 { 

     public void testMethod1(){ 
     } 

    @DataSet 
     public void testMethod2(){ 
     } 
    } 

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

菲利普的Neven

添Ducheyne

+1

嗨Benoit,谢谢你的回复。 我使用CSV文件来存储测试数据,所以不要认为这对我有很大的帮助。我无法轻松切换到XML。 只是出于好奇,将使用数据集注释运行一个类中的所有方法与第一行的数据,然后拿起XML中的下一行数据数据,并再次运行它的所有方法? – 2012-01-17 12:07:46

0

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

@Test(dataProvider = ...) 
public void f(int n1, int n2) { 
    method1(n1, n2); 
    method2(n1, n2); 
} 

然而,通过实例分组应该有工作,你可以通过电子邮件将小类到testng用户列表,所以我可以重现它?

谢谢。

+0

嗨塞德里克,非常感谢您的回复,很高兴看到制造商亲自帮助我们,您的产品简直太棒了,希望我只知道更多关于Java的知识:)。 这个想法很好,但是这样会禁用我对这些方法的测试注释,但我仍然试一试。 如果这对我没有帮助,我会向testng用户组发送一个样本类。 再次感谢,我会保持您的发布。 – 2012-01-18 09:40:33

+0

刚刚尝试了您的建议,但它似乎在额外运行一次测试,如果我有两行数据,并且如果使用方法来读取这些值,然后在此方法中调用剩余的@test方法,那么它会执行它们两次,因为其他方法也有对它们的测试注释,它会再次调用最后一行数据。此外,这也不能帮助我进行报告,因为我想知道哪个测试失败了,以及哪一行数据。我会在某个时间将样例项目邮寄给Testng用户组。谢谢,约翰 – 2012-01-18 10:14:04

+1

如果你按照我的建议,确保你从method1和method2中删除了@Test标记,否则TestNG也会运行它们(这将解释你看到的双重运行)。 – 2012-01-18 18:06:02