@Dataprovider 和 @Factory 的使用


總結:

0.@Dataprovider 所修飾的方法必須  return Object[][] ; @Facotry 所修飾的方法必須return Object[] ;

1.在測試場景中經常會遇到一個人執行多個case,那么多個人沒人都執行一遍這個case的時候就要用到@Factory創建多個對象了,類似於QTP中的迭代;

2.如果測試相關聯的類中只有一個帶參的構造方法,那么在執行測試的時候可能會拋一個無法初始化某個類的錯誤,這個時候就要使用@Factory來進行初始化了;

說明:一個人執行多次case和多個人每人都執行多次case是不一樣的測試場景,類似於模擬多用戶的場景,比如A用戶有執行lognin()的權限,而B用戶沒有這個權限,雖然A和B都是一個用戶對象,但他們執行的結果卻不一樣 ; 

以上僅代表個人理解哈,如有不同,+316567803 或者留言進行討論 ;

1.@Datatprovider 可以放在一個類中為@Test 和 @Factory 提供參數初始化 比如:

 1 package main.test;
 2 
 3 import org.testng.annotations.DataProvider;
 4 import org.testng.annotations.Factory;
 5 import org.testng.annotations.Test;
 6 public class BB {
 7     private int id ;
 8 private String name ;
 9     private  int age ;
10      BB(){}
11     public BB(int id, String name, int age) {
12         this.id = id;
13         this.name = name;
14         this.age = age;
15     }
16     public String toString() {
17         return "BB{" +
18                 "id=" + id +
19                 ", name='" + name + '\'' +
20                 ", age=" + age +
21                 '}';
22     }
23 
24 
25     /*
26    *1.為了演示這里提供了2個@DataProvider(dataPraovide1 和 dataPraovide2) ;
27    *   >dataPraovide1 作為Test數據的數據源 ;
28    *   >dataPraovide2 作為@Factory的數據化數據源;
29    *2.@Factory為BB類提供初始化 ;
30    *3.@Test 為BB類的print();
31    */
32 
33     @DataProvider(name = "db1")
34     public  Object[][] dataPraovide_1() {
35         return new Object[][]{
36                 {1, "jack1", 21}, {4, "jack4", 24}, {7, "jack7", 27},
37                 {2, "jack2", 22}, {5, "jack5", 25}, {8, "jack8", 28},
38                 {3, "jack3", 23}, {6, "jack6", 26}, {9, "jack9", 29}
39         };
40     }
41     @DataProvider(name = "db")
42     public Object[][] dataPraovide_0() {
43         return new Object[][]{
44                 {1, "jack1", 21}, {4, "jack4", 24}, {7, "jack7", 27},
45                 {2, "jack2", 22}, {5, "jack5", 25}, {8, "jack8", 28},
46                 {3, "jack3", 23}, {6, "jack6", 26}, {9, "jack9", 29}
47         };
48     }
49     //使用db數據源沒次創建1個BB的對象,然后使用這個對象執行db1的測試案例(9×9=81次) ;
50     @Factory(dataProvider = "db")
51     public Object[] createObj_1(int id, String name, int age) {
52         BB[] bbArray ={new BB(id, name, age)};
53         return bbArray;
54     }

66     @Test( dataProvider = "db1")
67     public void print(int id ,String name,int age) {
68         System.out.println(this.toString());
69         System.out.println("-------"+id+"-----------"+name+"------------"+age);
70     }
 }

執行結果:


