TestNG数据驱动
testng的功能很强大,利用@DataProvider可以做数据驱动,数据源文件可以是EXCEL,XML,YAML,甚至可以是TXT文本。
@DataProvider注解简介:
@DataProvider标记专门为测试方法提供参数的方法。这类方法必须返回Object[ ][ ]类型的二维数组或者Iteratora87fdacec66f0909fc0757c19f2d2b1d[],每一行的Object[],都是测试方法的一个测试数据集,测试方法会为每个测试数据集执行一次。如果没有指定参数的名称,则默认为方法的名称,方法的名称没有限制。
@DataProvider的小例子:
import java.lang.reflect.Method; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; public class test { @DataProvider(name = "user") public Object[][] createUser(Method m) { System.out.println(m.getName()); return new Object[][] { { "root", "root" }, { "test", "root" }, { "test", "test" } }; } @Test(dataProvider = "user") public void verifyUser(String username, String password) { System.out.println("Verify User : " + username + ":" + password); assert username.equals(password); } }
如上所示@DataProvider注解了createUser方法,返回的二位数组里有三行数据,每行两列。
所以@Test(dataProvider = "user")注解的verifyUser方法有两个参数,用来接收每一行的两个数据,如果createUser返回的数据数组的列数和verifyUser的参数个数不同就会报错的。
因为返回的有三行,所以verifyUser会被执行三次。结果如下:
PASSED: verifyUser("root", "root") FAILED: verifyUser("test", "root") PASSED: verifyUser("test", "test")
CSV文件数据读取和@DataProvider
我自己做了一个以csv为例的测试架子,部分代码可通用。
CSV文件读取类(可通用,目录自己可以修改,也可改变成读取EXCEL、TXT等文件):
import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.TreeMap; import java.util.regex.Matcher; public class CSVData implements Iterator<Object[]> { private BufferedReader br = null; //行数 private int rowNum = 0; //获取次数 private int curRowNo = 0; //列数 private int columnNum = 0; //key名 private String[] columnName; //csv中所有行数据 private List<String> csvList; //实际想要的行数据 private List<String> csvListNeed; /* * 在TestNG中由@DataProvider(dataProvider = "name")修饰的方法 * 取csv时,调用此类构造方法(此方法会得到列名并将当前行移到下以后)执行后,转发哦 * TestNG自己的方法中去,然后由它们调用此类实现的hasNext()、next()方法 * 得到一行数据,然后返回给由@Test(dataProvider = "name")修饰的方法,如此 * 反复到数据读完为止 * * * @param filepath CSV文件名 * @param casename 用例名 */ public CSVData(String fileName, String caseId) { try { File directory = new File("."); String ss = "resources."; File csv = new File(directory.getCanonicalFile() + "\\src\\test\\" + ss.replaceAll("\\.", Matcher.quoteReplacement("\\")) + fileName + ".csv"); br = new BufferedReader(new FileReader(csv)); csvList = new ArrayList<String>(); while (br.ready()) { csvList.add(br.readLine()); this.rowNum++; } String stringValue[] = csvList.get(0).split(","); this.columnNum = stringValue.length; columnName = new String[stringValue.length]; for (int i = 0; i < stringValue.length; i++) { columnName[i] = stringValue[i].toString(); } this.curRowNo++; csvListNeed = new ArrayList<String>(); for (int i = 1; i < rowNum; i++) { String values[] = csvList.get(i).split(","); if (caseId.equals(values[0])) { csvListNeed.add(csvList.get(i)); } } this.rowNum = 2;//就取一行 } catch (Exception e) { e.printStackTrace(); } } @Override public boolean hasNext() { if (this.rowNum == 0 || this.curRowNo >= this.rowNum) { try { br.close(); } catch (Exception e) { e.printStackTrace(); } return false; } else { return true; } } @Override public Object[] next() { /* * 将数据放入map */ Map<String, String> s = new TreeMap<String, String>(); String csvCell[] = csvListNeed.get(0).split(","); for (int i = 0; i < this.columnNum; i++) { String temp = ""; try { temp = csvCell[i].toString(); } catch (ArrayIndexOutOfBoundsException ex) { temp = ""; } s.put(this.columnName[i], temp); } Object r[] = new Object[1]; r[0] = s; this.curRowNo++; return r; } @Override public void remove() { throw new UnsupportedOperationException("remove unsupported"); } }
这个类实现了Iteratorf78f5ba480eb63d6031a27839cd20e37迭代器,TestNG调用此类实现的hasNext()、next()方法得到一行数据,在next()方法中可以看到,我把数据是放在Map05ad6303f369fc4ccec4412db2772d19中的,再把map放在Object[]里,所以测试方法的参数就必须是一个Map05ad6303f369fc4ccec4412db2772d19。我这里改成了只读取一行,因为一个csv文件的一个caseId只应该有一行。
数据驱动类:
import java.lang.reflect.Method; import java.util.Iterator; import org.testng.annotations.DataProvider; public class DataProviderTest { /** * @DataProvider的返回值类型只能是Object[][]与Iterator<Object>[] * * @param method * @return */ @DataProvider public Iterator<Object[]> dataSource(Method method) { return (Iterator<Object[]>) new CSVData(method.getDeclaringClass().getSimpleName(), method.getName()); } }
Method方法是通过反射获取的,总之哪个方法调用我Method就是那个方法。
method.getDeclaringClass().getSimpleName()可以获取方法所属的类的类名。
我这里规定了csv的文件名就是测试类的类名,用例名就是方法名。
return (Iteratorf78f5ba480eb63d6031a27839cd20e37) new CSVData(…)就是将CSV读取类读取的结果返回,返回的类型是Iteratorf78f5ba480eb63d6031a27839cd20e37的,符合@DataProvider的返回值类型要求。当@Test(dataProvider = "dataSource")注解的测试方法执行时就会调用Iterator的hasNext()判断是否有数据和next()获取数据。
测试类:
import java.util.Map; import org.testng.annotations.Test; public class DataTest extends DataProviderTest { @Test(dataProvider = "dataSource") public void id2(Map<String, String> data) { System.out.println(data); } @Test(dataProvider = "dataSource") public void id1(Map<String, String> data) { System.out.println(data); } }
输出结果如下:
PASSED: id1({caseId=id1, flag=Y, property=flowModel, type=com.mybank.bkloanapply.core.model.BaseModel, value=BaseModel.csv@1}) PASSED: id2({caseId=id2, flag=M, property=context, type=java.util.Map, value=a:Object.csv@1})
总结
通过以上例子可以看到,无论@DataProvider注解的方法返回的是Object[ ][ ]还是Iteratora87fdacec66f0909fc0757c19f2d2b1d[],最后测试方法获得的参数都是Object[ ]里放的东西,第一个例子里放了两列String,第二个例子里放了Map05ad6303f369fc4ccec4412db2772d19,所以第一个测试类的测试方法的参数是两个String,第二个测试类的测试方法的参数是Map05ad6303f369fc4ccec4412db2772d19,必须保持一致才行。
以上是TestNG数据驱动简介的详细内容。更多信息请关注PHP中文网其他相关文章!

本文讨论了使用Maven和Gradle进行Java项目管理,构建自动化和依赖性解决方案,以比较其方法和优化策略。

本文使用Maven和Gradle之类的工具讨论了具有适当的版本控制和依赖关系管理的自定义Java库(JAR文件)的创建和使用。

本文讨论了使用咖啡因和Guava缓存在Java中实施多层缓存以提高应用程序性能。它涵盖设置,集成和绩效优势,以及配置和驱逐政策管理最佳PRA

本文讨论了使用JPA进行对象相关映射,并具有高级功能,例如缓存和懒惰加载。它涵盖了设置,实体映射和优化性能的最佳实践,同时突出潜在的陷阱。[159个字符]

Java的类上载涉及使用带有引导,扩展程序和应用程序类负载器的分层系统加载,链接和初始化类。父代授权模型确保首先加载核心类别,从而影响自定义类LOA

本文解释了用于构建分布式应用程序的Java的远程方法调用(RMI)。 它详细介绍了接口定义,实现,注册表设置和客户端调用,以解决网络问题和安全性等挑战。

本文详细介绍了用于网络通信的Java的套接字API,涵盖了客户服务器设置,数据处理和关键考虑因素,例如资源管理,错误处理和安全性。 它还探索了性能优化技术,我

本文详细介绍了创建自定义Java网络协议。 它涵盖协议定义(数据结构,框架,错误处理,版本控制),实现(使用插座),数据序列化和最佳实践(效率,安全性,维护


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

VSCode Windows 64位 下载
微软推出的免费、功能强大的一款IDE编辑器

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

SecLists
SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

SublimeText3 英文版
推荐:为Win版本,支持代码提示!

Dreamweaver CS6
视觉化网页开发工具