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

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

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


奇数测试-将每个奇数输入都设置为“ on”,在输出中产生交替的位模式。
偶数测试-将每个偶数输入设置为“ on”,在输出中产生交替的位模式。
行走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位序列)。这些示例考虑了交换两位的情况。只能通过奇数和偶数测试来检测卡在打开或关闭的位。

与步行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位,您可以使用ceil(log2(n + 2))测试来检测置换和卡住的位,其中在测试i(范围从0ceil(log2(n + 2)) - 1)中,位j的值(范围从至1)是n二进制表示形式中与2**i对应的位。

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

09-11 11:36