新Java运动:测试驱动开发2---最小初始可运行系统
2013-03-07 14:15
351 查看
设计驱动开发要测试先行,因此需要有一个运行环境来运行测试和开发代码。因此,我们第一步是开发一个最小的,包括所有参与者的系统。然后在这个最小框架系统下,我们才可以每次测试、开发、重构一小步。我们所要开发的是一个Web系统,因此需要开发一个Web应用,同时我们需要与股票交易所交互,因此需要一个股票交易所模拟器,暂时规定股票交易所模拟器采用Json Over HTTP协议。为了接收股票交易所的通知,我们的Web应用需要有一个供股票交易所回调的URL。
明确了上述需求之后,我们就可以开发最小框架系统了。
第一步当然是开发Web应用,我们就采用新Java运动Nava:师PHP技术以开发Web应用 中所定义的架构。
股票交易所模拟器的建立方法与上面的方法类似。
首先,我想要完成用户注册功能。具体功能为用户通过页面输入用户、密码等,并点击确认按钮,系统会自动为用户在系统中建立账户。为了完成这一功能,我还需要准备一下我们的工作环境:一个是建立用户及账户数据库表,其次是配置Jboss使用Mysql数据库。数据库表结构如下所示:
终于所有的环境准备可以告一段落了,可以具体开始真正的测试驱动开发过程了。
由于我们是网页应用,直接采用网页进行测试会比较费时费力,而且只能人工进行,不能实现自动化和回归测试,因此我们在下面主要采用Junit进行测试驱动开发。
下面我们需要模拟用户请求,为了模拟用户请求,我们需要构造HttpServletRequest及HttpServletResponse,以这些为参数才能调用MainServlet中的方法。因此,我们首先定义两个模拟类HttpJunitRequest和HttpJunitResponse类,这两个类分别实现HttpServletRequest和HttpServletResponse接口。同时,我们需要重点实现HttpJunitRequest中的两个与参数获取有关的方法。
有了上述准备,我们就可以生成Junit测试类了,生成MainServlet单元测试类MainServletTest,定义新测试方法:
运行上述代码,系统不会有任何反应。下面添加代码,以响应这个假的请求,在MainServlet中添加如下代码:
因为我们需要在MainServlet中输出一些内容,因此我们希望看到这些内容是否可以正常的显示出来。所以,我们需要实现HttpJunitResponse类的一些方法,由于我们一般用PrintWriter进行输出,因些我们重写getWriter这个方法:
这样就可以在d:/ablog/app.html文件中看到MainServlet中通过out.print输出的内容了。另外,需要在Junit的方法中,最后调用一下response.getWriter().close()方法,这样在运行测试用例后,打开d:/ablog/app.html文件就可以看到我们输出的内容了。
好了,一切都已经就绪,重新运行单元测试,通过控制台,应该可以看到MainServlet的方法被调用。
至此,我们已经建立起一个可以运行的开发环境,下面我们就可以一步一步进行测试、开发、重构的构建流程了。
明确了上述需求之后,我们就可以开发最小框架系统了。
第一步当然是开发Web应用,我们就采用新Java运动Nava:师PHP技术以开发Web应用 中所定义的架构。
股票交易所模拟器的建立方法与上面的方法类似。
首先,我想要完成用户注册功能。具体功能为用户通过页面输入用户、密码等,并点击确认按钮,系统会自动为用户在系统中建立账户。为了完成这一功能,我还需要准备一下我们的工作环境:一个是建立用户及账户数据库表,其次是配置Jboss使用Mysql数据库。数据库表结构如下所示:
终于所有的环境准备可以告一段落了,可以具体开始真正的测试驱动开发过程了。
由于我们是网页应用,直接采用网页进行测试会比较费时费力,而且只能人工进行,不能实现自动化和回归测试,因此我们在下面主要采用Junit进行测试驱动开发。
下面我们需要模拟用户请求,为了模拟用户请求,我们需要构造HttpServletRequest及HttpServletResponse,以这些为参数才能调用MainServlet中的方法。因此,我们首先定义两个模拟类HttpJunitRequest和HttpJunitResponse类,这两个类分别实现HttpServletRequest和HttpServletResponse接口。同时,我们需要重点实现HttpJunitRequest中的两个与参数获取有关的方法。
public class HttpJunitRequest implements HttpServletRequest { private final Map<String, String[]> params = new HashMap<String, String[]>(); public Map<String, String[]> getParameterMap() { return params; } public String getParameter(String name) { String[] matches = params.get(name); if (matches == null || matches.length == 0) return null; return matches[0]; } .... 省略其他方法定义
有了上述准备,我们就可以生成Junit测试类了,生成MainServlet单元测试类MainServletTest,定义新测试方法:
@Test public void test() { HttpServletRequest request = new HttpJunitRequest(); Map<String, String[]>params = (Map<String, String[]>)request.getParameterMap(); String[] cmd = new String [1]; cmd[0] = "junit"; params.put("cmd", cmd); MainServlet m = new MainServlet(); HttpServletResponse response = new HttpJunitResponse(); try { m.doGet(request, response); } catch (IOException | ServletException e) { // TODO Auto-generated catch block e.printStackTrace(); } assertTrue(1>0); }
运行上述代码,系统不会有任何反应。下面添加代码,以响应这个假的请求,在MainServlet中添加如下代码:
public void doProcess(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { request. setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); response.addHeader("Content-Type", "text/html; charset=utf-8"); PrintWriter out = response.getWriter(); // 求出请求命令 String cmd = "none"; if (request.getParameter("cmd") != null) { cmd = request.getParameter("cmd"); } // 根据请求命令调用不同方法 switch (cmd) { case "junit": System.out.println("in MainServlet.doProcess ....."); break; .........
因为我们需要在MainServlet中输出一些内容,因此我们希望看到这些内容是否可以正常的显示出来。所以,我们需要实现HttpJunitResponse类的一些方法,由于我们一般用PrintWriter进行输出,因些我们重写getWriter这个方法:
private String respFilename = "d:/ablog/app.html"; private PrintWriter out = null; @Override public PrintWriter getWriter() throws IOException { // TODO Auto-generated method stub if (null == out) { out = new PrintWriter(respFilename); } return out; }
这样就可以在d:/ablog/app.html文件中看到MainServlet中通过out.print输出的内容了。另外,需要在Junit的方法中,最后调用一下response.getWriter().close()方法,这样在运行测试用例后,打开d:/ablog/app.html文件就可以看到我们输出的内容了。
好了,一切都已经就绪,重新运行单元测试,通过控制台,应该可以看到MainServlet的方法被调用。
至此,我们已经建立起一个可以运行的开发环境,下面我们就可以一步一步进行测试、开发、重构的构建流程了。
相关文章推荐
- 新Java运动:测试驱动开发3---用户注册3
- 新Java运动:测试驱动开发3---用户注册
- 新Java运动:测试驱动开发3---用户注册
- 新Java运动:测试驱动开发3---用户注册2
- 新Java运动:测试驱动开发3---用户注册3
- 新Java运动:测试驱动开发3---用户注册4
- 新Java运动:测试驱动开发3---用户注册2
- BlackBerry手机上面开发Java程序,如果才能让代码运行效率高,占用系统资源少?
- Java 测试驱动开发--“井字游戏” 游戏实战
- 嵌入式系统开发之驱动篇002——完整的linux驱动 + 应用测试demo(神文)
- Linux系统下开发或者运行java程序
- 昨日关注:从企业的运行价值链说起——我眼中的测试驱动开发(TDD)
- Linux设备驱动第一天学习笔记(如何将系统在开发板上运行起来、驱动开发基本步骤)
- 测试驱动开发(TDD)实战小例子(JAVA版)
- Java - 谈一谈测试驱动开发(TDD)的好处以及你的理解。
- 测试驱动的开发系列 第二部分:用JUnit测试Java类
- 相关驱动开发工具(系统自带测试驱动工具使用 学习学习)
- java测试驱动开发(TDD)之《井字游戏》
- java开发系统内核:运行第一个应用程序
- 面向 Java 开发与测试人员的远程执行 Linux/UNIX 系统上任务的框架 -- sshxcute