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 注释用法。
试图学习如何使用@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 注释用法。