2.將@Factory 和 @DataPrivade 放在2個類中進行處理 ;

 GG.class 為BB.class提示數據支持;

 1 package main.test;
 2 
 3 import org.testng.annotations.DataProvider;
 4 import org.testng.annotations.Factory;
 5 
 6 public class GG {
 7     /*
 8     *1.為了演示這里提供了2個@DataProvider(dataPraovide1 和 dataPraovide2) ;
 9     *   >dataPraovide1 作為Test數據的數據源 ;
10     *   >dataPraovide2 作為@Factory的數據化數據源;
11     *2.@Factory為BB類提供初始化 ;
12     *3.@Test 為BB類的print();
13     */
14     @DataProvider(name = "db1")
15     public static Object[][] dataPraovide1() {
16         return new Object[][]{
17                 {1, "jack1", 21}, {4, "jack4", 24}, {7, "jack7", 27},
18                 {2, "jack2", 22}, {5, "jack5", 25}, {8, "jack8", 28},
19                 {3, "jack3", 23}, {6, "jack6", 26}, {9, "jack9", 29}
20         };
21     }
22     @DataProvider(name = "db")
23     public Object[][] dataPraovide() {
24         return new Object[][]{
25                 {1, "jack1", 21}, {4, "jack4", 24}, {7, "jack7", 27},
26                 {2, "jack2", 22}, {5, "jack5", 25}, {8, "jack8", 28},
27                 {3, "jack3", 23}, {6, "jack6", 26}, {9, "jack9", 29}
28         };
29     }
30     //使用db數據源沒次創建1個BB的對象,然后使用這個對象執行db1的測試案例(9×9=81次) ;
31 /*    @Factory(dataProvider = "db")
32     public Object[] createObj_1(int id, String name, int age) {
33         BB[] bbArray ={new BB(id, name, age)};
34         return bbArray;
35     }*/
36     //使用db數據源沒次創建10個BB的對象,然后使用這個對象執行db1的測試案例(10x9×9=810次) ;
37     @Factory(dataProvider = "db")
38     public Object[] createObj(int id, String name, int age) {
39         BB[] bbArray = new BB[10];
40         for (int i = 0; i < bbArray.length; i++) {
41             bbArray[i] = new BB(id, name, age);
42         }
43 
44         return bbArray;
45     }
46 }
View Code

BB.class

 1 package main.test;
 2 
 3 import org.testng.annotations.Test;
 4 public class BB {
 5     private int id ;
 6 private String name ;
 7     private  int age ;
 8      BB(){}
 9     public BB(int id, String name, int age) {
10         this.id = id;
11         this.name = name;
12         this.age = age;
13     }
14     public String toString() {
15         return "BB{" +
16                 "id=" + id +
17                 ", name='" + name + '\'' +
18                 ", age=" + age +
19                 '}';
20     }
21 
22 //如果不放在一個類中這里要制定dataProviderClass 類;並且dataProvider = "db1" 的方法要為靜態的,如果不為靜態的會跑錯;
23     @Test( dataProvider = "db1", dataProviderClass = main.test.GG.class )
24     public void print1(int id ,String name,int age) {
25         System.out.println(this.toString());
26         System.out.println("-------"+id+"-----------"+name+"------------"+age);
27     }
28 }
View Code

tesng.xlm

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="All Test Suite">
    <test verbose="2" preserve-order="true"
          name="TESTPROVIDER">
        <classes>
        <!--  這里必須加載GG類不然執行拋錯 -->
         <class name="main.test.GG"/> 
            <class name="main.test.BB">
                <methods>
                    <include name="print1"/>             
                </methods>
            </class>
        </classes>
    </test>
</suite>
View Code

execute.bat 文件

@echo off 
set xmlPath=C:\CustomSofter\develop\IDEA\IDEAWorkSpace\C3p0TestPrictice
set lib=C:\CustomSofter\develop\IDEA\IDEAWorkSpace\C3p0TestPrictice\out\artifacts\C3p0TestPrictice_jar
set classpath=%lib%\C3p0TestPrictice.jar;%lib%\jcommander-1.30.jar;%lib%\testng-6.8.8.jar;
java org.testng.TestNG %xmlPath%\testng.xml
pause 
View Code

下面這個圖主要是和execute.bat 文件相對照的

 

 

3.執行結果:

4.如果db1方法不為靜態的錯誤:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM