【问题标题】:Is this an alternative to the walking 1's algorithm?这是步行 1 算法的替代方案吗?
【发布时间】:2015-07-01 03:07:10
【问题描述】:
好的,这篇文章很长,请多多包涵。问题在最后一段。
我的应用程序从 100 多个离散输入中读取布尔数据,并将它们打包成一堆整数,然后通过串行输出。我正处于开发的测试阶段,需要检查每个输入是否放入正确的输出位。我的第一个直觉是使用步行 1 的算法。不过,这会产生数百个测试用例,这需要时间和精力来创建、维护、审查等。所以我被鼓励将测试数量减少到我觉得舒服的程度,即使这意味着有些用例不会t 被覆盖(可能他们会被其他团队的测试覆盖)。我对不彻底测试我的代码感到不舒服,但我意识到如果可能的话,我希望减少测试用例的数量。步行 1 的测试会产生 N 个测试用例,其中 N 是输入的数量。
想了一会儿,我想出了以下3个测试。如果其中任何一个失败,则说明输入转换有问题。
奇数测试 - 将每个奇数输入设置为“开”,在输出中产生交替的位模式。
偶数测试 - 将每个偶数输入设置为“开启”,从而在输出中产生交替的位模式。
步行 3 的测试 - 这是我自己的测试名称,因为它与步行 1 的测试相似。将前两个输入设置为“on”。然后将接下来的两个输入设置为“on”,依此类推,直到剩下 0 或 1 个输入。
对于每个测试,将输出与输入进行比较以查看是否匹配。如果它们不匹配,则可以使用 XOR 来获取错误位。
这个想法是奇数和偶数测试证明这些位独立于它们的相邻位。如果 10101 是输入(奇数测试),则输出 10101 表示在设置奇数位时未设置偶数位(独立于奇数位)。偶数位也是如此。这将可能的相关位的集合减少了一半。然后通过测试 3,我们可以证明其余位的独立性。例如,如果输入为 00011,输出为 00011,我们从奇数/偶数测试中知道位 1 独立于位 0,现在我们从 3 的测试中知道位 0 和 1 独立于其余位,否则这些位中至少有一个为 1。继续该示例,如果输入 00011 给我们 00111 用于输出,我们通过 XOR 知道位 2 取决于位 0(请记住,偶数和赔率测试通过,所以位 0是唯一可能的依赖来源)。或者,如果输入 00011 给我们输出 00110,我们通过 XOR 再次知道位 0 和 2 再次是问题(在这种情况下,它们似乎被交换了)。
下面是一个 5 位序列的示例(在我的应用程序中,它实际上是一系列 19 位序列)。这些示例考虑了交换两个位的情况。只能通过奇偶测试来检测卡住或关闭的位。
与walking 1 的测试相比,这3 个测试产生floor(N/2) + 2 测试用例。但是这些是否可以有效替代步行 1 的测试?我的例子似乎表明了这一点(至少出于我的目的),但我不确定。我本来希望在其他地方看到这种技术,但我还没有找到它。当然,我不知道我应该找什么名字。
交换位 0 和 1
|输入 |方法 |输出 |检测到? |
|-------|---------|--------|------------|
| 10101 |赔率 | 10110 |是 |
| 01010 |偶数 | 01001 |是 |
| 00011 | 3 的 (1) | 00011 |没有 |
| 01100 | 3 的 (2) | 01100 |没有 |
交换位 0 和 2
|输入 |方法 |输出 |检测到? |
|-------|---------|--------|------------|
| 10101 |赔率 | 10101 |没有 |
| 01010 |偶数 | 01010 |没有 |
| 00011 | 3 的 (1) | 00110 |是 |
| 01100 | 3 的 (2) | 01100 |没有 |
交换位 0 和 3
|输入 |方法 |输出 |检测到? |
|-------|---------|--------|------------|
| 10101 |赔率 | 11100 |是 |
| 01010 |偶数 | 00011 |是 |
| 00011 | 3 的 (1) | 01010 |是 |
| 01100 | 3 的 (2) | 00101 |是 |
交换位 0 和 4
|输入 |方法 |输出 |检测到? |
|-------|---------|--------|------------|
| 10101 |赔率 | 10101 |没有 |
| 01010 |偶数 | 01010 |没有 |
| 00011 | 3 的 (1) | 10010 |是 |
| 01100 | 3 的 (2) | 01100 |没有 |
交换位 1 和 2
|输入 |方法 |输出 |检测到? |
|-------|---------|--------|------------|
| 10101 |赔率 | 10011 |是 |
| 01010 |偶数 | 01100 |是 |
| 00011 | 3 的 (1) | 00101 |是 |
| 01100 | 3 的 (2) | 01010 |是 |
交换位 1 和 3
|输入 |方法 |输出 |检测到? |
|-------|---------|--------|------------|
| 10101 |赔率 | 10101 |没有 |
| 01010 |偶数 | 01010 |没有 |
| 00011 | 3 的 (1) | 01001 |是 |
| 01100 | 3 的 (2) | 00110 |是 |
交换位 1 和 4
|输入 |方法 |输出 |检测到? |
|-------|---------|--------|------------|
| 10101 |赔率 | 00111 |是 |
| 01010 |偶数 | 11000 |是 |
| 00011 | 3 的 (1) | 10001 |是 |
| 01100 | 3 的 (2) | 01100 |没有 |
交换位 2 和 3
|输入 |方法 |输出 |检测到? |
|-------|---------|--------|------------|
| 10101 |赔率 | 11001 |是 |
| 01010 |偶数 | 00110 |是 |
| 00011 | 3 的 (1) | 00011 |没有 |
| 01100 | 3 的 (2) | 01100 |没有 |
交换位 2 和 4
|输入 |方法 |输出 |检测到? |
|-------|---------|--------|------------|
| 10101 |赔率 | 10101 |没有 |
| 01010 |偶数 | 01010 |没有 |
| 00011 | 3 的 (1) | 00011 |没有 |
| 01100 | 3 的 (2) | 11000 |是 |
交换位 3 和 4
|输入 |方法 |输出 |检测到? |
|-------|---------|--------|------------|
| 10101 |赔率 | 01101 |是 |
| 01010 |偶数 | 10010 |是 |
| 00011 | 3 的 (1) | 00011 |没有 |
| 01100 | 3 的 (2) | 10100 |是 |
【问题讨论】:
-
实际需要测试什么?为什么会有 N 个离散测试用例?
-
这取决于你如何定义“依赖”。如果位 x 依赖于位 y 意味着这两个位总是具有相同的值,那么测试看起来不错。如果依赖意味着他们有某种逻辑关系,那么可能不是因为例如位 1 始终不是输入中的位 2
-
@user2864740 - 需要测试的是,如果我将其中一个离散输入接地(打开),则需要在输出中设置其相应位。 N 个测试用例,每个输入一个软件。
-
@samgak - 依赖,我的意思是如果我打开第 0 位,并且我的输出中同时打开第 0 位和第 1 位。输入之间没有逻辑关系。它基本上只是枚举它们。我一次从硬件读取 24 个输入,但由于协议开销,只能输出 19 位。所以我正在尝试测试我的位移是否正确。
标签:
algorithm
testing
bit-manipulation