package com.asiainfo.testXml;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Iterator;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
import com.asiainfo.util.FileHelper;
import com.asiainfo.util.SystemConfig;
/**
* 自动生成XML文档测试用例 (作业计划)
* @author YangPu
*/
public class XmlDocument
{
private String moduleType="MAINP"; //类型
private String smoduleType; //对应的小写类型
private int bizCnt; //流程数
private List<Object> parentLableName; //标签的父标签
private List<Object> isChange; //标签是否需要更新
private List<Object> lableName_case; //nm_test_boitenoire_case_def表中的标签名
private List<Object> default_value; //nm_test_boitenoire_case_def表中与标签对应的默认值
private List<Object> lableName_attr; //nm_test_boitenoire_attr_def表中的标签名
private List<Object> columnValue; //nm_test_boitenoire_attr_def表中的枚举值
private ArrayList<String> combinationList; //存放着组合后的属性值
private String fileDir; //存放Xml测试用例文件的全路径名
private String rootDir; //存放Xml测试用例文件的根目录,通过systemconfig.properties文件读取
private boolean isDefault=true; //是否按默认值生成
private String fileName; //生成Xml测试用例的文件名
private boolean isInnerAbnormal=false; //判断循环内是否有异常
private boolean isOutnerAbnormal=false; //判断循环外是否有异常
protected Log logger = LogFactory.getLog(XmlDocument.class);
private QueryDB queryDB;
private int createCount=0; //debug 需要生成的测试用例数目
public void setModuleType(String moduleType)
{
this.moduleType = moduleType;
}
/**
* 程序的执行模块
*/
public void runProc()
{
initPath();
if(!loadData())
return ;
int bizCntTmp=bizCnt;
int no=001;
String fileDate="20110101";
String fileNameNext;
fileName=moduleType+"_"+"200_15MI_"+fileDate+"_"+getStrNo(no)+"_000.xml";
bizCntTmp=1; //先设置为 1
String fileNext=""; //设计流程的时候 赋值
System.out.println("");
while(bizCntTmp>0)
{
if(isDefault)
{
logger.info(" 开始生成默认用例!"); //debug
createXmlFile(fileName);
if(!isInnerAbnormal)
createDBLog(fileName,"PASS");
bizCntTmp--;
no++;
fileNameNext=moduleType+"_200_15MI_"+fileDate+"_"+getStrNo(no)+"_000.xml";
if(bizCntTmp>0)
fileNext=fileNameNext;
queryDB.InsertImport(fileName, "boitenoire_testxml_create", "", "Y", fileNext, "verify");//不涉及流程的话,fileNameNext为空
fileNext="";
fileName=fileNameNext;
isInnerAbnormal=false;
isDefault=false;
}
if(!isDefault)
{
logger.info(" 开始生成组合用例!"); //debug
combination(0,"");
this.createCount=combinationList.size()+1;//debug
while(combinationList.size()>0)
{
if(no-1>=96)
{
try
{
SimpleDateFormat df=new SimpleDateFormat("yyyyMMdd");
Date date=df.parse(fileDate);
long millseconds=date.getTime();
millseconds+=3600*24*1000;
date.setTime(millseconds);
fileDate=df.format(date);
no=001;
} catch (ParseException e) {
// TODO Auto-generated catch block
isInnerAbnormal=true;
createDBLog(fileName,"ATX008");
}
}
createXmlFile(fileName);
if(!isInnerAbnormal)
createDBLog(fileName,"PASS");
bizCntTmp--;
fileNameNext=moduleType+"_200_15MI_"+fileDate+"_"+getStrNo(no)+"_000.xml";
no++;
queryDB.InsertImport(fileName, "boitenoire_testxml_create", "", "Y", fileNext, "verify");//debug 不涉及流程的话,fileNameNext为空
fileName=fileNameNext;
combinationList.remove(0);
isInnerAbnormal=false;
try {
Thread.sleep(5);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("已生成["+(this.createCount-this.combinationList.size())+"] 需生成["+this.createCount+"]"); //debug
}
}
}
if(!isOutnerAbnormal)
createDBLog("","PASS"); //debug
if(queryDB!=null)
queryDB.EndDBConnect();
logger.info("runProc done!");
}
private void initPath()
{
String nowDate;
SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd");//debug
nowDate=df.format(new Date());
rootDir=SystemConfig.getProperty("rootDir");
smoduleType=moduleType.toLowerCase();
String fileDir=rootDir;
if(fileDir.endsWith(File.separator))
{
fileDir=rootDir+smoduleType;
}
else
fileDir=rootDir+File.separator+smoduleType;
try
{
File fdir = new File(fileDir); //debug
if (false == fdir.exists())
fdir.mkdir();
if(FileHelper.isFileExits(fileDir))
{
File file = new File(fileDir+"/"+nowDate);
if(false==file.exists())
file.mkdir();
FileHelper.moveFolder(fileDir, fileDir+"/"+nowDate, true);
}
this.fileDir=fileDir+"/";
logger.info("initPath done!");
}
catch(Exception ex)
{
// System.out.println("初始化文件夹路径错误!");
createDBLog("error_log.xml","ATX002");
System.exit(-1);
}
}
// 生成日志文件
//生成日志记录到数据库表
private void createDBLog(String fileName,String resultCode)
{
String sysDate,fileDate;
// SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");//debug
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
sysDate=df.format(new Date());
if(fileName==null||fileName.trim()=="")
{
fileDate=sysDate;
fileName="error_log.xml";
}
else
{
String[] strArray=fileName.split("_");
fileDate=strArray[3];
}
try
{
queryDB.InsertLog(fileName, "file_create", "to_date('"+sysDate+"','yyyy-mm-dd hh24:mi:ss')", fileDate, resultCode);
}
catch(Exception ex)
{
isInnerAbnormal=true;
isOutnerAbnormal=true;
}
}
//生成测试用例
private void createXmlFile(String fileName)
{
Document document = DocumentHelper.createDocument();
Element bomc=document.addElement("bomc");
Element type=bomc.addElement("type");
Element province=bomc.addElement("province");
Element createtime=bomc.addElement("createtime");
Element sum=bomc.addElement("sum");
Element begintime=bomc.addElement("begintime");
Element endtime=bomc.addElement("endtime");
Element data=bomc.addElement("data");
Element companyname=data.addElement("companyname");
Element rcd=data.addElement("rcd");
type.setText(moduleType);
province.setText("200");
createtime.setText("2006-04-11T14:16:12");
sum.setText("1");
begintime.setText("2006-04-11T14:00:00");
endtime.setText("2006-04-11T14:15:00");
companyname.setText("广东移动");
createXmlBody(bomc); //测试用例 拼接部分
try
{
fileName=fileDir+fileName; //debug
OutputFormat format= OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8");
FileOutputStream fileWriter=new FileOutputStream(fileName); //debug
XMLWriter xmlWriter=new XMLWriter(fileWriter,format);
xmlWriter.write(document);
xmlWriter.close();
}
catch (IOException e)
{
logger.error(e.getMessage());
createDBLog("","ATX003");
System.exit(-1);
}
}
//测试用例的拼接部分
private void createXmlBody(Element root)
{
if(isDefault)
{
for(int i=0;i<lableName_case.size();i++)
{
try
{
if(getElementByName((String)parentLableName.get(i),root)!=null)
{
Element el=getEle