如何根据逻辑表达式生成测试数据?

时间:2017-07-04 06:58:48

标签: testing automated-tests data-generation

作为主题,我想生成测试数据以涵盖某些逻辑表达式的所有可能条件,如下所示:

 ((a==3000710)||(b==3000700))
   &&(b>=30 && b<=33)
   &&((c==1)||(c>=4 && c<=6))
   &&((v==1.0.9)||(v==2.0.0))

欢迎任何评论。

BTW,逻辑表达式是一个简化的规则,适用于我们的后端服务器。

1 个答案:

答案 0 :(得分:1)

我必须说的第一件事 - 重构它! 将其分解为几个更易于验证的语句,反向逻辑并提前退出。在没有看到实际代码和上下文的情况下,很难提供更详细的建议。

另一件事,如果(b == 3000700),则&&(b>=30 && b<=33)返回false,这使得语句||(b==3000700)的这一部分毫无意义。也许应该是(a == 3000700)

关于测试用例......再次没有看到完整的代码片段并且知道上下文,提供有意义的建议有点困难。但无论如何我都会尝试。

让我们看一下每个变量的“临界值”。

  • 变量a:3000710,任何其他
  • 变量b:3000700, [30, 33], any other
  • 变量c:1, [4, 6], any other
  • 变量v:1.0.9, 2.0.0, any other

使用测试理论(等价划分和边界值分析),我们可以限制上面的“关键”值列表。

[30, 33] => 30, 31, 33 (The value outside of this range is already covered by "any other")
[4, 6] => 4, 5, 6 (The value outside of this range is already covered by "any other". Though we did't really change anything in this case)

Nunit有一个属性[Combinatorial],它为为测试参数提供的各个数据项的所有可能组合生成测试用例。

*假设:变量a, b, c的类型为int,变量v是字符串

代码看起来像这样:

        [Test, Combinatorial]        
        public void FirstTest(
            [Values(3000710, 0)] int a, 
            [Values(30, 31, 33, 3000700, 0)] int b,
            [Values(1, 4, 5, 6, 0)] int c, 
            [Values("1.0.9", "2.0.0", "")] string v)
        {
            RunTestMethod(a, b, c, v);
        }

您只需将生成的测试数据存储在测试执行