2017-07-04 106 views
0

作为受试者,我想生成测试数据,以覆盖所有对于一些逻辑表达的可能的条件等如下:如何根据逻辑表达式生成测试数据?

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

任何评论是受欢迎的。

顺便说一句,逻辑表达式是一个简化的规则,应用在我们的后端服务器上。

+0

您应该指定所使用的技术,以便其他人可以将您指向相关资源。你使用什么编程语言和测试框架? – vijoc

+0

其实我不在乎语言,只想找一个可行的方法(算法)或开源工具来解决问题。 – user940178

回答

1

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

另一件事,如果(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); 
     } 

你只需要存储的测试执行生成的测试数据

+0

您好@buxter,非常感谢您的详细解答。你对(a == 300700)的价值是正确的,这确实是错字。你的方法是可行的。我认为我们可以进一步使用“程序静态分析”等技术来自动生成所有临界值,但我对这些领域并不熟悉,您是否可以点亮这一点?再次感谢。 – user940178

+0

这是C#中的一个单元测试,使用Nunit框架。它具有用于参数化测试的内置属性[Combinatorial]。所以当测试运行时,它收集所有的输入数据并生成所有可能的变化。在给定的例子中,它在关键点上创建了所有可能的变体。其他单元测试框架可能有类似的东西。希望它能回答你的问题 – buxter