testNG的DataProvider返回Iterator<Object[]>的妙用
TestNG中使用DataProvider有如下好处:
1. 在执行用例的时候,dataProvider迭代中的每组数据都是作为一个用例执行,实现数据驱动执行
2. 在测试数据有规律的情况下,免去了在XML中添加测试数据的烦恼,直接将测试数据放到dataProvider中即可
其中dataProvider作为数据提供者,只能返回Object[][]和Iterator<Object[]>类型的数据
当测试数据包含类对象来达到数据驱动,使用DataProvider的Iterator<Object[]>类型的数据返回就显得那么方便,看个例子。
testdata.txt
{ "name":"test1", "url":"/v1/test", "method":"post", "body": { "platformCode": "10001", "productCode": "10002", "userId": "123456" } }; { "name":"test2", "url":"/v2/test", "method":"post", "body": { "platformCode": "10003", "productCode": "10004", "userId": "211234" } }
TestCase.java文件
/* * 接口测试中,接口的信息封装成一个对象 */ @Data public class TestCase { // 接口name private String name; // 接口url private String url; // 接口的请求方式 private String method; // 接口的请求体 private Map<String,Object> body; }
测试数据源:
/** * 从外部txt文件中读取测试数据 * @param MethodName * @return */ @DataProvider(name="iterator") public Iterator<Object[]> getMethodData1(Method method){ String data=fileUtil.readFile(); String[] strArray=data.split(";"); List<Object[]> testCases=new ArrayList<>(); for(String str :strArray){ TestCase testcase = JSON.parseObject(str ,TestCase.class); if(testcase.getName().equals(method.getName())){ //查询接口的信息要封装成对象 testCases.add(new Object[]{JSON.parseObject(str ,TestCase.class)}); } } return testCases.iterator(); }
测试方法:
根据测试方法执行对应的测试数据,如test1只运行其对应的测试数据。
@Test(dataProvider="iterator") public void test1(TestCase testcase){ System.out.println(testcase.toString()); }