根据测试用例的java源码自动生成TestNG的XML文件
1、读取当前项目目录下的所有.java文件,过滤出含有@Test标识的java源文件
2、读取java文件内容,解析出包名、类名、方法名。使用Vector存储,第一个元素为包名,第二个元素为类名,从第三个元素开始存储有@Test标识的方法名
3、当前项目目录下的所有含有@Test标识的.java文件,遍历读取后单个java源文件信息存储到Vector,使用ArrayList存储所有Vector对象。
4、把ArrayList中存储的信息转换成多个XML文件,并保存在指定目录下。
5、生成XML文件的部分源码如下:
//读取Vector中的信息,生成对应的XML文件,存储到项目目录的【/suites】目录下 private void CreateXml(Vector<String> content,String filepath) throws IOException { //创建Document实例 Document document = DocumentHelper.createDocument(); //记录test名称 String xmltestname=new String(); //记录class名称 String xmlclassname=new String(); //记录要保存的xml文件位置 String xmlfilepath=new String(); //获取test名称 xmltestname=content.get(1).toString(); //获取class名称 xmlclassname=content.get(0).toString()+"."+content.get(1).toString(); //获取文件保存位置 xmlfilepath=filepath+xmltestname+".xml"; //System.out.println(filepath); //创建根节点suite,并设置name属性为xmlsuitename Element root = document.addElement( "suite" ) .addAttribute("name", xmltestname); //创建节点test,并设置name、verbose属性 Element test = root.addElement( "test" ) //记录日志信息的详细程度,有0-10个级别,0是没有,10是最详细,对输出的测试报告无影响 .addAttribute("verbose", "2") //控制@Test标识的测试用例执行顺序,默认是false,在节点下面的所有方法的执行顺序是无序的 //把它设为true以后就能保证在节点下的方法是按照顺序执行的。 .addAttribute("preserve-order", "true") .addAttribute("name", xmltestname); //创建节点classes,无属性 Element classes = test.addElement( "classes" ); //创建节点classs,并设置name属性 Element classs= classes.addElement( "class" ) .addAttribute("name", xmlclassname); //创建节点methods,无属性 Element methods = classs.addElement( "methods" ); //创建节点classs,并设置name属性 for (int i = 2; i < content.size(); i++){ @SuppressWarnings("unused") Element include= methods.addElement( "include" ) .addAttribute("name", content.get(i).toString()); } //设置DocType //第一个参数:名称 //第二个参数:PUBLIC URI //第三个参数:SYSTEM URI document.addDocType("suite", null,"http://testng.org/testng-1.0.dtd"); //输出格式设置 OutputFormat format = OutputFormat.createPrettyPrint(); format = OutputFormat.createCompactFormat(); //设置输出编码 format.setEncoding("UTF-8"); //创建XML文件 XMLWriter writer= new XMLWriter(new OutputStreamWriter(new FileOutputStream(xmlfilepath),format.getEncoding()),format); writer.write( document ); writer.close(); document=null; //记录xml文件路径 setxmlpath(xmlfilepath); } //读取ArrayList中的信息,批量生成对应的XML文件,存储到项目目录的【/suites】目录下 public void CreateAllXml(ArrayList<Vector<String>> contentall,String filepath) throws IOException { //创建Vector Vector<String> content=new Vector<String>(); for (int i = 0; i < contentall.size(); i++) { content=contentall.get(i); //根据content的信息,生成对应XML文件 CreateXml(content,filepath); } }
6、生成XML文件调用执行部分源码
public static void main(String[] args) { ReadJavaFile readjavafiles=new ReadJavaFile(); WriteTestngXml writexmlfiles=new WriteTestngXml(); String curpath =System.getProperty("user.dir"); try { writexmlfiles.CreateAllXml(readjavafiles.ReadContentAll(curpath),curpath+"\\suites\\") ; } catch (IOException e) { System.out.println("生成XML文件失败"); } System.out.println("生成的XML文件如下:"); for (int i = 0; i < writexmlfiles.getxmlpath().size(); i++) { System.out.println(writexmlfiles.getxmlpath().get(i)); }