Risk_strategy(策略表)中是记录所有的累计策略,其中五个关键字段为main_type, conditions, interval, type,_event,还有一个字段是时长,其中interval字段允许为空,其它均不能为空。
Risk_key(策略KEY)中是记录所有的KEY,根据五个关键字段为main_type, conditions, interval, type,event来生成一个索引ID。其中interval字段允许为空,其它均不能为空。
背景介绍,新增策略时,根据上述五个关键字来生成一个新的KEY。如果两个累计策略,上述五个关键字相同,但是时长不同,此时会共用相同的KEY。
策略删除一条记录时,会根据上述五个关键字去搜索策略表,搜索到占用时就不允许删除,而搜索不到时才允许删除。
删除时查找索引ID的SQL如下:
SQL-1:
select ID,STRATEGY_NAME,_MAIN_TYPE,_CYCLE,_CONDITIONS,_EVENT,
_INTERVAL,_TYPE,_DESCRIPTION,
_MEMO,_STATUS,GMT_CREATE,GMT_MODIFY,OPERATOR_ID,MODIFY_OPERATOR
fromrisk__strategy t1 where t1._STATUS = 'U'
andt1.MAIN_TYPE = #MainType#
andt1.CONDITIONS = #Conditions#
andt1.EVENT = #Event#
andt1.TYPE like CONCAT('%',#Type#,'%')
<dynamic prepend="and">
<isNotNullprepend="and" property="Interval">
t1.INTERVAL= #Interval#
</isNotNull>
</dynamic>
SQL-2:
select ID,STRATEGY_NAME,_MAIN_TYPE,_CYCLE,_CONDITIONS,_EVENT,
_INTERVAL,_TYPE,_DESCRIPTION,
_MEMO,_STATUS,GMT_CREATE,GMT_MODIFY,OPERATOR_ID,MODIFY_OPERATOR
fromrisk_strategy t1 where t1._STATUS = 'U'
andt1.MAIN_TYPE = #MainType#
andt1.CONDITIONS = #Conditions#
andt1.EVENT = #Event#
andt1.TYPE like CONCAT('%',#Type#,'%')
and t1.INTERVAL = #Interval#
SQL-3:
select ID,STRATEGY_NAME,_MAIN_TYPE,_CYCLE,_CONDITIONS,_EVENT,
_INTERVAL,_TYPE,_DESCRIPTION,
_MEMO,_STATUS,GMT_CREATE,GMT_MODIFY,OPERATOR_ID,MODIFY_OPERATOR
fromrisk_strategy t1 where t1.STATUS = 'U'
andt1.MAIN_TYPE = #MainType#
andt1.CONDITIONS = #Conditions#
andt1.EVENT = #Event#
andt1.TYPE like CONCAT('%',#Type#,'%')
<dynamic prepend="and">
<isNotNullprepend="and" property="Interval">
t1.INTERVAL= #Interval#
</isNotNull>
<isNull prepend="and" property="Interval">
t1.INTERVAL IS NULL
</isNull>
</dynamic>
在risk_strategy(策略表)中,有两条策略,策略A与策略B相同,唯一不同的是_interval字段,表示时间段。A策略此处为空,B策略此处为15:00-20:00。
risk__strategy表中记录如下:
策略A:main_type = 11,conditions = 22,_type = 33, event=44,interval 为空,时长为2天。
策略B:main_type = 11,conditions = 22,type = 33, event=44,interval=15:00-20:00,时长为3天。
策略C:main_type = 11, conditions = 22, type = 33, event=44,interval 为空,时长为15天。
在risk_key(策略索引ID表)中,有两条索引ID,暂定义为索引A与索引B。
索引A:main_type = 11, conditions = 22, type = 33, event=44,interval 为空。
索引B:main_type = 11, conditions = 22, type = 33, event=44,interval=15:00-20:00。
其中策略A与策略C同时占用索引A,而策略B占用索引B。
那么请问先删除A与先删除B会有什么结果不同吗?
在SQL-1的情况下,先删除策略A,会去查询索引A有没有被占用,根据SQL-1的结果,自动生成的SQL如下:
select * from risk__strategy t1
where t1.STATUS = 'U'
and t1.MAIN_TYPE = 11
and t1.CONDITIONS = 22
and t1.EVENT = 44
and t1.TYPE like CONCAT('%',33,'%')
因为INTERVAL字段为空,所以
and t1.INTERVAL = 15:00-20:00
此句SQL未被包含进去。查询出来的结果是策略B也在占用,导致未被使用的索引A未被删除。
实际上索引A应该被删除。
如果先删除策略B,则索引B会被删除掉,然后再删除策略A,索引A被删除,功能正常。就发现不了上述问题。
在SQL-2的情况下,先删除策略A,根据SQL-2的结果,自动生成的SQL如下:
select * from risk_strategy t1
where t1.STATUS = 'U'
and t1.MAIN_TYPE = 11
and t1.CONDITIONS = 22
and t1.EVENT = 44
and t1.TYPE like CONCAT('%',33,'%')
and t1.INTERVAL = null
删除索引A时,根据上述SQL去查询,由于t1.INTERVAL = null永远为假,因此查询出来的结果为始终没有累计策略占用,但是此时另外有一个策略C占用,没有查询不出来。导致不管有没有占用,都会直接被删除。
如果先删除策略B,那么会直接把索引B删除,再删除策略A时,那么会把索引A删除掉,那么就不会发现这个问题。另外如果此时再删除策略C,那么也能发现这个问题。
SQL-3为修复后正确的SQL!
上述的问题跟测试用例执行的顺序是有关系的,只有在特定的顺序下才能发现,是偶然的BUG或者几率性的BUG吗?
没有偶然的或者几率性的BUG,只是我们没有真正找到他们的规律,这个是个漫长的过程,加油,慢慢寻找BUG的本源。
这个BUG算是一个提醒,希望从现在开始,关注到SQL这层。
分享到:
相关推荐
4. 优先级:根据业务重要性和风险评估,确定测试用例的执行顺序。 5. 独立性:每个测试用例应独立于其他用例,避免相互影响。 创建有效的测试用例通常包括以下步骤: 1. 分析需求:理解软件的功能需求,确定需要...
测试用例排序是指根据特定的目标或标准,调整测试用例集合中各个测试用例的执行顺序,使得优先级较高的测试用例在测试流程中得到优先执行。这种方法旨在减少回归测试的整体成本,同时提高缺陷检测的速度和准确性。...
6. **测试数据的创建**:测试数据是测试用例执行的基础,应确保其真实性和完整性。设计和创建合适的测试数据可以更好地模拟实际环境,提升测试效果。 7. **用例关联性的描述**:对于有依赖关系的测试用例,需要明确...
- **优先级**:测试用例的重要程度,用于决定测试顺序。 - **状态**:测试用例的状态,如新建、待执行、通过、失败等。 2. **详细测试用例.doc**:这份Word文档可能包含了一个或多个具体测试用例的详细描述,每个...
10. 优先级和状态:表示测试用例的执行顺序和当前状态(如未执行、执行中、已通过、已失败)。 三、Excel模式的测试用例管理 1. 表格结构:利用Excel的行列布局,清晰地展示测试用例的各个要素。 2. 条目排序:...
8. **优先级**:根据功能的重要性或影响范围,确定测试用例的执行顺序。 9. **关联需求**:与测试用例相关的功能需求或用户故事编号。 使用Excel模板来管理测试用例有以下优势: - **结构化数据**:Excel提供了表格...
首先,测试用例是一个详细的文档,定义了在特定条件下对软件执行的操作及其预期结果。其目的是验证软件的某个功能或特性是否按预期工作。测试用例通常包括以下部分: 1. **ID**:每个测试用例都有一个唯一的标识符...
11. **步骤**:列出执行测试用例的具体操作,顺序清晰,便于执行。 12. **输入数据**:测试过程中需要用到的数据,可以是静态的预设值或动态生成的。 13. **预期结果**:根据功能需求,预测执行步骤后应得到的结果...
在“商品类别修改测试用例缺陷报告”中,我们关注的是商品分类系统的修改功能,特别是涉及到用户选择商品类别的操作。这份报告详细记录了一个具体的缺陷,即“全选”功能无法正常工作。 缺陷ID1是一个关键问题,...
8. **优先级**和**严重性**:分别表示测试用例的重要性和缺陷的严重程度。 9. **关联的用户故事**或**需求编号**:将测试用例与业务需求或用户需求关联起来。 10. **测试数据**:可能涉及的输入数据和预设条件。 ...
它是一个图形表示形式,用于描绘程序中各个语句的执行顺序以及条件判断的影响。在提供的代码中,程序用于计算给定年份和月份的天数。控制流图展示了程序中的不同路径,包括条件判断和循环结构。例如,当`month == 2`...
数据库在测试用例管理中起着关键作用,因为它能够存储大量的测试信息,如用例细节、执行状态、缺陷记录等,并能快速查询和分析这些数据,为决策提供依据。 标签中的“测试”指的是整个软件质量保证的过程,这包括...
4. **步骤**:详细的操作顺序,描述如何执行测试。 5. **预期结果**:在成功执行测试用例后,系统应呈现的结果。 6. **实际结果**:测试执行的实际输出,与预期结果对比以判断是否通过。 7. **测试优先级**:根据其...
- 测试步骤:按顺序列出的执行步骤,详细描述操作过程。 - 预期结果:测试后应达到的预期状态或输出。 - 实际结果:实际执行时获取的结果,用于与预期结果对比。 - 结果判定:通过/失败,或者需要进一步调查的情况。...
3. **测试步骤**:详述执行测试的具体操作,按顺序列出。 4. **预期结果**:清晰定义测试执行后的预期输出,作为判断测试是否通过的依据。 5. **实际结果**:记录测试执行的实际输出,用于比较与预期结果的差异。 6....
2. **优先级**:根据业务重要性和缺陷影响程度,确定测试用例的执行顺序。 3. **预条件**:执行测试前需要满足的环境或状态,例如系统配置、数据准备等。 4. **步骤**:详细列出执行测试的每一步操作,应简洁明了,...
系统功能测试用例是软件测试过程中的核心环节,它详细定义了系统必须执行的各种操作以及期望的结果,确保软件...通过深入分析和执行这些测试用例,我们可以发现潜在的缺陷,提前修复问题,提升软件产品的用户满意度。