基于testNG的通用数据驱动-DataProvider

    xiaoxiao2022-07-02  118

        上一篇有提过可以通过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 { }

     

    最新回复(0)