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));
}