区分序列/UIO/特征集示例
从确定性有限状态机进行测试:检查状态
概述
让我们假设我们有一个状态集 S 的 FSM M。还假设我们知道通过转换 t 达到的当前状态是 s 或 s0。
我们如何确定 t 到达了哪个状态?
分离状态
输入序列 w 将两个状态 s 和 s0 分开,如果: 对 w 的响应在 s 和 s0 中不同。
更正式地说,我们要求:
方法
我们想要区分模拟被测系统的未知 FSM MI 的状态。
相反,我们设计了区分 M 状态的序列。
我们可以在检查 MI 的状态时使用这些。我们可能会使用以下之一:
一个区别序列A distinguishing sequence。
独特的输入/输出序列Unique input/output sequences。
一个特征集A characterising se。
理想情况下,测试检查序列(验证它们区分 MI 的状态)
区分序列
输入序列 D 是一个可区分序列,如果:
对于每对状态 s,s0 of M 使得 s /= s0,我们有 λ∗(s, D) /= λ∗(s0, D)。
这意味着:响应 D 产生的输出标识了 M 的状态。要检查转换 t 的最终状态,在 t 之后跟随 D 就足够了。
使用区分序列
在该示例中,aa 形成一个可区分序列,因为:
从状态 s0 输出序列是 01
从状态 s1 输出序列为 11
从状态 s2 输出序列为 10
如果我们想检查转换 t = (s2, s1, b/0) 我们产生一个测试序列:
以诸如 b/1 的前导码开始,它将 M 带到 t 的起始状态。 接下来是来自 t 的输入/输出对 b/0。然后从结尾应用区分序列aa,得到a/1 a/1
连接这些,我们得到测试序列:b/1 b/0 a/1 a/1。
寻找区别序列
一些 FSM 没有区分序列。
没有有效的算法来决定 FSM 是否具有可区分序列(或生成可区分序列序列,当它们存在时)。但是,我们可以使用简单的搜索技术(例如广度优先)
独特的输入输出序列Unique Input Output Sequences (UIO)
输入/输出序列 x/y 是状态 s 的 UIO,如果:
y = λ∗(s, x) 并且对于 M 的每个状态 s0 使得 s /= s0 我们
有 λ∗(s0, x) /= λ∗(s, x)
这意味着输入 x 标识状态 s,因为:如果 y 是响应 x 产生的,我们一定处于状态 s,否则我们一定处于不同的状态。
注意:可区分序列标识所有状态,但 UIO 可能仅标识一个状态。
UIO 示例
在示例中,a=0 为状态 s0 形成一个 UIO:
从状态 s0 输出序列为 0
从状态 s1 输出序列为 1
从状态 s2 输出序列为 1
请注意,a 不是可区分序列。
使用 UIO 测试转换transitions
为了测试转换 t = (s2, s0, a/1) 我们可以建立一个测试顺序如下:
到达初始状态 t 的前导码 b/1;
转换的输入/输出对 a/1。
最后,为转换的结束状态 (a/0) 选择的 UIO。
这给出了测试序列 b/1 a/1 a/0。
特征集Characterising Sets
一组 W 的输入序列是 M 的特征集,如果:
对于 M 的每对状态 s, s0 使得 s /= s0 我们有某些 w 属于 W,使得 λ∗(s, w) /= λ∗(s0, w)(即 w 区分这些状态)。
这意味着:对于每对状态,都有一些输入(W 区分它们的序列)。
使用特征集
如果我们知道来自 W 的每个输入序列触发的输出,我们就可以识别状态。
要检查转换 t = (si, sj, x/y) 我们可以分别在 t 后面跟上 W 的每个元素。因此,使用特征集会导致对转换进行多次测试。
注意:每个最小 FSM 都有一个特征集——而这些可以在多项式时间内找到。
特征集示例
在这个 FSM 中,{a, b} 是一个特征集,因为:
结果
对于这个例子,如果我们正在检查一个转换 t 的最终状态,我们分别在它后面跟上 a 和 b。
因此,我们使用两个测试进行转换。
如果在 t 之后对 a 的响应是 1,而在 t 之后对 b 的响应是 0,则转换必须将实现带到对应于 s2 的状态。
概括
如果我们只对资助输出故障感兴趣,那么简单地执行 M 的所有转换(transition tour)就足够了。
如果我们希望能够发现状态转移错误,那么我们需要使用区分状态的技术。
我们探索了三种备选方案:可区分序列、UIO 和特征集。
接下来我们会遇到一个同样寻找额外状态的方法