这是步行1算法的替代方法吗?

时间:2015-07-01 03:07:10

标签: algorithm testing bit-manipulation

好的,这是一个很长的,所以请耐心等待。问题出在最后一段。

我的应用程序从100多个离散输入中读取布尔数据并将它们打包成一堆整数,这些整数稍后通过串行输出。我正处于开发的测试阶段,需要检查每个输入是否都放在输出的正确位。我的第一直觉是使用步行1的算法。这会产生数百个测试用例,这需要花费时间和精力来创建,维护,审查等等。因此,我鼓励将测试数量减少到我感觉舒服的程度,即使这意味着某些情况不会被覆盖(可能他们会被其他团队的测试所覆盖)。我不觉得没有彻底测试我的代码,但我觉得如果可能的话,我希望减少测试用例的数量。步行1的测试将产生N个测试用例,其中N是输入的数量。

在考虑了一段时间之后,我想出了以下3个测试。如果其中任何一个失败,则输入转换有问题。

  1. 赔率测试 - 将每个奇数输入设置为"打开",在输出中产生交替位模式。

  2. Evens测试 - 将每个偶数输入设置为" on",在输出中产生交替位模式。

  3. 步行3的测试 - 这是我自己的测试名称,因为它与步行1的测试相似。将前两个输入设置为" on"。然后将接下来的两个输入设置为" on",依此类推,直到剩下0或1个输入。

  4. 对于每个测试,将输出与输入进行比较以查看它是否匹配。如果它们不匹配,则可以使用XOR来获取错误的位。

    这个想法是,赔率甚至测试证明这些比特与它们的相邻比特无关。如果10101是输入(赔率测试),则输出10101表示当奇数位置位时,偶数位未置位(与奇数位无关)。偶数位也是如此。这将可能的相关位集减少了一半。然后通过测试3,我们可以证明其余位的独立性。例如,如果输入是00011并且输出是00011,我们从odds / evens测试中知道位1独立于位0,现在我们从3的测试中知道位0和1独立于位0。其余的位,否则这些位中的至少一个将是1.继续该示例,如果输入00011给出了00111输出,我们通过XOR知道位2依赖于位0(记住通过了均衡和赔率测试) ,所以位0是唯一可能的依赖来源)。或者,如果输入00011为输出提供00110,我们再次通过XOR知道第0和第2位是问题(在这种情况下,它们似乎是交换的)。

    下面是一个5位序列的例子(在我的应用中,它实际上是一系列19位序列)。这些示例考虑交换两位的情况。可以通过奇数和偶数测试来检测卡住或关闭的位。

    与步行1测试相比,这3个测试产生floor(N/2) + 2个测试用例。但这些是否可以替代步行1的测试?我的例子似乎表明了这一点(至少对我而言),但我不确定。我希望在其他地方看到这种技术,但我还没有找到它。当然,我不知道我应该寻找什么名字。

    Swap bits 0 and 1
    | Input | Method  | Output | Detected? |
    |-------|---------|--------|-----------|
    | 10101 | odds    | 10110  | Yes       |
    | 01010 | evens   | 01001  | Yes       |
    | 00011 | 3's (1) | 00011  | No        |
    | 01100 | 3's (2) | 01100  | No        |
    
    
    Swap bits 0 and 2
    | Input | Method  | Output | Detected? |
    |-------|---------|--------|-----------|
    | 10101 | odds    | 10101  | No        |
    | 01010 | evens   | 01010  | No        |
    | 00011 | 3's (1) | 00110  | Yes       |
    | 01100 | 3's (2) | 01100  | No        |
    
    
    Swap bits 0 and 3
    | Input | Method  | Output | Detected? |
    |-------|---------|--------|-----------|
    | 10101 | odds    | 11100  | Yes       |
    | 01010 | evens   | 00011  | Yes       |
    | 00011 | 3's (1) | 01010  | Yes       |
    | 01100 | 3's (2) | 00101  | Yes       |
    
    
    Swap bits 0 and 4
    | Input | Method  | Output | Detected? |
    |-------|---------|--------|-----------|
    | 10101 | odds    | 10101  | No        |
    | 01010 | evens   | 01010  | No        |
    | 00011 | 3's (1) | 10010  | Yes       |
    | 01100 | 3's (2) | 01100  | No        |
    
    
    Swap bits 1 and 2
    | Input | Method  | Output | Detected? |
    |-------|---------|--------|-----------|
    | 10101 | odds    | 10011  | Yes       |
    | 01010 | evens   | 01100  | Yes       |
    | 00011 | 3's (1) | 00101  | Yes       |
    | 01100 | 3's (2) | 01010  | Yes       |
    
    
    Swap bits 1 and 3
    | Input | Method  | Output | Detected? |
    |-------|---------|--------|-----------|
    | 10101 | odds    | 10101  | No        |
    | 01010 | evens   | 01010  | No        |
    | 00011 | 3's (1) | 01001  | Yes       |
    | 01100 | 3's (2) | 00110  | Yes       |
    
    
    Swap bits 1 and 4
    | Input | Method  | Output | Detected? |
    |-------|---------|--------|-----------|
    | 10101 | odds    | 00111  | Yes       |
    | 01010 | evens   | 11000  | Yes       |
    | 00011 | 3's (1) | 10001  | Yes       |
    | 01100 | 3's (2) | 01100  | No        |
    
    
    Swap bits 2 and 3
    | Input | Method  | Output | Detected? |
    |-------|---------|--------|-----------|
    | 10101 | odds    | 11001  | Yes       |
    | 01010 | evens   | 00110  | Yes       |
    | 00011 | 3's (1) | 00011  | No        |
    | 01100 | 3's (2) | 01100  | No        |
    
    
    Swap bits 2 and 4
    | Input | Method  | Output | Detected? |
    |-------|---------|--------|-----------|
    | 10101 | odds    | 10101  | No        |
    | 01010 | evens   | 01010  | No        |
    | 00011 | 3's (1) | 00011  | No        |
    | 01100 | 3's (2) | 11000  | Yes       |
    
    
    Swap bits 3 and 4
    | Input | Method  | Output | Detected? |
    |-------|---------|--------|-----------|
    | 10101 | odds    | 01101  | Yes       |
    | 01010 | evens   | 10010  | Yes       |
    | 00011 | 3's (1) | 00011  | No        |
    | 01100 | 3's (2) | 10100  | Yes       |
    

