最近总在无意间发现出重大BUG,而根据测试用例却只能发现比较容易发现的BUG。
昨天测试权限管理系统,在资源管理页面,其他的资源都可以建二级菜单,而唯独有一个资源不能建二级菜单。看tomcat的日志发现有一个错误是:
Preparing: select RBAC_RESOURCE_ID, RBAC_SYSTEM_ID, PARENT_RESOURCE_ID, RESOURCE_CODE, RESOURCE_NAME_LOCAL,RESOURCE_NAME_EN,RESOURCE_TYPE, (select RESOURCE_NAME_LOCAL from RBAC_RESOURCE where RBAC_RESOURCE_ID=?) as PARENT_RESOURCE_NAME_LOCAL, (select RESOURCE_NAME_EN from RBAC_RESOURCE where RBAC_RESOURCE_ID=?) as PARENT_RESOURCE_NAME_EN, (select RESOURCE_NAME_LOCAL from RBAC_RESOURCE where RBAC_RESOURCE_ID=(select PARENT_RESOURCE_ID from RBAC_RESOURCE where RBAC_RESOURCE_ID=?))as E_PARENT_RESOURCE_NAME_LOCAL, (select RESOURCE_NAME_EN from RBAC_RESOURCE where RBAC_RESOURCE_ID=(select PARENT_RESOURCE_ID from RBAC_RESOURCE where RBAC_RESOURCE_ID=?))as E_PARENT_RESOURCE_NAME_EN, (select NAME_LOCAL from RBAC_DICT_VALUE where VALUE_CODE=(select HTTP_METHOD from RBAC_RESOURCE where RBAC_RESOURCE_ID=?))as HTTP_METHOD, RESOURCE_URI, HTTP_METHOD, WEIGHT, DESCRIPTION, IS_DELETE, CREATE_USER, CREATE_DATE, UPDATE_USER, UPDATE_DATE from RBAC_RESOURCE where RBAC_RESOURCE_ID = ?
2012-08-31 11:23:43,231 [http-8088-6] DEBUG [java.sql.PreparedStatement] - ==> Parameters: d97faf137c6443628f5d6ca598ee5667(String), d97faf137c6443628f5d6ca598ee5667(String), d97faf137c6443628f5d6ca598ee5667(String), d97faf137c6443628f5d6ca598ee5667(String), d97faf137c6443628f5d6ca598ee5667(String), d97faf137c6443628f5d6ca598ee5667(String)
2012-08-31 11:23:43,238 [http-8088-6] ERROR [error.jsp] -
### Error querying database. Cause: java.sql.SQLException: ORA-01427: 单行子查询返回多个行
意思是这个SQL语句本来该返回一个表中的一行数据的,结果返回了两行数据。
我将这个SQL语句复制到oracle的客户端,发现在查找select NAME_LOCAL
from RBAC_DICT_VALUE
where VALUE_CODE = (select HTTP_METHOD
from RBAC_RESOURCE
where RBAC_RESOURCE_ID = 'd97faf137c6443628f5d6ca598ee5667')表时,返回了两行数据。
rbac_dict_value中有两条数据字典23和字典1的code相同。而字典23的is_delete值为1,已被删除。所以应在sql语句后加上IS_DELETE='0',将已删除的数据过滤掉。
前不久,看过一篇文章,说做黑盒测试久了,智商会变低。难道那些做开发的,就会越来越聪明吗?