zoukankan      html  css  js  c++  java
  • 实例简介HttpUnit结合JUnit自动测试Web应用

    本文通过实例来讲解如何通过HttpUnit来对web应用进行测试,尤其是当下Ajax越来越流行的情况下,http request和response交互频繁,里面传输的内容也以Json或者XML为主,用HttpUnit结合JUnit来做测试可以带来很多好处,甚至是在web页面还不存在的情况下,通过模拟http请求,包括模拟上传文件,就可以用来测试服务端的servlet,action(有httprequest参数)等代码.

    JAVA实例代码

    HTTPStub :包装了HttpUnit提供的一些类,同时在初始化的时候做login验证,WebConversation会维护session的信息.
    public class HTTPStub {
        private WebConversation httpConversation;
        private PostMethodWebRequest httpRequest;

        public HTTPStub() {
            httpConversation = new WebConversation();
            String urlLogin = EnvConstant.SERVER_CTXT + EnvConstant.SERVER_LOGINURL;
            GetMethodWebRequest getReq = new GetMethodWebRequest(urlLogin);
            try {
                httpConversation.getResponse(getReq);
            } catch (IOException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            } catch (SAXException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
        }

        public void initHttpRequest(String url) {
            httpRequest = new PostMethodWebRequest(EnvConstant.SERVER_CTXT + url, true);
        }

        public void setParameter(String name, String value) {
            httpRequest.setParameter(name, value);
        }

        public void setFile(String Filename) {
            InputStream inputStream = FileUtil.readFromdefaultClspath(Filename);
            httpRequest.selectFile("dumyfile", "dumyfile.csv", inputStream, "text/plain");
        }

        public WebResponse getHttpResponse() {
            try {
                return httpConversation.getResponse(httpRequest);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (SAXException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return null;
        }

        public String getHttpResponseContents() {
            try {
                WebResponse resp = httpConversation.getResponse(httpRequest);
                
                StringBuffer strbf = new StringBuffer();

                BufferedReader in = new BufferedReader(new InputStreamReader(resp.getInputStream()));
                String str;
                while ((str = in.readLine()) != null) {
                    strbf.append(str);
                }
                in.close();

                return strbf.toString();

            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (SAXException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            return null;
        }

    }

    对inputstream处理的一个util类:
    public class FileUtil {
        public static InputStream readFromdefaultClspath(String fileName) {

            InputStream stream = ClassLoader.getSystemResourceAsStream(fileName);
            return stream;

        }
        
        public static String getContentsFromFile(String fileName) {

            InputStream stream = readFromdefaultClspath(fileName);
            StringBuffer strbf = new StringBuffer();
            try {
                BufferedReader in = new BufferedReader(new InputStreamReader(stream));
                String str;
                while ((str = in.readLine()) != null) {
                    strbf.append(str);
                }
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }

            return strbf.toString();

        }
        
    }

    Junit测试类:


    public class ActionCopyBillTest {
        private HTTPStub httpStub;

        @Before
        public void setUp() throws Exception {
            httpStub = new HTTPStub();
        }

        @After
        public void tearDown() throws Exception {
        }

        @Test
        public void testPerform() {
            httpStub.initHttpRequest("FrontController?command=CopyBill");

            httpStub.setParameter("bm_cb_dtCategory", "Copy Bill Request");
            httpStub.setParameter("bm_cb_SRID", "SR0001");
            httpStub.setParameter("bm_cb_ItemOpt", "2- Custom Itemisation");
            httpStub.setParameter("bm_cb_BillLanCode", "ENG");
            httpStub.setParameter("bm_cb_LegendPrs", "Copy Legend");
            httpStub.setParameter("bm_cb_BillStruct", "Front Page Only");
            httpStub.setParameter("bm_cb_ItemThd", "1");
            httpStub.setParameter("bm_cb_BillMedia", "Paper Bill");
            httpStub.setParameter("bm_cb_BillFormat", "Blue Bill");

            httpStub.setFile("testdata/req/CopyBill_1.csv");

            String respContents = httpStub.getHttpResponseContents();
            
            String ritContents = FileUtil.getContentsFromFile("testdata/rep/CopyBill_1.rsp");

            Assert.assertEquals(respContents, ritContents);
        }

    }

    如果想对response进行验证,可以通过手工从html页面输入数据,提交请求,用工具(如eclipse带有的插件tcp/ip monitor)将response截取下来保存为文件,然后和junit测试的时候的response对比.

    另外,返回的response也提供了一系列方法来操作其包含的内容:

    1,如返回的是文本,可以通过resp.getText()获取,如果文本是json格式,可以再进一步构造成jsonobject来操作.

        String respContents = resp.getText();
        JSONObject json = new JSONObject(respContents);
        System.out.println(json.getInt("total"));
        JSONArray arr = json.getJSONArray("userdata");
        System.out.println(arr.get(0));

    2,如果返回的是XML(标准结构的html也是合法的XML),可以得到w3c 的document对象,resp.getDOM();

    3,如果返回的是html页面,WebResponse提供了一组类似于Javascript操作html dom的方法.

    resp.getElementWithID(id)

    resp.getTables();

    ...

  • 相关阅读:
    [Python] 登录人人网2011版
    [WPF] 自定义窗体样式
    [Python] 控制台输入密码的方法
    [Python] 字符串加密解密
    [WPF] 模仿AMD LIVE! EXPLORER界面
    [Python] Visual Studio 2008 集成 IronPython 开发环境
    mysql表类型(存储引擎)
    logstash收集nginx访问日志
    linux设置开机启动脚本
    logstash安装log4j插件
  • 原文地址:https://www.cnblogs.com/duanxz/p/2640119.html
Copyright © 2011-2022 走看看