3 个答案:

答案 0 :(得分:1)

您需要考虑可能的错误是什么,什么决定了单个测试的成本,有时候在测试失败时诊断潜在问题是多么容易。在某些设备上,步行一个测试很容易输入,因为只需清除一个开关并设置其邻居就可以走过1,并且非常容易检查,因为它在输出上产生独特的模式。它检查了许多合理的错误接线和非接线。 (步行1和步行3s似乎需要相同数量的开关动作)

如果最合理的错误是你的包装代码中的一些错误,那么生活就会变得更复杂 - 就像使用+那样你应该使用的错误&仅在设置了足够的输入导致溢出时才会显示。您可以尝试少量完全随机的输入模式,或查看https://en.wikipedia.org/wiki/All-pairs_testing。与此相关的是,您需要将开关设置为明显完全随机的模式,这可能比仅仅沿着它们走1更令人沮丧和容易出错。

在使用更复杂的测试之前或之后,您可以看到显示器或自动警报可以提供哪些支持,以使测试仪的使用寿命更轻松,更不容易出错。

答案 1 :(得分:0)

使用n位,您可以使用ceil(log2(n + 2))测试来检测置换和卡住位,其中包括测试i(范围从0ceil(log2(n + 2)) - 1) ,位j的值(范围从1n)是2**i的二进制表示中与j对应的位。

test 0: 10101010101010
test 1: 01100110011001
test 2: 00011110000111
test 3: 00000001111111

答案 2 :(得分:0)

要回答我的问题,这不是替代步行1的替代方案。步行1可以检测比特之间的耦合。例如,第4位也会打开第2位,步行1将检测到这一点。我的算法在所有情况下都不会检测到这一点。

Walking 1's
Bit 4 also turns on bit 2
| Input | i | Output | Detected? |
|-------|---|--------|-----------|
| 00001 | 0 | 00001  | No        |
| 00010 | 1 | 00010  | No        |
| 00100 | 2 | 00100  | No        |
| 01000 | 3 | 01000  | No        |
| 10000 | 4 | 10100  | Yes       |


My algorithm
Bit 4 also turns on bit 2
| Input | Method  | Output | Detected? |
|-------|---------|--------|-----------|
| 10101 | odds    | 10101  | No        |
| 01010 | evens   | 01010  | No        |
| 00011 | 3's (1) | 00011  | No        |
| 01100 | 3's (2) | 01100  | No        |


David Eisenstat's algorithm
Bit 0 also turns on bit 2
| Input | i | Output | Detected? |
|-------|---|--------|-----------|
| 10101 | 0 | 10101  | No        |
| 00110 | 1 | 00110  | No        |
| 11000 | 2 | 11000  | No        |

所以我想这取决于你需要什么级别的检查。如果你需要检查耦合位,步行1似乎是要走的路。如果您只需要检查卡住位和排列,David Eisenstat的算法将比我的更有效率。

在我的情况下,我进行了大量的操作,可能我偶然会有2位耦合,所以我认为它必须走路1' S

修改 实际上,在更仔细地检查我的应用程序的行为之后,我决定使用David Eisenstat的算法。在我的应用程序中,如果位操作错误,比如位0打开位2,则位2也不可能按预期打开,算法将检测到该错误。