TestNG的 - 不能得到@Factory工作(TestNG - can't get @F

2019-11-03 19:50发布

努力学习如何使用@Factory,但是当我在两种方式之一执行它,我得到有错误或者没有测试得到的所有执行。 我就可以调用的XML文件在Eclipse中,右键单击,然后选择“运行方式TestNG的套房”。

有了这个XML文件,该套件执行,但零个测试拿起/执行:

<suite name="suite1" verbose="5">
    <test name="test1">
        <classes>
            <class name="qa.tests.MyFactory"/>
        </classes>
    </test>
</suite>

有了这个XML文件,我得到异常的测试失败:

<suite name="suite1" verbose="5">
    <test name="test1">
        <packages>
            <package name="qa.tests" />
        </packages>
    </test>
</suite>

错误:

Can't invoke public void qa.tests.MyTest.testSample1(): either make it static or add a no-args constructor to your class

MyFactory.java类:

package qa.tests;
import org.testng.annotations.Factory;

public class MyFactory {
    @Factory
    public Object[][] dp() {
        Object[][] data = new Object[][] {
            { "1", "TestCase1", "Sample test 1" },
            { "2", "TestCase2", "Sample test 2" },
            { "3", "TestCase3", "Sample test 3" }
        };
        return data;
    }
}

MyTest.java类:

package qa.tests;
import org.testng.annotations.Test;
import static org.testng.Assert.*;

public class MyTest {
    private String num;
    private String name;
    private String desc;

     public MyTest(String num, String name, String desc) {
         this.num = num;
         this.name = name;
         this.desc = desc;
     }

     @Test()
     public void testSample1() {
         System.out.println(num + ", " + name + ", " + desc);
         assertTrue( true );
     }
}

在世界上我在做什么错误?

Answer 1:

首先,一个工厂应该返回一个一名维对象数组。 这工厂方法应该返回您要执行测试类的实例。

所以工厂将运行测试,如果你改变这个

public class MyFactory {
    @Factory
    public Object[] dp() {
        Object[] data = new Object[] {
            new MyTest("1", "TestCase1", "Sample test 1"), new Mytest("1", "TestCase1", "Sample test 1"), new MyTest("1", "TestCase1", "Sample test 1")
        };
        return data;
    }
}


Answer 2:

按照这样的错误: either make it static or add a no-args constructor to your class ,你MyTest的类需要有公共无参构造器,Java将不添加默认的构造函数,你已经参数化的构造,即public MyTest(String num, String name, String desc)

UPDATE改变你的工厂类

public class MyFactory {

@DataProvider(name = "MyData")
public static Object[][] dp(ITestContext context, Method m) throws Exception {

    return new Object[][] { new Object[] { "1", "TestCase1", "Sample test 1" }};
}

@Factory(dataProvider = "MyData")
public Object[] createInstances(String num, String name, String desc) {
    return new Object[] { new MyTest(num, name, desc) };
}
}


Answer 3:

//Factory class supplying data to test
public class DataFactory {  

    @Factory
    public Object[] DataSupplier(){

        Object[] testData = new Object[3];
        testData[0] = new FactoryTest(1);
        testData[1] = new FactoryTest(2);
        testData[2] = new FactoryTest(3);
        return testData;
    }

}

//Test class
public class FactoryTest {

    int i;

    public FactoryTest(int i) {
        this.i = i;
    }

    @Test
    public void f() {
        System.out.println(i);
    }

}

Testng.xml

<suite name="Suite">
  <test name="Test">
    <classes>
      <class name="factorydata.DataFactory"/>
    </classes>
  </test> <!-- Test -->
</suite> 

DataFactory类通过创建测试类的实例,并且将参数传递到FactoryTest类构造提供的测试数据。

FactoryTest类从的DataFactory消耗数据。

在testng.xml文件是指具有工厂类,在这种情况下的DataFactory。

这说明一个简单的工作TestNG的工厂注解的使用。



文章来源: TestNG - can't get @Factory to work
标签: java testng