在自动化测试平台中,如何实现根据前端传入的数据,批量执行测试用例,并生成测试报告呢?
这里记录一次代码执行testng.xml文件,并可接收前端传入的参数,后续遍历该参数:
步骤;
1.controller调用下面的代码,并传入param;
public static int RunxmlByList(String param, String xmlName) {
String xmlName1 = xmlName;
//根据传递过来的xmlName,找到目录下的对应的xml
InputStream inputStream = RunTestUtil.class.getClassLoader().getResourceAsStream(xmlName);
TestNG testNG = new TestNG();
SuiteXmlParser suiteXmlParser = new SuiteXmlParser();
List<XmlSuite> suites = new ArrayList<>();
XmlSuite xmlSuite = suiteXmlParser.parse(xmlName, inputStream, true);
suites.add(xmlSuite);
//定义一个map键值对
Map<String,String> parameters = new HashMap<>();
//此时参数的格式是name:1,2,3,4,5,6
//要看一下这个xml到底是怎么运行的?去xml文件中xmlAndParamter.xml
parameters.put("list", param);//本身这个xml中就有name这个参数,那么这么做就会替换掉原来的name
xmlSuite.setParameters(parameters);
testNG.setXmlSuites(suites);
//添加一个小的监听器
TestListenerAdapter listener = new TestListenerAdapter();
testNG.addListener(listener);
List list=new ArrayList();
list.add(ExtentTestNGIReporterListener);
testNG.setListenerClasses(list);
testNG.run();
//收集通过的用例和失败的用例
List<ITestResult> pass = listener.getPassedTests();
log.info("本次通过的用例数是:"+pass.size());
List<ITestResult> failed = listener.getFailedTests();
System.out.println("本次失败的用例数是:"+failed.size());
return testNG.getStatus();
}
2.xml文件中执行的就是这个类:这里是重点:
public class CaseByList {
//定义一个公共的name,为了使后面的DataProvider也能取到这个值
private String list;
// @BeforeClass,不知道为什么,使用@BeforeClass,无法获取到name
@BeforeSuite
@Parameters(“list”)
public void beforeClass(String list){
this.list=list;
System.out.println(“给name进行赋值”+this.list);
}
//执行哪些用例呢?从此处获得
@DataProvider(name = "getList")
public Iterator<Object[]> getList(){
//此处返回的就是一个ReqInfo 数组,也就是待执行的数组
List caseList=new ArrayList<>();
//这一步需要TestCase的toString方法符合json字符串
caseList= JSONArray.parseArray(this.list,TestCase.class);
log.info("当前长度是:"+caseList.size());
for (TestCase testCase : caseList) {
System.out.println("testCase:"+testCase.toString());
}
List<Object[]> links = new ArrayList<Object[]>();
for (Object u : caseList) {
//做一个形式转换,否则无法set
links.add(new Object[] { u });
System.out.println();
}
return links.iterator();
}
//这个是真正去执行的动作
@Test(dataProvider = "getList" )
public void RunTest(TestCase testCase) throws Exception {
Reporter.log(testCase.getBusinessdesc()+"请求原文=="+testCase.getRequestData());
JSONObject jsonObject= HttpExceut.excuteRequest(testCase);
Reporter.log(testCase.getBusinessdesc()+"响应结果=="+jsonObject.toString());
// SoftAssert softAssert=new SoftAssert();
// //先校验第一层,再校验第二层
// softAssert.assertEquals(jsonObject.getString(“code”),“0000”,“请求出错,code期望返回0000,实际返回=”+jsonObject.getString(“code”));
// JSONObject jsonObject1=jsonObject.getJSONObject(“bizData”);
// Boolean aBoolean = AssertMethod.JsonCompare(JSONObject.parseObject(testCase.getExpectResp()),jsonObject1);
// softAssert.assertTrue(aBoolean);
// softAssert.assertAll();
JSONObject excep=JSONObject.parseObject(testCase.getExpectResp());
Boolean isSuccess = isSuccess(excep, jsonObject);
Assert.assertTrue(isSuccess,“期望返回==”+excep.toString()+“实际返回==”+jsonObject.toString());
}
}