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

简介

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

 

 1 package test.demo;
 2 
 3 import org.testng.annotations.DataProvider;
 4 import org.testng.annotations.Factory;
 5 
 6 /**
 7  * @Description: Demo
 8  * @author wadexu
 9  * 
10  * @updateUser
11  * @updateDate
12  */
13 public class TestFactory {
14 
15     @DataProvider(name = "datasource")
16     public Object[][] datasource() {
17 
18         // Creating and filling result array
19         Object[][] credentials = new Object[2][2];
20 
21         credentials[0][0] = "User1";
22         credentials[0][1] = "WadeXu";
23 
24         credentials[1][0] = "User2";
25         credentials[1][1] = "JamesBond";
26 
27         return credentials;
28     }
29 
30     @Factory(dataProvider = "datasource")
31     public Object[] createTest(String userID, String userName) {
32 
33         Object[] tests = new Object[2];
34 
35         tests[0] = new HomePageTest(userID, userName);
36         tests[1] = new LoginPageTest(userID, userName);
37 
38         return tests;
39     }
40 
41 
42 }

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

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

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

 

 1 package test.demo;
 2 
 3 import org.testng.annotations.Test;
 4 
 5 /**
 6  * @Description: Demo Login Page
 7  * @author wadexu
 8  * 
 9  * @updateUser
10  * @updateDate
11  */
12 public class LoginPageTest {
13 
14     private String userID;
15     private String userName;
16 
17     public LoginPageTest(String userID, String userName) {
18         this.userID = userID;
19         this.userName = userName;
20     }
21 
22     @Test
23     public void testLogin() {
24         // for demo purpose only
25         System.out.println(userID + " - " + userName + " is testing Login page");
26     }
27 
28 }

 

 1 package test.demo;
 2 
 3 import org.testng.annotations.Test;
 4 
 5 /**
 6  * @Description: Demo Home Page
 7  * @author wadexu
 8  * 
 9  * @updateUser
10  * @updateDate
11  */
12 public class HomePageTest {
13 
14     private String userID;
15     private String userName;
16 
17     public HomePageTest(String userID, String userName) {
18         this.userID = userID;
19         this.userName = userName;
20     }
21 
22     
23     @Test
24     public void testHomePage() {
25         System.out.println(userID + " - " + userName + " is testing Home page");
26     }
27 
28 }

##转载注明出处: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:

 

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 

 

posted @ 2015-08-27 10:06  WadeXu  阅读(3081)  评论(1编辑  收藏  举报