場景:
在實際的測試工作中桐玻,我們經(jīng)常會遇到如此場景:同樣的測試操作步驟号杏,但有多組不同的測試輸入數(shù)據(jù)瓤摧,需要執(zhí)行多次測試操作。如果每條數(shù)據(jù)都去編寫一個測試用例纵苛,這樣難免增加代碼量和維護量剿涮。在自動化測試中,針對這種情況攻人,我們可以通過TestNG中的@DataProvider注解來輕松實現(xiàn)這種數(shù)據(jù)驅(qū)動操作取试,我們也可以把數(shù)據(jù)驅(qū)動理解為是測試數(shù)據(jù)和測試行為分離。
數(shù)據(jù)源和使用在同一個類中
在同一個類中通過@DataProvider注解的方法提供數(shù)據(jù)源怀吻。同時在需要用到數(shù)據(jù)源的@Test中添加“dataProvider ”參數(shù)表明測試數(shù)據(jù)的來源瞬浓。
代碼示例:
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
/**
* Created by 米陽 on 6/10/2017.
*/
public class DataProviderTest {
//在@DataProvider注解中為數(shù)據(jù)源命名 testData
@DataProvider(name = "testData")
public Object[][] data() {
return new Object[][]{
{"name", "pwd"},
{"test1", "test2"},
{"test3", "test4"}
};
}
//在@Test注解中指定dataProvider參數(shù)并設(shè)置獲取數(shù)據(jù)的來源 testData
@Test(dataProvider = "testData")
public void dataDriverTest(String name, String passwork) {
System.out.println("使用賬號:"+name+"_和密碼:"+passwork+" 登錄!");
}
}
執(zhí)行結(jié)果:
從執(zhí)行結(jié)果中我們可以看到雖然整個類我們就一個@Test但是卻運行了三次,每次的參數(shù)都不一樣均來自數(shù)據(jù)源的一組數(shù)據(jù)蓬坡。
數(shù)據(jù)源在單獨類中
我們除了可以把數(shù)據(jù)源和測試用例放一個類中猿棉,也可以把數(shù)據(jù)源單獨抽取到一個類中進行管理磅叛。
這樣我們@Test在使用數(shù)據(jù)源時除了要指定 dataProvider 參數(shù)外,還需要指定 dataProviderClass 參數(shù)萨赁,例如dataProviderClass=包名.類名.class
代碼示例:
數(shù)據(jù)類Data:
import org.testng.annotations.DataProvider;
/**
* Created by 米陽 on 6/10/2017.
*/
public class Data {
@DataProvider(name = "dataTest")
public static Object[][] dataDriver() {
return new Object[][]{
{1},
{2},
{3}
};
}
}
其它類中使用這個數(shù)據(jù)源:
//獲取 com.seleium.datadriver包下的Data類中的名為 dataTest的數(shù)據(jù)源
@Test(dataProvider = "dataTest", dataProviderClass = com.selenium.datadriver.Data.class)
public void dataDriverTest2(int a) {
System.out.println(a);
}
執(zhí)行結(jié)果:
說明:
- @DataProvider 的name參數(shù)為非必須弊琴,如果沒有name參數(shù),那么可以理解默認name值為就是對應(yīng)方法名杖爽。
@DataProvider
public Object[][] data() {
return new Object[][]{
{"name", "pwd"},
};
}
@Test(dataProvider = "data")
public void dataDriverTest(String name, String passwork) {
System.out.println("使用賬號:" + name + "_和密碼:" + passwork + " 登錄!");
}
- 數(shù)據(jù)源的數(shù)據(jù)為什么類型的數(shù)據(jù)敲董,則在使用該數(shù)據(jù)源時的@Test方法的參數(shù)就得為該類型的參數(shù)并且參數(shù)個數(shù)要等于數(shù)據(jù)源每組的數(shù)據(jù)個數(shù)。
@DataProvider
public Object[][] data1() {
return new Object[][]{
{"name", 1, true}
};
}
@Test(dataProvider = "data1")
public void dataDriverTest(String name, int i, Boolean b) {
System.out.println(name + i + b);
}
- 被@DataProvider 注釋的方法即數(shù)據(jù)源掂林,該方法必須返回一個Object[][] 對象臣缀。
@DataProvider(name = "data1")
public Object[][] data2() {
return new String[][]{
{"name", "gsfdg", "fadsf"},{"a","v","c"}
};
}
@Test(dataProvider = "data1")
public void dataDriverTest(String name, String i, String b) {
System.out.println(name + i + b);
}
如何讀取Excel作為數(shù)據(jù)源
詳細看個人博客:http://www.reibang.com/p/895e4c118db9
練習(xí)
修改163登錄郵箱的case為數(shù)據(jù)驅(qū)動模式坝橡。