system: [SYSTEM]

user: 4. 测试用例生成技术改进研究 基于业务逻辑生成测试用例，可根据业务逻辑总结数据流分支，其中数据流技术作为一种白盒测试技术，能提供充分的代码覆盖，对应的树形结构图可以清晰地描述系统整体结构和业务逻辑关系，通过深度优先搜索算法可遍历到每个分支，保证生成的测试数据可充分覆盖测试需求。论文中提出了一种测试用例生成的系统模型，对深度优先搜索算法具体的算法思想进行介绍，并根据具体的业务流程设计测试用例。再通过系统中某实例软件，验证系统模型的可行性。 4.1. 控制流构造方法技术分析 控制流是控制程序逻辑执行的先后顺序，控制流实际上是数据流融入控制层之后形成的逻辑处理和程序跳转的结果，它所控制的对象是数据，数据在逻辑处理过程中的形式和状态的变化，控制层的核心职责是处理业务逻辑，只有对业务逻辑的处理是我们在控制层所关心的核心内容，而除此之外的代码，则应该通过合理的设计，转化为一个标准而规范的事件处理流程。 控制流由对应的控制流图(Control Flow Graph， CFG)也叫控制流程图来体现，这是一个过程或程序的抽象表现，代表了一个程序执行过程中会遍历到的所有路径。它用图的形式表示一个过程内所有基本块执行的可能流向，也能反映一个过程的实时执行过程。其中控制流生成方法如下所示： 1) 划分事件处理流程步骤； 2) 定义事件处理节点对象； 3) 组织事件处理节点对象的执行次序。 下面以某设备软件为例，完成实际业务控制流图的设计，模块功能描述为：设备管理软件向用户提供数据采集转发功能、获取各类设备状态信息、获取时间和定位信息并同步设备等。其对应控制流图如图1所示： 图1. 某软件某功能模块控制流程图 4.2. 数据流的构造方法技术分析 数据流是一组有序、有起点和终点的字节的数据序列，是一串连续不断的数据的集合，包括输入流和输出流。数据流由对应的数据流图(Data Flow Diagram，简称DFD)体现，它从数据传递和加工角度，以图形方式来表达系统的逻辑功能、数据在系统内部的逻辑流向和逻辑变换过程，是结构化系统分析方法的主要表达工具及用于表示软件模型的一种图示方法 [ 4 ]。它是一种便于用户理解和分析系统数据流程的图形工具，他摆脱了系统和具体内容，精确的在逻辑上描述系统的功能、输入、输出和数据存储等，是系统逻辑模型的重要组成部分。 数据流图从数据传递和加工的角度，把一个系统看成一个整体功能，明确信息的输入与输出，以图形的方式刻画数据流从输入到输出的移动变换过程。其中数据流图包含四个元素：外部实体、处理过程、数据流、数据存储，其模型如图2所示。 图2. 数据流图模型 结合系统业务逻辑，由上到下，先分析顶层数据流图，再将整体划分为多个独立且互通的模块，再由系统控制流图作为辅助，分别描述顶层互通模块和各个子模块相关数据流图，其生成方法如下所示： 1) 确定系统软件的应用实体； 2) 分析实体间业务交互数据； 3) 解析实体输入输出，确定各个实体的出度和入度； 4) 根据数据处理过程确定数据流向，每个处理至少有一个输入数据流和一个输出数据流，反映此处理数据的来源与加工的结果； 5) 根据存储数据和分支流向，确定相关约束条件。 面以某软件某功能模块为例，根据上节业务控制流图完成数据流图的设计，如图3所示。 4.3. 树形结构图的构造方法研究 树形结构图是n个节点的集合，且可清晰明了的表明节点间的层次关系和数据分支，根据数据流向可递归遍历所有节点，树形结构图生成方法如下所示： 1) 确定节点个数并根据先后顺序确定层次关系； 2) 确定每个节点的出度和入度数； 3) 根据数据流确定节点分支； 下面以某软件为例，根据上节业务数据流图完成树形结构图的设计，如图4所示： 图3. 某软件某功能模块数据流图 图4. 某软件某功能模块树形结构图 4.4. 改进的深度优先搜索算法研究 深度优先搜索(DFS)属于图算法的一种，其过程简要来说是对每一个可能的分支路径深入到不能再深入为止，而且每个节点只能访问一次，但传统的深度优先搜索算法在覆盖数据分支时存在漏洞，若某个节点入度数大于1时就会丢失相应的路径用例，不能完全覆盖测试需求。现结合实际应用对深度优先搜索算法进行改进，对每个节点增加加权参数i，这样就避免节点存在多条路径时而丢失其他节点到该节点的路径覆盖数据，以便可以遍历到所有数据分支，覆盖所有业务需求。则改进的深度优先搜索算法(PDFS)递归调用包含以下操作： 1) 访问搜索到的未被访问的邻接点且记录其入度数； 2) 将此顶点标记为已访问节点且入度数减1； 3) 搜索该顶点的未被访问的邻接点，若该邻接点存在，则从此邻接点开始进行同样的访问和搜索。 PDFS详细的遍历策略如下描述： 从一个顶点v出发，首先将v标记为已遍历的顶点且记录其入度数为0，然后选择一个邻接于v的尚未遍历的顶点u且记录其入度数，如果u不存在，本次搜索终止；如果u存在，那么从u又开始一次PDFS遍历且入度数减1。如此循环直到不存在未被遍历的顶点且所有节点入度数均为0。以图5为例描述PDFC搜索过程。 图5. PDFC示例图 1) 从顶点0开始，将0标记为已遍历且记录入度数i0为0，然后选择未被遍历的邻接0的顶点1，记录i1为1； 2) 标记顶点1，执行i1减1操作，i1为0，然后选择3且记录i3为1，标记3并执行i3减1操作，i3为0，然后选择顶点3邻接的顶点2，记录i2为2； 3) 顶点2标记后i2为1，没有与它邻接的未标记的点，所以返回3选择另一个邻接3并且未被标记的顶点4，记录i4为1； 4) 标记4且i4为0，顶点4没有更多的符合条件的点，因此搜索终止，返回到3，3没有更多的点，搜索终止返回到1，最后返回到0，顶点0仍有入度数不为0的点，选择邻接点2，执行i2减1操作，i2为0，没有与它邻接的未标记的点，再次返回到0，搜索终止。 4.5. 根据改进的深度优先搜索算法分析测试用例 由上图PDFS模型图还原为传统的深度优先搜索算法，即去除各个分支的加权值，根据未改进的算法进行遍历，得到相应的测试用例集，记为U{0→1， 1→3， 3→2， 3→4}。再根据上图PDFS模型图和遍历策略得到相应的测试用例集，记为U'{0→1， 1→3， 3→2， 3→4， 0→2}，通过比对可发现，由传统深度优先搜索算法得到的用例集会比优化算法得到的用例集要少，即{0→2}，这就会造成测试用例的丢失，功能项覆盖不全面，通过优化改进的深度优先搜索算法可避免该现象。 下面以某装备软件的某功能模块为例，得到相应的测试用例集。将功能模块树形图转化为简易的加权树形结构图(简化后的部分功能项)，如图6所示。 图6. 某软件某功能模块简易加权树形结构图 根据传统的DFS得到所有的用例集如下所示： {1→2：采集北斗数据； 2→4：采集数据异常(含多种采集异常情况，可重复执行)； 2→5：采集数据正常； 5→8：验证数据正确性； 8→10：采集数据无效(构造错误数据，可重复执行)； 10→12：设备处理采集的无效数据； 8→11：采集数据有效； 1→3：获取天文时间； 3→6：时间信息异常(含多种信息异常情况，可重复执行)； 3→7：时间信息正常； 7→9：转发时统信息。 } 根据优化改进的PDFS算法得到所有的用例集如下所示： 由树形结构图可知i1值为0，i2~i11值均为1，i12值为3； 用例集U为 {1→2：采集北斗数据，i2=0； 2→4：采集数据异常(含多种采集异常情况，可重复执行)，i4=0； 2→5：采集数据正常，i5=0； 5→8：验证数据正确性，i8=0； 8→10：采集数据无效(构造错误数据，可重复执行)，i10=0； 10→12：设备处理采集的无效数据，i12=3； 8→11：采集数据有效，i11=0； 11→12：设备处理采集的有效数据，i12=2； 1→3：获取天文时间，i3=0； 3→6：时间信息异常(含多种信息异常情况，可重复执行)，i6=0； 3→7：时间信息正常，i7=0； 7→9：转发时统信息，i9=0； 9→12：设备执行时间同步，i12=1。 } 由此可看出优化的PDFS比传统的DFS设计测试用例更全面，覆盖测试项更充分。