測試驅(qū)動(dòng)技術(shù)(TDD)系列之2:詳解TestNG參數(shù)化
上一篇文章介紹了測試驅(qū)動(dòng)的相關(guān)概念,并以junit4為例,帶大家了解如何在測試框架中實(shí)現(xiàn)測試驅(qū)動(dòng)。詳情:
測試驅(qū)動(dòng)技術(shù)系列之1:一文帶你上手測試數(shù)據(jù)驅(qū)動(dòng)
大家會(huì)發(fā)現(xiàn)Junit4在同一個(gè)測試類中實(shí)現(xiàn)多組數(shù)據(jù)的數(shù)據(jù)驅(qū)動(dòng),不是很方便,需要我們自己解決!我也說過在TestNG中這個(gè)問題很容易搞定!給自己挖了個(gè)坑!自己挖的坑總要填上,那么今天就給大家講解一下數(shù)據(jù)驅(qū)動(dòng)在TestNG中的應(yīng)用。本篇文章只重點(diǎn)講解TestNG參數(shù)化相關(guān)知識(shí),關(guān)于TestNG的環(huán)境配置以及基礎(chǔ)使用不在本文的討論范圍!TestNG中使用DataProvider實(shí)現(xiàn)參數(shù)化功能,在執(zhí)行用例的時(shí)候dataProvider迭代中的每組數(shù)據(jù)都是作為一個(gè)用例執(zhí)行。
一組參數(shù)化數(shù)據(jù)
定義參數(shù)化數(shù)據(jù),代碼如下:
- @DataProvider
- public Object[][] dp1() {
- return new Object[][] {
- new Object[] { 1, 1,0 },
- new Object[] { 2, 1,1 },
- new Object[] { 2, 1,2 },
- };
- }
用例中使用參數(shù)化數(shù)據(jù)(dp1定義的),代碼如下:
- @Test(dataProvider = "dp1")
- public void f1(Integer n1, Integer n2, Integer n3) {
- Integer result=n2+n3;
- assertEquals(n1,result);
- }
多組參數(shù)化數(shù)據(jù)
在一個(gè)測試類中,可以定義多組參數(shù)化數(shù)據(jù)(參數(shù)化數(shù)據(jù)個(gè)數(shù)不同,dp1三個(gè),dp2二個(gè)),代碼如下:
- @DataProvider
- public Object[][] dp2() {
- return new Object[][] {
- new Object[] { 1, 1},
- new Object[] { 2, 1},
- new Object[] { 2, 1},
- };
- }
用例中使用參數(shù)化數(shù)據(jù)(dp2定義的),代碼如下:
- @Test(dataProvider = "dp2")
- public void f2(Integer n1, Integer n2) {
- assertEquals(n1,n2);
- }
測試方法通過DataProvider引用
我們可以自定義一些方法,對外部文件進(jìn)行讀取,然后把讀取的數(shù)據(jù)作為參數(shù)在TestNG中引用,具體方法如下:
寫一個(gè)讀取各類文件的方法(txt、excel、db)具體代碼就不給出了,但是一定注意方法的返回值必須是Object[][](關(guān)于操控excel的知識(shí)會(huì)在后面的文章中介紹)
- public Object[][] readfile(String p_file){
- return new Object[][] {{ 1, 1},{ 1, 2}};
- }
在@DataProvider修飾的方法中調(diào)用該方法(也可以直接實(shí)現(xiàn))
- @DataProvider(name = "dp_func")
- public Object[][] testData(Method testMethod) {
- return readfile("");
- }
用例中使用參數(shù)化數(shù)據(jù)(dp_func),代碼如下:
- @Test(dataProvider = "dp_func")
- public void f3(Integer n1, Integer n2) {
- assertEquals(n1,n2);
- }
完整代碼
- import org.testng.annotations.DataProvider;
- import org.testng.annotations.Test;
- import static org.testng.Assert.assertEquals;
- import java.lang.reflect.Method;
- public class NewTest {
- @DataProvider
- public Object[][] dp1() {
- return new Object[][] {
- new Object[] { 1, 1,0 },
- new Object[] { 2, 1,1 },
- new Object[] { 2, 1,2 },
- };
- }
- @DataProvider
- public Object[][] dp2() {
- return new Object[][] {
- new Object[] { 1, 1},
- new Object[] { 2, 1},
- new Object[] { 2, 1},
- };
- }
- @DataProvider(name = "dp_func")
- public Object[][] testData(Method testMethod) {
- return readfile("");
- }
- //讀取各類文件,返回值是Object[][]
- public Object[][] readfile(String p_file){
- return new Object[][] {{ 1, 1},{ 1, 2}};
- }
- @Test(dataProvider = "dp1")
- public void f1(Integer n1, Integer n2, Integer n3) {
- Integer result=n2+n3;
- assertEquals(n1,result);
- }
- @Test(dataProvider = "dp2")
- public void f2(Integer n1, Integer n2) {
- assertEquals(n1,n2);
- }
- @Test(dataProvider = "dp_func")
- public void f3(Integer n1, Integer n2) {
- assertEquals(n1,n2);
- }
- }
運(yùn)行測試用例,可以看到用例成功地進(jìn)行了參數(shù)化,f1執(zhí)行了3次,f2執(zhí)行了3次,f3執(zhí)行了2次,如下圖所示:
