TestNG @Factory与 @DataProvider 结合使用进行参数化测试

时间:2022-01-26 08:16:26

简介

TestNG是一个设计用来简化广泛的测试需求的测试框架,从单元测试到集成测试,这个是TestNG设计的出发点,不仅仅是单元测试,而且可以用于集成测试。设计目标的不同,对比junit的只适合用于单元测试,TestNG无疑走的更远。可以用于集成测试,这个特性是我选择TestNG的最重要的原因。

先了解这两个注解的意思

@DataProvider    标记一个方法用于为测试方法提供数据。被注释的方法必须返回Object[][], 其中每个Object[]可以指派为这个测试方法的参数列表。

从这个DataProvider接收数据@Test方法需要使用一个dataProvider名称等于这个注解的名字。

@Factory    标记方法作为一个返回对象的工厂,这些对象将被TestNG用于作为测试类。这个方法必须返回Object[]。

代码

文件结构

├── src/main/java/test/demo/TestFactory.java
├── src/main/java/test/demo/LoginPageTest.java
│── src/main/java/test/demo/HomePageTest.java
└── src/test/resources/smokeTest.xml
 package test.demo;

 import org.testng.annotations.DataProvider;
import org.testng.annotations.Factory; /**
* @Description: Demo
* @author wadexu
*
* @updateUser
* @updateDate
*/
public class TestFactory { @DataProvider(name = "datasource")
public Object[][] datasource() { // Creating and filling result array
Object[][] credentials = new Object[2][2]; credentials[0][0] = "User1";
credentials[0][1] = "WadeXu"; credentials[1][0] = "User2";
credentials[1][1] = "JamesBond"; return credentials;
} @Factory(dataProvider = "datasource")
public Object[] createTest(String userID, String userName) { Object[] tests = new Object[2]; tests[0] = new HomePageTest(userID, userName);
tests[1] = new LoginPageTest(userID, userName); return tests;
} }

TestFactory工厂类,在带有@Factory注解的方法中调用被执行的测试类,TestNg会自动调用被执行类中带有@Test注解的方法,被执行的测试类为:HomePageTest , LoginPageTest

使用@DataProvider作为数据注入的方式,向Factory中注入数据,并执行测试。

##转载注明出处:http://www.cnblogs.com/wade-xu/p/4761275.html

 package test.demo;

 import org.testng.annotations.Test;

 /**
* @Description: Demo Login Page
* @author wadexu
*
* @updateUser
* @updateDate
*/
public class LoginPageTest { private String userID;
private String userName; public LoginPageTest(String userID, String userName) {
this.userID = userID;
this.userName = userName;
} @Test
public void testLogin() {
// for demo purpose only
System.out.println(userID + " - " + userName + " is testing Login page");
} }
 package test.demo;

 import org.testng.annotations.Test;

 /**
* @Description: Demo Home Page
* @author wadexu
*
* @updateUser
* @updateDate
*/
public class HomePageTest { private String userID;
private String userName; public HomePageTest(String userID, String userName) {
this.userID = userID;
this.userName = userName;
} @Test
public void testHomePage() {
System.out.println(userID + " - " + userName + " is testing Home page");
} }

##转载注明出处:http://www.cnblogs.com/wade-xu/p/4761275.html

TestNG xml配置文件如下

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<!--<suite name="DMP_Test_Suite" -->
<suite name="Demo_Test_Suite" parallel="false">
<test name="Demo_Test">
<classes>
<class name="test.demo.TestFactory" />
</classes>
</test>
</suite>

右击xml文件Run as TestNG

Test Result:

TestNG @Factory与 @DataProvider 结合使用进行参数化测试

Console output:

User1 - WadeXu is testing Home page
User2 - JamesBond is testing Home page
User1 - WadeXu is testing Login page
User2 - JamesBond is testing Login page

注意测试方法将被一共执行的次数,@DataProvider属于循环测试的类型。

TestNG更多功能请参考官方站点

感谢阅读,如果您觉得本文的内容对您的学习有所帮助,您可以点击右下方的推荐按钮,您的鼓励是我创作的动力。

##转载注明出处:http://www.cnblogs.com/wade-xu/p/4761275.html