好的,这是一个很长的,所以请耐心等待。问题出在最后一段。
我的应用程序从100多个离散输入中读取布尔数据并将它们打包成一堆整数,这些整数稍后通过串行输出。我正处于开发的测试阶段,需要检查每个输入是否都放在输出的正确位。我的第一直觉是使用步行1的算法。这会产生数百个测试用例,这需要花费时间和精力来创建,维护,审查等等。因此,我鼓励将测试数量减少到我感觉舒服的程度,即使这意味着某些情况不会被覆盖(可能他们会被其他团队的测试所覆盖)。我不觉得没有彻底测试我的代码,但我觉得如果可能的话,我希望减少测试用例的数量。步行1的测试将产生N个测试用例,其中N是输入的数量。
在考虑了一段时间之后,我想出了以下3个测试。如果其中任何一个失败,则输入转换有问题。
赔率测试 - 将每个奇数输入设置为"打开",在输出中产生交替位模式。
Evens测试 - 将每个偶数输入设置为" on",在输出中产生交替位模式。
步行3的测试 - 这是我自己的测试名称,因为它与步行1的测试相似。将前两个输入设置为" on"。然后将接下来的两个输入设置为" on",依此类推,直到剩下0或1个输入。
对于每个测试,将输出与输入进行比较以查看它是否匹配。如果它们不匹配,则可以使用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 |
答案 0 :(得分:1)
您需要考虑可能的错误是什么,什么决定了单个测试的成本,有时候在测试失败时诊断潜在问题是多么容易。在某些设备上,步行一个测试很容易输入,因为只需清除一个开关并设置其邻居就可以走过1,并且非常容易检查,因为它在输出上产生独特的模式。它检查了许多合理的错误接线和非接线。 (步行1和步行3s似乎需要相同数量的开关动作)
如果最合理的错误是你的包装代码中的一些错误,那么生活就会变得更复杂 - 就像使用+那样你应该使用的错误&仅在设置了足够的输入导致溢出时才会显示。您可以尝试少量完全随机的输入模式,或查看https://en.wikipedia.org/wiki/All-pairs_testing。与此相关的是,您需要将开关设置为明显完全随机的模式,这可能比仅仅沿着它们走1更令人沮丧和容易出错。
在使用更复杂的测试之前或之后,您可以看到显示器或自动警报可以提供哪些支持,以使测试仪的使用寿命更轻松,更不容易出错。
答案 1 :(得分:0)
使用n
位,您可以使用ceil(log2(n + 2))
测试来检测置换和卡住位,其中包括测试i
(范围从0
到ceil(log2(n + 2)) - 1
) ,位j
的值(范围从1
到n
)是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也不可能按预期打开,算法将检测到该错误。