TestNG - 无法让@Factory 工作

TestNG - can't get @Factory to work

试图学习如何使用@Factory,但是当我以两种方式之一执行它时,我得到一个错误或根本没有执行任何测试。我在 Eclipse 中调用 XML 文件,右键单击它并选择 "Run As TestNG Suite".

使用这个 XML 文件,套件会执行,但会选择零个测试 up/executed:

<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 class:

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 class:

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 );
     }
}

我究竟做错了什么?

根据这个错误:either make it static or add a no-args constructor to your class, 您的 MyTest class 需要 public 无参数构造函数,Java 不会添加默认构造函数,因为您已经有参数化构造函数,即 public MyTest(String num, String name, String desc)

更新 改变你的工厂 class

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) };
}
}

首先,工厂应该return一个一维对象数组。 并且该工厂方法应该 return 个您尝试执行的测试实例 class。

所以工厂会运行你的测试,如果你改成这个

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;
    }
}
//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 class 通过创建测试实例 class 并将参数传递给 FactoryTest class 构造函数来提供测试数据。

FactoryTest class 使用数据工厂中的数据。

在 testng.xml 中引用具有工厂的 class,在本例中它是 DataFactory。

这解释了一个简单的工作 TestNg Factory 注释用法。