高效单元测试综合实验指导书.doc_第1页
高效单元测试综合实验指导书.doc_第2页
高效单元测试综合实验指导书.doc_第3页
高效单元测试综合实验指导书.doc_第4页
高效单元测试综合实验指导书.doc_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

广州大学华软软件学院 软件工程系高效单元测试(ST3003) 综合性实验项目2014-2015学年 第二学期课程名称:高效单元测试 课程代码:ST3003计划学时: 68 学分:4课程性质: 必修、考试 面向专业:软件工程课程负责人:林若钦授课老师:林若钦 广州大学华软软件学院South China Institute of Software Engineering, GuangZhou University目录1综合性实验项目的介简11.1项目名称:11.2系统的应用程序示图11.3系统的应用说明:11.4总体要求:12综合性实验项目要求22.1 实验的目的与要求22.2内容与组织方式23实验设计指导23.1 综合实验之一:用Cactus对Filter进行单元测试23.1.1实验目的23.1.2实验内容与步骤23.1.3实验要求:53.2综合实验之二:用Cactus对Servlet进行单元测试53.2.1实验目的53.2.2实验内容与步骤53.2.3实验要求:73.2.4提示:73.3综合实验之三:用Cactus对JSP进行单元测试73.3.1实验目的73.3.2实验内容与步骤73.3.3实验要求:93.3.4提示:93.4综合实验之四:用DBUnit对数据库进行单元测试103.4.1实验目的103.4.2实验内容与步骤103.4.3实验要求:141综合性实验项目的介简1.1 项目名称:个人信息管理系统的单元测试1.2系统的应用程序示图例如下图如示:图1 系统的应用程序示图1.3系统的应用说明:应用程序首先接受用户包含执行SQL查询的HTTP请求。请求被一个安全filter 捕获,该安全filter 是用来检查SQL 查询是否是一个Select查询(以避免修改数据库)。如果不是,用户将被重定向到一个错误页面。如果是,那么就将调用AdminServlet.该Servlet执行请求的数据库查询并将结果传送到显示结果的JSP.Jsp使用标签返回结果并且在HTML中显示结果。1.4总体要求:要求对个人信息管理系统中的Servlet、Filter、JSP、Taglib及数据库应用程序进行单元测试。2综合性实验项目要求2.1 实验的目的与要求通过本综合实验深刻理解javaWeb应用程序单元测试的基本方法和技巧(1) 对Servlet进行单元测试的方法和技巧(2) 对Filter进行单元测试的方法和技巧(3) 对JSP进行单元测试的方法和技巧(4) 对数据库进行单元测试的方法和技巧2.2内容与组织方式由于本综合实验内容比较多,所以将其分为四个实验来完成,分别为:l 综合实验之一:用Cactus对Filter进行单元测试l 综合实验之二:用Cactus对Servlet进行单元测试l 综合实验之三:用Cactus对JSP进行单元测试l 综合实验之四:用DBUnit对数据库进行单元测试学生在教师指导下独立完成3实验设计指导3.1 综合实验之一:用Cactus对Filter进行单元测试3.1.1实验目的了解Cactus的工作原理掌握用Cactus编写servlet测试3.1.2实验内容与步骤对SecurityFilter的要求是拦截所有的Http请求并且查证传入SQL语句不包含任何恶意指令。如果不包含,将会转到一个错误网页。SecurityFilter的代码:public class SecurityFilter implements Filter /* * The error page to redirect to, in case not allowed SQL was set. */private String securityErrorPage;/* * Filters init method. */public void init(FilterConfig theConfig) throws ServletException this.securityErrorPage = theConfig.getInitParameter(securityErrorPage);/doFilter方法public void doFilter(ServletRequest theRequest,ServletResponse theResponse, FilterChain theChain)throws IOException, ServletException String sqlCommand = theRequest.getParameter(AdminServlet.COMMAND_PARAM);if (!sqlCommand.startsWith(SELECT) / Forward to an error pageRequestDispatcher dispatcher = theRequest.getRequestDispatcher(this.securityErrorPage);dispatcher.forward(theRequest, theResponse); else theChain.doFilter(theRequest, theResponse);/* * Filters destroy() method. */public void destroy() 用Cactus测试filter,主要的在于TestCase继承的是FilterTestCase,这种允许测试访问FilterAPI对象(FilterConfig,Request,Response和FilterChain)当过虑器过虑到有问题的代码时,转入到securityError.jspsecurityError.jsp代码如下: Security Error Page Only SELECT SQL queries are allowed! Web.xml部分代码如下: ServletRedirector org.apache.cactus.server.ServletTestRedirector param1 value1 used for testing ServletTestRunner org.apache.cactus.server.runner.ServletTestRunner ServletRedirector /ServletRedirector ServletTestRunner /ServletTestRunner FilterRedirector org.apache.cactus.server.FilterTestRedirector securityErrorPage /securityError.jsp FilterRedirector /FilterRedirector3.1.3实验要求:利用Cactus对SecurityFilter进行单元测试。写出实验的原理也步骤写出实验的相关代码写出实验的结果并分析。3.2综合实验之二:用Cactus对Servlet进行单元测试3.2.1实验目的了解Cactus的工作原理掌握用Cactus编写servlet测试3.2.2实验内容与步骤AdminServlet的需求:该Servlet从HTTP请求中提取包括将要执行的命令的需用参数(本例中,是SQL命令)。然后它将使用提取的命令来获取数据。最后,它将控制权转交给JSP页面来显示传过来的数据。把对应于这些行为的方法分别称为:getCommand executeCommand callViewAdminServlet的代码如下:package servlet;import java.io.IOException;import java.util.Collection;import javax.servlet.ServletException;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class AdminServlet public static final String COMMAND_PARAM = command;public String getCommand(HttpServletRequest request)throws ServletException String command = request.getParameter(COMMAND_PARAM);if (command = null) throw new ServletException(Missing parameter + COMMAND_PARAM+ );return command;public void callView(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException request.getRequestDispatcher(/results.jsp).forward(request, response);public Collection executeCommand(String command) throws Exception throw new RuntimeException(not implemented);public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException try Collection results = executeCommand(getCommand(request);request.setAttribute(result, results); catch (Exception e) throw new ServletException(Failed to execute command, e);3.2.3实验要求:利用Cactus对AdminServlet进行单元测试。写出实验的原理也步骤写出实验的相关代码写出实验的结果并分析。3.2.4提示:callView方法和servlet的doGet方法:doGet方法通过调用不同的方法将所有的东西联系在一起。设计这个应用程序的一个方法就是将executeCommand方法的结果存储在HTTP servlet请求中,请求通过 callView方法(经由servlet转发)传给JSP。然后能从请求(可能使用一个useBean标签)中获取数据并将其显示。需要定义executeCommand方法要返回的对象。Apache Commons(/beanutils/)中的BeanUtils包包括一个能暴露公有属性的DynaBean。DynaBean旬一个规范的JavaBean,但是不需要硬编码来获取和设置属性。在一个Java类中,可以全用类似映射存取器的方法来访问dyna-propertics的属性。如:DynaBean employee = .String firstName = (String) employee.get(firstName);employee.set(firstName, Petar);这样就可以得到来自数据库的任何数据。3.3综合实验之三:用Cactus对JSP进行单元测试3.3.1实验目的了解Cactus的工作原理掌握用Cactus编写JSP测试3.3.2实验内容与步骤什么是JSP单元测试 ?u JSP单元测试并不是关于对由编译JSP时所产生的servlet进行单元测试。u JSP已被设计好,即它里面不包含java代码,任何要处理的表示逻辑都被封装在一个javabean或taglib中。u 可以用两种不同的方法来进行单元测试一个jsp:测试jsp本身或是测试jsp标记库。 Jsp单元测试的一般方法 u 可以将jsp从后端孤立出来,方法是通过模拟jsp使用javabean,然后证实返回的页包含了预期的数据。我们将使用Cactus来演示这个测试类。u 因为mock objects只能处理java代码,所以不能用纯mock objects的方法单独的对jsp进行单元测试。u 可以用诸如HttpUnit这样的框架为JSP编写功能测试。然而,这样则意味着必须同应用程序的后端保持完全一致,这有可能会是数据库。u 而使用Cactus和mock objects相结合的方法,就可以不必调用后端而把你的注意力集中在对JSP进行单元测试上了。u 可以对JSP中使用的自定义标记进行单元测试。这需要使用Cactus和mock两种方法。两种方法各有优缺点,一起使用能产生很好的效果。单独使用Cactus对JSP进行单元测试图2 单独使用Cactus对jsp进行单元测试的结构如图。 n 1.在testXXX函数(Cactus从系统的内部调用)中创建在JSP中将要用到的mock objects。JSP通过容器中固有的对象(HttpServletRequest、HttpServletResponse或ServletConfig)或者从taglib中获得动态信息。n 2.在testXXX函数中,执行一个forward命令调用要测试的JSP。JSP执行后获得在1中生成的模拟数据。n 3.Cactus调用endXXX函数,将JSP的输出信息传送给它。这使可以对输出的内容执行断言并验证设置的数据在JSP页面中正确的位置输出。Result.jsp的代码如: Results Page 3.3.3实验要求:利用Cactus对results.jsp进行单元测试。写出实验的原理也步骤写出实验的相关代码写出实验的结果并分析。3.3.4提示:在综合实验之二的基础上:Web.xml添加相关代码 JspRedirector /jspRedirector.jsp JspRedirector /JspRedirector 3.4综合实验之四:用DBUnit对数据库进行单元测试3.4.1实验目的了解DBUnit的工作原理及相关的类与接口掌握用DBUnit对数据库进行测试3.4.2实验内容与步骤 1)DBUnit原理 dbunit的与单元测试相关的两个最重要的核心是org.dbunit.database.IDatabaseConnection 和 org.dbunit.dataset.IDataSet ,前者是产品代码使用的数据库连接的一个简单的封装,后者是对单元测试人员自定义的数据集(通常以xml文件的形式存在,且xml文件的格式也有好几种)的封装。 org.dbunit.operation.DatabaseOperation,该类是一个抽象类代表了对数据库的操作,例如CUD以及其组合等, 它采用了退化的工厂模式,可直接通过它获取其具体的子类(代表具体的某种操作)如下: DatabaseOperation.UPDATE DatabaseOperation.DELETE DatabaseOperation.DELETE_ALL DatabaseOperation.TRUNCATE DatabaseOperation.REFRESH DatabaseOperation.CLEAN_INSERT DatabaseOperation.NONE 2)使用DbUnit进行单元测试的流程根据业务,做好测试用的准备数据和预想结果数据,通常准备成xml格式文件。在setUp()方法里边备份数据库中的关联表。在setUp()方法里边读入准备数据。对测试类的对应测试方法进行实装:执行对象方法,把数据库的实际执行结果和预想结果进行比较。在tearDown()方法里边,把数据库还原到测试前状态 3)使用Dbunit对数据库进行测试。 User.java:public class User private long id;private String username;private String firstName;private String lastName;public long getId() return id;public void setId(long id) this.id = id;public String getUsername() return username;public void setUsername(String username) this.username = username;public String getFirstName() return firstName;public void setFirstName(String firstName) this.firstName = firstName;public String getLastName() return lastName;public void setLastName(String lastName) this.lastName = lastName;UserDao.java:import java.sql.SQLException;public interface UserDao long addUser(User user) throws SQLException;User getUserById(long id) throws SQLException;UserDaoJdbcImpl.java:import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;public class UserDaoJdbcImpl implements UserDao private Connection connection;public void setConnection(Connection connection) this.connection = connection;public Connection getConnection() return connection;public long addUser(User user) throws SQLException connection.setAutoCommit(false);PreparedStatement pstmt = connection.prepareStatement(INSERT INTO users (username, first_name, last_name) VALUES (?,?,?);try pstmt.setString(1, user.getUsername();pstmt.setString(2, user.getFirstName();pstmt.setString(3, user.getLastName();pstmt.executeUpdate();long id = getLastIdentity();mit();return id; finally close(pstmt);connection.setAutoCommit(true);private long getLastIdentity() throws SQLException PreparedStatement pstmt = connection.prepareStatement(CALL IDENTITY();ResultSet rs = null;try rs = pstmt.executeQuery();rs.next();long id = rs.getLong(1);return id; finally close(rs, pstmt);public User getUserById(long id) throws SQLException PreparedStatement pstmt = connection.prepareStatement(SELECT * FROM users WHERE id = ?);ResultSet rs =

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论