《软件测试》实验 实验五 测试技术

实验目的 (1) 根据实际情况,综合应用各种软件测试技术(2) 熟练掌握MyEclipse+Junit的Java编程和单元测试 实验内容 一、 找出函数中存在

实验目的

(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