场景:

在实际的测试工作中,我们经常会遇到如此场景:同样的测试操作步骤,但有多组不同的测试输入数据,需要执行多次测试操作。如果每条数据都去编写一个测试用例,这样难免增加代码量和维护量。在自动化测试中,针对这种情况,我们可以通过TestNG中的@DataProvider注解来轻松实现这种数据驱动操作,我们也可以把数据驱动理解为是测试数据和测试行为分离。

数据源和使用在同一个类中

在同一个类中通过@DataProvider注解的方法提供数据源。同时在需要用到数据源的@Test中添加“dataProvider ”参数表明测试数据的来源。

代码示例:

  1. import org.testng.annotations.DataProvider;
  2. import org.testng.annotations.Test;
  3. /**
  4. * Created by 米阳 on 6/10/2017.
  5. */
  6. public class DataProviderTest {
  7. //在@DataProvider注解中为数据源命名 testData
  8. @DataProvider(name = "testData")
  9. public Object[][] data() {
  10. return new Object[][]{
  11. {"name", "pwd"},
  12. {"test1", "test2"},
  13. {"test3", "test4"}
  14. };
  15. }
  16. //在@Test注解中指定dataProvider参数并设置获取数据的来源 testData
  17. @Test(dataProvider = "testData")
  18. public void dataDriverTest(String name, String passwork) {
  19. System.out.println("使用账号:"+name+"_和密码:"+passwork+" 登录!");
  20. }
  21. }

执行结果:

13-1-Web-自动化测试----数据驱动 - 图1
从执行结果中我们可以看到虽然整个类我们就一个@Test但是却运行了三次,每次的参数都不一样均来自数据源的一组数据。

数据源在单独类中

我们除了可以把数据源和测试用例放一个类中,也可以把数据源单独抽取到一个类中进行管理。
这样我们@Test在使用数据源时除了要指定 dataProvider 参数外,还需要指定 dataProviderClass 参数,例如dataProviderClass=包名.类名.class

代码示例:

数据类Data:

  1. import org.testng.annotations.DataProvider;
  2. /**
  3. * Created by 米阳 on 6/10/2017.
  4. */
  5. public class Data {
  6. @DataProvider(name = "dataTest")
  7. public static Object[][] dataDriver() {
  8. return new Object[][]{
  9. {1},
  10. {2},
  11. {3}
  12. };
  13. }
  14. }

其它类中使用这个数据源:

  1. //获取 com.seleium.datadriver包下的Data类中的名为 dataTest的数据源
  2. @Test(dataProvider = "dataTest", dataProviderClass = com.selenium.datadriver.Data.class)
  3. public void dataDriverTest2(int a) {
  4. System.out.println(a);
  5. }

执行结果:

13-1-Web-自动化测试----数据驱动 - 图2

说明:

  1. DataProvider 的name参数为非必须,如果没有name参数,那么可以理解默认name值为就是对应方法名。
  1. @DataProvider
  2. public Object[][] data() {
  3. return new Object[][]{
  4. {"name", "pwd"},
  5. };
  6. }
  7. @Test(dataProvider = "data")
  8. public void dataDriverTest(String name, String passwork) {
  9. System.out.println("使用账号:" + name + "_和密码:" + passwork + " 登录!");
  10. }

  1. 数据源的数据为什么类型的数据,则在使用该数据源时的@Test方法的参数就得为该类型的参数并且参数个数要等于数据源每组的数据个数。
  1. @DataProvider
  2. public Object[][] data1() {
  3. return new Object[][]{
  4. {"name", 1, true}
  5. };
  6. }
  7. @Test(dataProvider = "data1")
  8. public void dataDriverTest(String name, int i, Boolean b) {
  9. System.out.println(name + i + b);
  10. }

  1. DataProvider 注释的方法即数据源,该方法必须返回一个Object[][] 对象。
  1. @DataProvider(name = "data1")
  2. public Object[][] data2() {
  3. return new String[][]{
  4. {"name", "gsfdg", "fadsf"},{"a","v","c"}
  5. };
  6. }
  7. @Test(dataProvider = "data1")
  8. public void dataDriverTest(String name, String i, String b) {
  9. System.out.println(name + i + b);
  10. }

如何读取Excel作为数据源

详细看个人博客:http://www.jianshu.com/p/895e4c118db9

练习

修改163登录邮箱的case为数据驱动模式。