總結:
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 }
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 }
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>
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
下面這個圖主要是和execute.bat 文件相對照的
3.執行結果:
4.如果db1方法不為靜態的錯誤: