SingleAtomicCase运行

目录

本篇文章包含如下知识点:

  • SingleAtomicCase的三层代码块

  • 其中所涉及到的一些知识点的解读


业务分析

目前项目框架中提供了run all test cases方法,但users在用户界面上无法直接运行单个atomicCase,提供一个“运行”方法,让使用者可以直接在界面上跑单个case并生成相应的报告。

代码块

实际工作代码牵涉庞大,此处只给出修改部分的代码并给出解读。

Controller层

//runSingleAtomicaCase
    @RequestMapping(value = "/update", method = RequestMethod.POST)
    @ResponseBody
    public void runSingleTest(
            @RequestParam(value="node", required = true) String node) throws Exception{
        AtomicCaseBo atomicCaseBo = new AtomicCaseBo();
        atomicCaseBo.runSingleAtomicCase(node);
    }

BO层

    public void runSingleAtomicCase(String node) throws Exception{
        try {
            Process p1 = Runtime.getRuntime().exec("cmd /c start "+Constant.ATOMIC_PROJECT_PATH+"APIGen.bat");
            BufferedReader in = new BufferedReader(new InputStreamReader(p1.getInputStream()));
            String s = "";
//            if ((s = in.readLine()) == null) {
//                //看看有没有想要的进程
//              Process p2 = Runtime.getRuntime().exec("cmd /c start D:/xiangmu/sample/APITest/APIRun.bat");
//              in = new BufferedReader(new InputStreamReader(p2.getInputStream()));
//                s = "";
                if ((s = in.readLine()) == null) {
                    AtomicCaseBo atomicCaseBo = new AtomicCaseBo();
                    boolean b1 = false;
                    b1 = atomicCaseBo.modifyFromTestngXML(node);
                    if(b1){
                        Process p3 = Runtime.getRuntime().exec("cmd /c start "+Constant.ATOMIC_PROJECT_PATH+"APIRun2.bat");
                        in = new BufferedReader(new InputStreamReader(p3.getInputStream()));
                        s = "";
                        if ((s = in.readLine()) == null){
                            AtomicCaseController atomicCaseController = new AtomicCaseController();
                            atomicCaseController.openHtmlInChrome(new URL("file:///"+Constant.ATOMIC_PROJECT_PATH+"Report/index.html"));
                        }                   
                    }
                }


        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
//      try {
//          Runtime.getRuntime().exec("cmd /c start D:/xiangmu/sample/APITest/APIRun.bat");
//      } catch (IOException e) {
//          e.printStackTrace();
//      }
    }


    public static boolean modifyFromTestngXML(String node) throws Exception{
        String testngPath = Constant.ATOMIC_PROJECT_PATH+"TestProject/src/test/resources/testng/";//将目前TestProject生成的文件夹写死
        File file = new File(testngPath);
        System.out.println(file);
        System.out.println("跑杂项文件删除程序");
        for(File f:file.listFiles()){
            if(!(f.getName().contains("testng.xml")||f.getName().contains("testng-all.xml"))){
//              删除除testng.xml和testng-all.xml之外的文件
                System.out.println("删除"+f+"文件");
                f.delete();
            }else{
                if(f.getName().contains("testngPath.xml")){
                    AtomicCaseDAO atomicCaseDAO = new AtomicCaseDAO();
                    AtomicCaseBo atomicCaseBo = new AtomicCaseBo();
                    atomicCaseBo.deleteFromXml(f,atomicCaseDAO.selectFromDB(node));
                }
            }
        }
        System.out.println("结束杂项文件删除程序");
        return true;
    }
//    public static void main(String[] args){
//      AtomicCaseBo atomicCaseBo = new AtomicCaseBo();
//      try {
//          atomicCaseBo.Parse("D:/xiangmu/autoTest/Doraemon/APITest/TestProject/src/test/resources/testng/testng.xml");
//      } catch (Exception e) {
//          System.out.println("yichangpaochu");
//          // TODO Auto-generated catch block
//          e.printStackTrace();
//      }
//    }

    public void deleteFromXml(File f, String node) throws Exception {
//      删除testng.xml文件中不符合要求的部分标签
        AtomicCaseBo p = new AtomicCaseBo();
        Document d = p.Parse(f);
        System.out.println("跑删除XML中不符合要求标签程序");
        NodeList nlist = d.getElementsByTagName("test");
        System.out.println(nlist.getLength());
        System.out.println(nlist+"1");
        for(int i=0;i<nlist.getLength();){
            Element l = (Element) nlist.item(i);
            System.out.println("删除 the nodes");
            if(!l.getAttribute("name").equals(node)){
                System.out.println(nlist+"大白痴");
                System.out.println("delete the useless node"+l);
                l.getParentNode().removeChild(l);
            }else{
                i++;
            }
        }
        System.out.println("结束删除XML中不符合要求标签程序");
        System.out.println(d.getElementsByTagName("test").getLength());
        p.updateXml(d, f.getPath());
        //Transformer t = TransformerFactory.newInstance().newTransformer();
        //t.transform(new DOMSource(d), new StreamResult("src/resource/test.xml"));
    }
//  public void remainOneNode(Document doc,String str,String path){
//        
//        NodeList nlist = doc.getElementsByTagName("test"); //得到总的用例
//        System.out.println("原子case共有:" + nlist.getLength() + "个");
//        for(int i=0;i<nlist.getLength();){
//               Element testElement  = (Element) nlist.item(i);
//               String tmp = testElement.getAttribute("name");
//               if(!tmp.equals(str)){
//                  testElement.getParentNode().removeChild(testElement);
//                  System.out.println("已删除原子case:"+ tmp);   //删除时不移动指针
//               }else
//               {
//                      System.out.println("保留原子case: "+ tmp);
//                      ++i; //指针移到
//               }
//        }
//        //更新到xml
//        updateXml(doc,path);
//        
// }

    public void updateXml(Document doc,String path){
        System.out.println("跑更新程序");
        Transformer trans = null;
        try {
            trans = TransformerFactory.newInstance().newTransformer(); //创建trans
        } catch (TransformerConfigurationException e) {
            e.printStackTrace();
        } catch (TransformerFactoryConfigurationError e) {
            e.printStackTrace();
        }
        try {
            trans.transform(new DOMSource(doc), new StreamResult(path)); //dom到xml
        } catch (TransformerException e) {
            e.printStackTrace();
        }
        System.out.println("跑结束更新程序");
    }


     public Document Parse(File f) throws Exception{
//          InputStream input = getClass().getResourceAsStream(f.getParent());
         DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
         DocumentBuilder builder = factory.newDocumentBuilder();
         Document document = builder.parse(f);
         return document;
        }
     public void openHtmlInChrome(URL url){
         try {  
             browse(url);  
         } catch (Exception e) {  
         }  
     }  

     private static void browse(URL url) throws Exception {  
         //获取操作系统的名字  
         String osName = System.getProperty("os.name", "");  
         if (osName.startsWith("Windows")) {  
             //windows的打开方式。  
             Runtime.getRuntime().exec("rundll32 url.dll,FileProtocolHandler " + url);
         } else if (osName.startsWith("Mac OS")) { 
             //Mac的打开方式  
             Class fileMgr = Class.forName("com.apple.eio.FileManager");  
             Method openURL = fileMgr.getDeclaredMethod("openURL", new Class[] { String.class });  
             openURL.invoke(null, new Object[] { url });  
         } else {  
             // Unix or Linux的打开方式  
             String[] browsers = { "firefox", "opera", "konqueror", "epiphany", "mozilla", "netscape" };  
             String browser = null;  
             for (int count = 0; count < browsers.length && browser == null; count++)  
                 //执行代码,在brower有值后跳出,  
                 //这里是如果进程创建成功了,==0是表示正常结束。  
                if (Runtime.getRuntime().exec(new String[] { "which", browsers[count] }).waitFor() == 0)  
                     browser = browsers[count];  
                if (browser == null)  
                    throw new Exception("Could not find web browser");  
//              else  
//                  //这个值在上面已经成功的得到了一个进程。  
//                  String s = "" ;
//                  url.getPath();
//                  Runtime.getRuntime().exec(new String[] { browser, url });  
      }  
 }  

     public void openHtml(URL url){
//          URL url=new URL("file:///D:/xiangmu/sample/APITest/Report/index.html");
         BufferedReader in2=null;
         try{
             in2 = new BufferedReader(new java.io.InputStreamReader(url.openStream()));
             for(String line;(line=in2.readLine())!=null;){
                 System.out.println(line);
             }
         }catch (IOException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
         }finally{
             if(in2!=null){
                 try{
                     in2.close();
                 }catch (IOException e) {
                     // TODO Auto-generated catch block
                     e.printStackTrace();
                 }
             }
         }
     }

DAO层

    public String selectFromDB(String caseID)
    {
         ResultSet result=daocon.executeQuery(String.format("select name from AtomicCase where caseID='%s'", caseID));
         String name = null;
           try {
            while(result.next())
               {
                name= result.getString(1);
               }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return name;
    }

层级逻辑:controller接收到前台传来的node(string caseID)作为atomic case的唯一标识符,调用BO的runSingleAtomicCase方法并将node参数传入。

runSingleAtomicCase()先跑APIGen,进程结束后调modifyFromTestngXML()方法

modifyFromTestngXML()先将生成的xml文件非testng.xml testng-all.xml文件删除,然后从DAO层调selectName方法,取出node对应的name,并将testng.xml中不需要跑的testname删除。并更新testng.xml文件。完成后跑APIRUN脚本。并生成测试报告以网页的形式打开。

知识梳理

各块知识总览 

层级价格
Bojava调用bat脚本
Bo批处理部分
Boxml文件解析部分
Bo判断进程是否结束
Bo在浏览器中打开本地HTML文件
Bo文件遍历及删除
java调用bat脚本
Runtime.getRuntime().exec("cmd /c start "+Constant.ATOMIC_PROJECT_PATH+"APIGen.bat");
批处理部分
cd指令,到指定文件目录
@echo off 
md "E:\My documents\Newfolder1" 到指定文件目录下新建文件夹
mkdir Report
copy TestProject\target\surefire-reports\html\* Report 
例1:打开指定目录,如C:\Test
         start C:\Test
例2:执行C盘下的WinWord.exe程序
         start C:\WinWord.exe
例3:用某个程序打开某个文件,如用TheWorld.exe打开一个htm文件
        start d:\TheWorld\TheWorld.EXE C:\我有一个恋爱.htm
pause停顿
exit离开

批处理http://blog.csdn.net/linda1000/article/details/10221285

xml文件解析部分
public Document Parse(File f) throws Exception{
//          InputStream input = getClass().getResourceAsStream(f.getParent());
         DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
         DocumentBuilder builder = factory.newDocumentBuilder();
         Document document = builder.parse(f);
         return document;
        }
判断进程是否结束
<Runtime runtime = Runtime.getRuntime();
        Process process = null;
        try {
            process = runtime.exec("cmd /c Tasklist");

            BufferedReader in = new BufferedReader(new InputStreamReader(
                    process.getInputStream()));
            String s = "";
            if((s = in.readLine()) == null) {
                //进程结束,进行其他处理
            }
        }
java调用在浏览器中打开本地HTML文件
if (osName.startsWith("Windows")) {  
             //windows的打开方式。  
             Runtime.getRuntime().exec("rundll32 url.dll,FileProtocolHandler " + url);
         } 
文件遍历及删除知识
//文件遍历
for(File f: file.list()){
    if(!(f.getName().contains("testng.xml")||f.getName().contains("testng-all.xml")){
    f.delete();
    }else{
        if(f.getName().contains("testng.xml")){
            AtomicCaseBO atomicCaseBo = new AtomicCaseBo();
            atomicCaseBo.deleteFromXml(node);   
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值