• 技术文章 >Java >java教程

    新Java运动:测试驱动开发3---用户注册

    黄舟黄舟2016-12-30 13:11:24原创571
    用户注册流程是用户输入用户名和密码,然后正确将用户基本信息和账户信息建立到数据库中去。

    让我们先从简单的步聚做起,第一步是写一个测试用例,传入cmd=registerUser,userName=闫涛,然后调用Servlet,最后在d:/ablog/app.html文件中回写出收到的用户名。首称是则试代码:

    @Test
    	public void testRegisterUser001() {
    		HttpServletRequest request = new HttpJunitRequest();
    		Map<String, String[]>params = (Map<String, String[]>)request.getParameterMap();
    		String[] cmd = new String [1];
    		cmd[0] = "registerUser";
    		params.put("cmd", cmd);
    		String[] userName = new String[1];
    		userName[0] = "y闫涛t";
    		params.put("userName", userName);
    		MainServlet m = new MainServlet();
    		HttpServletResponse response = new HttpJunitResponse();
    		try {
    			m.doGet(request, response);
    			response.getWriter().close();
    		} catch (IOException | ServletException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		assertTrue(1>0);
    	}

    下面是写代码通过这个测试用例,首先在MainServlet根据命令参数进行跳转中,加入如下代码:

    switch (cmd) {  
            case "registerUser":  
                registerUser(request, response);  
                break;

    具体处理函数如下所示:

    private void registerUser(HttpServletRequest request, HttpServletResponse response)   
                throws IOException, ServletException {  
            PrintWriter out = response.getWriter();  
            String userName = null;  
            if (request.getParameter("userName") != null) {  
                userName = request.getParameter("userName");  
            }  
            out.print("userName=" + userName + "!");  
        }

    运行测试用例,然后打开d:/ablog/app.html,将会发现用户名已经打印到文件中。

    但是等一下,上面的测试步聚不仅没有实现自动化,而且比直接打开浏览器访问URL方便,尤其是返回页面内容较多时。所以我们需要改造上述测试用例,使其可以自动化测试。从前面的文章中可以知道,我们会将页面中需要显示的内容,存储在request对象中,通常是以Map<String, Object>形式存储,页面只是从这里面获取值,然后打印到页面上,因此我们可以通过验证存储在Map<String, Object>中的内容来自动判断我们的功能开发是否正确。

    好了,下面我们先来实现这个特性。在MainServlet.registerUser中,定义Map<String, Object> model并将其加入到request中,代码如下所示:

    Map<String, Object> model = new HashMap<String, Object>();  
            long userId = 101;  
            model.put("userId", "" + userId);  
            request.setAttribute("model", model);

    在测试用例中我们测试是否正确设置了userId值,代码如下 所示:

    Map<String, Object> model = (Map<String, Object>)request.getAttribute("model");  
                if (model.get("userId") != null && Long.parseLong("" + model.get("userId"))==101) {  
                    rst = true;  
                }

    这时我们会发现,运行测试用例竟然不能通过!这是正常的,因为我们的HttpJunitRequest对象中没有实现getAttribute和setAttribute方法,为了使测试用例可以通过,我们需向HttpJunitRequest中添加如下代码:

    private final Map<String, Object> attributes = new HashMap<String, Object>();  
      
    @Override  
        public Object getAttribute(String key) {  
            return attributes.get(key);  
        }  
      
    @Override  
        public void setAttribute(String key, Object value) {  
            attributes.put(key, value);  
        }

    这时再运行测试用例,终于可以显示令我们身心愉悦的绿色通过标志了。

    到目前为止,我们基本上已经搭建完成一个可运行的最小系统,并且可以按照TDD的理念进行开发了。

    由上面的例子可以看出,我们每次都先想好对一个小功能的测试用例,然后编码试图通过这个测试用例,在通过之后,再继续往上添加新的功能。而每次测试、开发、验证仅需要最多二、三十分钟时间。通过这种方式编写的代码,基本上均经过了充分的测试,代码质量是可以得到一定程度的保障的。

    以上就是新Java运动:测试驱动开发3---用户注册的内容,更多相关内容请关注PHP中文网(m.sbmmt.com)!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    上一篇:java 加载图像,显示图像和图像的灰度化 下一篇:新Java运动:测试驱动开发3---用户注册2
    20期PHP线上班

    相关文章推荐

    • 【活动】充值PHP中文网VIP即送云服务器• 一文掌握Java8新特性Stream流的概念和使用• Java线程学习之并发编程知识点• 完全掌握Java中的抽象类和接口• Java中的set集合如何理解• 详细了解java多线程机制
    1/1

    PHP中文网