实验目的
(1) 根据实际情况,综合应用各种软件测试技术
(2) 熟练掌握MyEclipse+Junit的Java编程和单元测试
实验内容
一、 找出函数中存在的问题。以下题目均在Lab05项目中完成。
1、 请给MySQLConnBean.java中的类和每个方法都加上注释
2、 找出项目中存在的缺陷,并给出解决的方案(至少3个,不包含下面那个举例)。
说明:这里所说的缺陷不一定都是错误,而是明显需要改进的地方。
如:不可以无限输入密码,容易被暴力破解,存在安全隐患。
解决方案:密码输入3次错误,关闭浏览器。最好再加上验证码。
1、
1 package org.easybooks.bookstore.jdbc; 2 import java.sql.*; 3 /* 4 * 作者:张伟 5 * 时间:2016-4-22 6 * 内容:jdbd的数据库连接和出现的问题的修改 7 * */ 8 9 public class MySQLConnBean { 10 private Statement stmt=null; //定义一个 statement对象,等会用来执行SQL语句用的 11 private Connection conn=null; //定义一个变量:等会用来创建数据库连接 12 private ResultSet rs=null; //定义结果集,等会用来存放查询结果 13 public void openConn() throws Exception { 14 /* 15 * 加载mysql的驱动类 16 * 数据库连接加载的账户和密码分别为root和123456 17 * 连接数据库 18 * */ 19 Class.forName("com.mysql.jdbc.Driver"); 20 String url="jdbc:mysql://localhost:3306/test"; 21 String user="root"; 22 String password="123456"; 23 conn=DriverManager.getConnection(url, user, password); 24 public ResultSet execQuery(String sql){ 25 /* 26 * 1、需要传入一个 conn 连接做参数,然后用这个conn连接创建statement对象, 27 调用该方法即可拿到一个statement对象来使用,并获得结果。 28 * 2、如果出错,抛出异常,显示出错的时间点和出错信息 29 * */ 30 rs=null; 31 try{ 32 stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY); 33 rs=stmt.executeQuery(sql); 34 }catch (SQLException e) { 35 System.err.println("Data.executeQuery:"+e.getMessage()); 36 } 37 38 return rs; //返回rs 39 } 40 41 public void closeStmt(){ 42 /* 43 * 执行完所有操作后,调用closeStmt()方法来关闭数据库连接 44 * 如果出错,抛出异常,显示出错的时间点和出错信息 45 * */ 46 try{ 47 stmt.close(); 48 }catch(SQLException e){ 49 System.err.println("Data.executeQuery:"+e.getMessage()); 50 } 51 } 52 53 public void closeConn(){ 54 /* 55 * 执行完所有操作后,调用closeConn()方法来关闭数据库连接 56 * 如果出错,抛出异常,显示出错的时间点和出错信息 57 * */ 58 try{ 59 conn.close(); 60 }catch(SQLException e){ 61 System.err.println("Data.executeQuery:"+e.getMessage()); 62 } 63 } 64 }
2、
缺陷1:openConn()方法,当不存在test数据库,或者用户名密码不正确时,将发生异常
解决方案:应对openConn()方法添加try…catch捕获错误,并对错误进行处理。
缺陷2:即便为openConn()方法添加了try….catch,在validate.jsp页面依然会出错,原因是数据库未连接,那么ResultSet rs=MySqlBean.execQuery(strSql); 根本无法执行。
解决方案一:在validate.jsp中添加try…catch;
解决方案二:将openConn()方法的返回值改为boolean型,连接成功返回true,否则返回false。在validate.jsp判断连接成功再执行后面的操作
解决方案三:通过设置错误处理页面来处理
方法有很多,大家可以思考更简便更有效的方法进行处理。
缺陷3:密码未加密,存在安全隐患
解决方案:采用非加密算法对密码进行加密(如:MD5加密),再存入数据库。登录时采用同样的算法进行解密。
缺陷4:不登录,一样也可以进入welcome.jsp页,访问网站内容
解决方案:对于只有登录用户才能访问的页,要判断session,或者用拦截器、过滤器
详细做法参考http://blog.csdn.net/lidawei201/article/details/8513853
缺陷5:用户登录容易被暴力破解
解决方案:设置验证码
二、 请按要求对下面的Java代码进行测试。代码的功能是:用折半查找法在元素呈升序排列的数组中查找值为key的元素。
(1)要求采用基本路径法给出程序控制流图;
(2)算出环路复杂性
(3)给出所有的独立路径,以及对应的测试用例和预期结果
(1) 程序控制流图如下:
(2)有以下三种方法:
1、通过控制流图的边数和节点数计算。设E为控制流图的边数,N为控制流图的节点数,则定义环路复杂性为 V(G)= E – N + 2 ;
V(G)=E-N+2=16-14+2 = 4
2、通过控制流图中判定节点数计算。
若设P为控制流图中的判定节点数,则有V(G) = P + 1
V(G)=P+1=3+1=4
3将环路复杂性定义为控制流图中的区域数。该控制流图中有4个区域:R1、R2、R3、R4,因此其环路复杂性为4。
(3)独立路径
PATH1:1-2-3-4-5-6-8-10-11-12-4-13-14
PATH2:1-2-3-4-5-6-8-9-12-4-13-14
PATH3:1-2-3-4-5-6-7-12-4-13-14
PATH4:1-2-3-4-13-14
用例编号 | 路径 | 测试用例 | 预期结果 |
1 | PATH1 | Arry[4]={2,4,6,8} key=2 | 0 |
2 | PATH2 | Arry[6]={2,3,6,8,13,15} key=15 | 5 |
3 | PATH3 | Arry[4]={1,2,3,4} key=2 | 1 |
4 | PATH4 | Arry[3]={1,2,3} key=4 | -1 |