上一篇有提过可以通过DataProvider做数据驱动,通过@Test(dataProvider = "abc"),@DataProvider(name = "abc")来获取指定的测试数据,在缺点是测试数据需要保存在代码中,如果想从外部获取参数,需要一个通用的数据驱动。
DataProvider 提供了一个方法,DataProvider(Method m),通过入参传入的方法,可以知晓该方法要调用哪个数据,从外部获取到数据后,转为二维数组返回即可。直接上代码~~
首先我们创建一个通用数据驱动类ExtentTestNGDataProvider,当脚本调用@DataProvider(name = "createData")时,将该方法名传入,获取方法名称,在数据库查到该方法对应的数据,最终返回Object [ ][ ] 格式的结果。
public class ExtentTestNGDataProvider {
@DataProvider(name = "createData")
public static Object[][] createData(Method m) throws Exception {
String casename = m.getName();
String sql = "select data_json from tb_data where status = 1 and casename = '"+casename+"'";
List<Map<String, Object>> list = MysqlUtils.exeSqlApi("auto_test", sql);
Parameter[] parameter= m.getParameters();
List<Map<String,Object>> listnew = new ArrayList<>();
for(Map<String,Object> map :list){
String data_json = map.get("data_json").toString();
LinkedHashMap<String, Object> mapdata = JSON.parseObject(data_json, LinkedHashMap.class);
listnew.add(mapdata);
}
Object [ ][ ] result=new Object[listnew.size()][parameter.length];
for(int i=0;i<listnew.size();i++)
{
result[i]=listnew.get(i).values().toArray();
}
return result;
}
}
数据库:通过status控制测试数据是否生效,通过data_json返回测试数据。data_json内容和代码中原来的测试数据一致。
最后测试用例类
@Test(dataProvider = "createData", priority = 2,threadPoolSize = 1, invocationCount = 1)// dataProviderClass = ExtentTestNGDataProvider.class,,threadPoolSize = 1, invocationCount = 1
public void payment_order(String name, String dealer_id, String replacejson, String assertjson) throws Exception {
}