非确定性有限状态机指定的确定性实现的自适应测试
1. 状态可达性与前导序列
初始状态可通过空输入序列确定性地到达,其前导序列是一个平凡的有限状态机(FSM)。所有状态都是肯定可达的,集合 $K$ 包含了所有状态。所有状态的覆盖是所获得前导序列的所有完整轨迹的并集,即 $U_K = {ε, a_1, a_0c_1b_1, c_0, c_1a_1, c_1, c_0c_1}$。
2. 状态分离器
-
r - 兼容性与交集
:给定一个完整 FSM 的两个状态 $s_1$ 和 $s_2$,若它们是 r - 兼容的,则存在某个完整 FSM 的一个状态,它是这两个状态的约简。这个状态是在不同初始状态下给定机器的两个实例的交集(自积)的初始状态,因为交集表示两个状态的所有公共轨迹。反之,若两个状态是 r - 可区分的,则交集不是一个完整的 FSM。
- 命题 2 :对于完整 FSM $S = (S, s_0, I, O, h_S)$ 的两个状态 $s_1$ 和 $s_2$ 以及交集 $S/s_1 ∩ S/s_2 = (Q, s_1s_2, I, O, h_{S/s_1∩S/s_2})$,状态 $s_1$ 和 $s_2$ 是 r - 兼容的,当且仅当交集有一个完整的子机。
- 推论 1 :状态 $s_1$ 和 $s_2$ 是 r - 可区分的,当且仅当交集没有完整的子机,即每个子机在某些状态下有未定义的输入。
- 规范分离器 :给定 FSM $S$ 的 r - 可区分状态 $s_1$ 和 $s_2$ 以及交集 $S/s_1 ∩ S/s_2$,一个 FSM $P = (P, s_1s_2, I, O, h_P)$,其中 $P = Q ∪ {s_1, s_2}$ 且 $h_P = h_{S/s_1∩S/s_2} ∪ {(ss′, i, o, s_1) | ss′ ∈ Q, o ∈ out(s, i) \ out(s′, i)} ∪ {(ss′, i, o, s_2) | ss′ ∈ Q, o ∈ out(s′, i) \ out(s, i)}$,是状态 $s_1$ 和 $s_2$ 的规范分离器。规范分离器包含了所有分离 r - 可区分状态的轨迹。
- 分离器 :给定 FSM $S$ 的 r - 可区分状态 $s_1$ 和 $s_2$,规范分离器的单输入无环子机,其中唯一的死锁状态是 $s_1$ 和 $s_2$,并且对于子机中某个状态定义的每个输入,该状态具有规范分离器中以此输入标记的所有输出转换,称为状态 $s_1$ 和 $s_2$ 的分离器,记为 $R(s_1, s_2)$。
| 概念 | 定义 |
|---|---|
| 规范分离器 | 由交集扩展而来,包含两个指定的死锁状态 $s_1$ 和 $s_2$,其完整轨迹可区分 $S$ 的两个可能初始状态 |
| 分离器 | 规范分离器的单输入无环子机,唯一死锁状态为 $s_1$ 和 $s_2$ |
mermaid 流程图如下:
graph TD;
A[开始] --> B{状态 r - 兼容性};
B -- r - 兼容 --> C[交集有完整子机];
B -- r - 可区分 --> D[交集无完整子机];
D --> E[构造规范分离器];
E --> F[确定分离器];
3. 遍历集
遍历集的构造基于特定方法,基本思想是计算轨迹遍历的规范 FSM 的状态,并在任何最多有 $m$ 个状态的符合实现 FSM 中轨迹变为循环时终止轨迹。与之前方法的改进在于使用肯定可达状态而非确定性可达状态,从而缩短了遍历集。
-
偏序定义
:给定规范 FSM $S$、所有肯定可达状态集合 $K$ 的覆盖 $U_K$、状态 $s, s′ ∈ K$、前导序列 $P_s$ 和非空轨迹 $β ∈ Tr_S(s)$,在集合 $T(P_s)Pr(β) ∪ U_K$ 上定义偏序 $≤
{s′}$。
- 对于 $ω, ω′ ∈ αPr(β), α ∈ T(P_s)$,若 $|ω| < |ω′|$ 且 $S - after - ω ≤ S - after - ω′ ≤ s′$,则 $ω ≤
{s′} ω′$。
- 对于 $ω ∈ U_K, ω′ ∈ T(P_s)Pr(β)$,若 $ω ≠ ω′$ 且 $S - after - ω ≤ S - after - ω′ ≤ s′$,则 $ω ≤
{s′} ω′$。
-
遍历轨迹
:对于状态 $s ∈ K$,轨迹 $β ∈ Tr_S(s)$ 是前导序列 $P_s$ 的遍历轨迹,当且仅当对于某个集合 $R ∈ R_S$($R_S$ 表示 $S$ 的所有成对 r - 可区分状态的最大集合),有 $\sum
{s′∈R}|C(T(P_s)Pr(β), U_K, s′)| = m + 1$。每个遍历轨迹 $β$ 对应一个集合 $R_β$。
-
遍历集
:前导序列 $P_s$ 的所有可能遍历轨迹的集合是遍历集 $N(U_K, P_s)$。
以一个示例来说明,假设任何实现机器最多有 4 个状态($m = 4$),规范 FSM 的所有状态都是成对 r - 可区分的,$R_S = {{1, 2, 3, 4}}$。对于状态 1,前导序列 $P_1$ 的完整轨迹集仅包含空字 $ε$。通过逐步增加轨迹长度,确定了状态 1 的遍历集 $N(U_K, P_1) = {a_0, a_1, b_0, c_0, c_1}$。同样地,计算出其他前导序列的遍历集:$N(U_K, P_2) = {a_0, b_1, c_1}$,$N(U_K, P_3) = {a_0, a_1, b_0, c_1}$,$N(U_K, P_4) = {a_1, b_1, c_1}$。
4. FSM 测试
- 测试定义 :一个无环输出完整的 FSM $U = (U ∪ {pass, fail}, u_0, I, O, h_U)$,其中 $pass$ 和 $fail$ 是指定的死锁状态,若 $(u, i, o, fail) ∈ h_U$ 意味着对于某个 $o′ ≠ o$ 和 $β ∈ Tr_U(u - after - io′)$,有 $u - after - io′β = pass$,则它是一个测试。
- 失败轨迹和通过轨迹 :将测试 $U$ 从初始状态带到失败状态的轨迹称为失败轨迹,记为 $Tr_U^{fail}$;通过轨迹定义为 $Tr_U^{pass} = Tr_U^v \ Tr_U^{fail}$。
-
测试性质
:
- 若实现 FSM $B$ 与规范 FSM $S$ 的交集 $B ∩ U$ 中没有测试 $U$ 处于失败状态的状态,则 $B$ 通过测试 $U$。若任何是 $S$ 约简的 $B ∈ ℑ(S)$ 都通过测试 $U$,则测试 $U$ 对于 $S$ 在 $ℑ(S)$ 中关于约简关系是可靠的。
- 若交集 $B ∩ U$ 中有测试 $U$ 处于失败状态的状态,则 $B$ 未通过测试 $U$。若任何不是 $S$ 约简的 $B ∈ ℑ(S)$ 都未通过测试 $U$,则测试 $U$ 对于 $S$ 在 $ℑ(S)$ 中关于约简关系是详尽的。
- 若测试 $U$ 在 $ℑ(S)$ 中关于约简关系既可靠又详尽,则它是完整的。集合 $ℑ_m(S)$ 包含所有最多有 $m$ 个状态的完整确定性 FSM,一个测试若在故障域 $ℑ_m(S)$ 中是完整的,则称为 $m$ - 完整测试。
| 测试性质 | 定义 |
|---|---|
| 可靠 | 所有是 $S$ 约简的实现通过测试 |
| 详尽 | 所有不是 $S$ 约简的实现未通过测试 |
| 完整 | 既可靠又详尽 |
mermaid 流程图如下:
graph TD;
A[开始] --> B[执行测试];
B --> C{是否通过测试};
C -- 通过 --> D[测试可靠];
C -- 未通过 --> E[测试详尽];
D & E --> F{是否既可靠又详尽};
F -- 是 --> G[测试完整];
非确定性有限状态机指定的确定性实现的自适应测试
5. 自适应测试算法
提出了一种用于对最多有 $m$ 个状态的完整确定性实现 FSM $B$ 进行自适应测试的算法。该算法会在 $B$ 是给定规范 FSM $S$ 的约简时给出“通过”判决,否则给出“失败”判决。
算法 2:确定性实现 FSM 的自适应测试
-
输入
:完整 FSM $S$、肯定可达状态集合 $K$、对于每个 $s ∈ K$ 的集合 $Id(s, S)$ 和前导序列 $P_s$、遍历集 $N(U_K, P_s)$、对于每个 $s′ ∈ R_β$ 和 $β ∈ N(U_K, P_s)$ 的集合 $Id(s′, R_β)$,以及表现为确定性 FSM $B$ 的实现(黑盒)。
-
输出
:若 $B$ 是 $S$ 的约简则输出“通过”判决,否则输出“失败”判决,以及包含 $B$ 所有观察轨迹的 FSM $G_B$。
操作步骤如下:
1. 初始化两个轨迹集合 $T_{pass}$ 和 $T_{fail}$ 为空集。
2.
执行分离器
:
- 当集合 $Id(s, S)$ 中存在未执行的分离器 $R(s, s′)$(对于某个 $s ∈ K$)时:
- 应用复位操作。
- 执行前导序列 $P_s$,直到观察到的轨迹不在 $P_s$ 中或到达前导序列的指定状态 $s$,设观察到的轨迹为 $α$。
- 若轨迹 $α$ 不在 $P_s$ 中,将 $α$ 添加到集合 $T_{fail}$ 并以“失败”判决终止。
- 否则,设 $P_s$ 的观察完整轨迹为 $α_s$,将轨迹 $α_s$ 添加到 $T_{pass}$。
- 标记 $Id(s, S)$ 中与 $R(s, s′)$ 到状态 $s$ 具有相同轨迹集的所有分离器为“已执行”,并执行分离器 $R(s, s′)$,设观察到的轨迹为 $β$。
- 若未到达分离器的指定状态 $s$,将轨迹 $α_sβ$ 添加到 $T_{fail}$ 并以“失败”判决终止。
- 否则,将轨迹 $α_sβ$ 添加到 $T_{pass}$。
3.
执行遍历集
:
- 当存在未探索的状态 $s ∈ K$ 时:
- 当遍历集 $N(U_K, P_s)$ 中存在未执行的轨迹时,设 $γ$ 为最长未执行遍历轨迹的输入投影。
- 应用复位操作。
- 执行前导序列 $P_s$(并观察 $P_s$ 的完整轨迹 $α_s$)。
- 逐个应用 $γ$ 的输入,直到观察到的轨迹不在 $Tr(S/s)$ 中或该轨迹在 $N(U_K, P_s)$ 中,设观察到的轨迹为 $β$,其输入投影为 $ν$。
- 若轨迹 $β ∉ Tr(S/s)$,将轨迹 $α_sβ$ 添加到 $T_{fail}$ 并以“失败”判决终止。
- 否则(即 $β ∈ N(U_K, P_s)$),标记 $N(U_K, P_s)$ 中输入投影具有前缀 $ν$ 的每个轨迹为“已执行”。
- 当对于 $β$ 的某个前缀 $σ$ 使得 $α_sσ ∈ C(T(P_s)Pr(β), U_K, s′)$($s′ ∈ R_β$),集合 $Id(s′, R_β)$ 中存在未执行的分离器 $R(s′, s′′)$ 时:
- 应用复位操作。
- 执行前导序列 $P_s$(并观察 $P_s$ 的完整轨迹 $α_s$)。
- 应用 $σ$ 的输入投影,设观察到的轨迹为 $η$。
- 将观察到的轨迹 $α_sη$ 添加到 $T_{pass}$。
- 标记 $Id(s′, R_β)$ 中与未执行的分离器 $R(s′, s′′)$ 到指定状态 $s′$ 具有相同轨迹集的所有分离器为“已执行”,并执行该分离器,设观察到的轨迹为 $κ$。
- 若未到达分离器的指定状态 $s′$,将轨迹 $α_sηκ$ 添加到 $T_{fail}$ 并以“失败”判决终止。
- 否则,将轨迹 $α_sηκ$ 添加到 $T_{pass}$。
- 标记状态 $s$ 为“已探索”。
4. 以“通过”判决终止。
5. 导出一个 FSM $G_B$,其轨迹集为 $pref(T_{pass}) ∪ T_{fail}$,使得 $T_{pass}$ 中的每个完整轨迹将 FSM $G_B$ 带到死锁状态“通过”,$T_{fail}$ 中的每个轨迹将 $G_B$ 带到死锁状态“失败”。
mermaid 流程图如下:
graph TD;
A[开始] --> B[初始化 T_pass 和 T_fail 为空集];
B --> C{是否有未执行的分离器};
C -- 是 --> D[执行分离器操作];
D --> C;
C -- 否 --> E{是否有未探索的状态};
E -- 是 --> F[执行遍历集操作];
F --> E;
E -- 否 --> G[以通过判决终止];
G --> H[导出 FSM G_B];
6. 算法示例与分析
以一个具体示例说明算法 2 的执行过程。假设给定图 1(b) 中的确定性实现 FSM $B$,它是规范 FSM $S$ 的子机,只是缺少了 $S$ 中的某些转换。
-
执行前导序列和分离器
:
- 对于状态 1,前导序列 $P_1$ 是平凡 FSM,将轨迹 $ε$ 添加到 $T_{pass}$。执行 $Id(1, S)$ 中的分离器,如 $R(1, 2)$、$R(1, 3)$ 和 $R(1, 4)$,观察到的轨迹 $b_0$ 和 $a_1a_0$ 也添加到 $T_{pass}$。
- 对于状态 2,执行前导序列 $P_2$ 观察到轨迹 $a_1$ 并添加到 $T_{pass}$,执行 $Id(2, S)$ 中的分离器,观察到的轨迹 $a_1b_1$ 和 $a_1a_0$ 添加到 $T_{pass}$。
- 对于状态 3,执行前导序列 $P_3$ 得到轨迹 $c_1a_1$ 并添加到 $T_{pass}$,执行分离器后,将轨迹 $c_1a_1a_0b_1$ 和 $c_1a_1b_0$ 添加到 $T_{pass}$。
- 对于状态 4,执行前导序列 $P_4$ 得到轨迹 $c_1$ 并添加到 $T_{pass}$,执行分离器后,将轨迹 $c_1a_1$ 和 $c_1b_1$ 添加到 $T_{pass}$。
-
执行遍历集和分离器
:
- 对于状态 1,遍历集 $N(U_K, P_1) = {a_0, a_1, b_0, c_0, c_1}$。应用输入并执行分离器,观察到的轨迹添加到 $T_{pass}$。
- 对于状态 2、3 和 4,分别执行对应的遍历集和分离器,将观察到的轨迹添加到 $T_{pass}$。
最终,由于 FSM $B$ 是 FSM $S$ 的约简,失败轨迹集合 $T_{fail}$ 为空,算法以“通过”判决终止。得到的无环 FSM $G_B$ 具有轨迹集 $Pref(T_{pass})$,每个完整轨迹将 FSM $G_B$ 带到死锁状态“通过”。
与之前的预设测试套件方法相比,该算法使用肯定可达状态构建遍历集,使得遍历集的轨迹更短。例如,之前的方法仅为确定性可达状态构建遍历集,对于图 1 中的规范 FSM,测试套件会包含所有长度为 3 的输入序列并附加相应的分离器,总长度超过 $5⋅3^3$。
7. 定理证明
定理 1 :给定最多有 $m$ 个状态的确定性 FSM $B = (B, b_0, I, O, h_B)$,使用算法 2 对 FSM $B$ 相对于给定规范 FSM $S$ 进行自适应测试。若 $B$ 是 $S$ 的约简,则算法 2 产生“通过”判决;若 $B$ 不是 $S$ 的约简,则产生“失败”判决。
证明
:
-
若 $B$ 是 $S$ 的约简
:根据算法构造,每个观察到的轨迹都是 $S$ 的轨迹,并且是测试的通过轨迹,因此不会产生“失败”判决,只能产生“通过”判决。
-
若 $B$ 不是 $S$ 的约简
:假设对于前导序列 $P_s$($s ∈ K$)的观察完整轨迹 $α_s$ 以及每个观察到的轨迹 $α_sσ ∈ C(T(P_s)Pr(β), U_K, s′)$($β ∈ N(U_K, P_s)$,$s′ ∈ R_β$),都没有产生“失败”判决。可以证明存在 $s ∈ K$ 和 $β ∈ N(U_K, P_s) ∩ Tr(B - after - α_s)$,使得对于前导序列 $P_s$ 的观察完整轨迹 $α_s$,存在一个序列集合 $M = {μ_1, …, μ_{m + 1}} ⊆ ∪_{s′∈R_β}C(T(P_s)Pr(β), U_K, s′)$,具有特定性质。由于 $B$ 最多有 $m$ 个状态,存在 $1 ≤ j < r ≤ m + 1$ 使得 $B - after - μ_j = B - after - μ_r$。根据偏序定义和算法执行情况,会出现矛盾,即会产生“失败”判决。
综上所述,该自适应测试算法能够有效地对确定性实现 FSM 进行测试,判断其是否为规范 FSM 的约简,并且通过使用肯定可达状态优化了测试过程。
超级会员免费看
2931

被折叠的 条评论
为什么被折叠?



