【问题标题】:How to generate test data according to logic expression?如何根据逻辑表达式生成测试数据?
【发布时间】:2017-07-04 06:58:48
【问题描述】:

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

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

欢迎评论。

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

【问题讨论】:

  • 您应该指定使用的技术,以便其他人可以将您指向相关资源。您使用的是什么编程语言和测试框架?
  • 其实我并不关心语言,只是想找到一个可行的方法(算法)或开源工具来解决问题。

标签: testing automated-tests data-generation


【解决方案1】:

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

另外,如果(b == 3000700),那么&amp;&amp;(b&gt;=30 &amp;&amp; b&lt;=33) 返回false,这使得这部分语句||(b==3000700) 毫无意义。也许它应该是(a == 3000700)

关于测试用例...再次,如果没有看到完整的代码 sn-p 并了解上下文,提供有意义的建议有点困难。不过我还是会试试的。

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

  • 变量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);
        }

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

【讨论】:

  • 嗨@buxter,非常感谢您详细的回答。您对 (a == 300700) 的值是正确的,这确实是错字。你的方法是可行的。我认为我们可以进一步使用“程序静态分析”等技术自动生成所有临界值,但我对这些领域并不熟悉,你能解释一下吗?再次感谢。
  • 这只是 C# 中的单元测试,使用 Nunit 框架。它具有用于参数化测试的内置属性 [Combinatorial]。因此,当测试运行时,它会收集所有输入数据并在其上生成所有可能的变化。在给定的示例中,它会在关键点上创建所有可能的变化。其他单元测试框架可能有类似的东西。希望它能回答你的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-25
  • 1970-01-01
  • 2018-04-09
  • 1970-01-01
相关资源
最近更新 更多