gpt4 book ai didi

c# - 通过关注正则表达式中定义的边界情况,从正则表达式生成示例数据以验证输入字符串

转载 作者:太空狗 更新时间:2023-10-29 23:47:22 26 4
gpt4 key购买 nike

有多种工具可以为给定的正则表达式生成示例数据。其中包括:

然而,虽然它们可能足以为数据集提供种子,但它对依赖于正则表达式本身的测试代码没有多大帮助,例如验证。

假设您有一个代码生成器,可以生成一个带有属性的模型。用户指定一个正则表达式来验证属性。现在假设代码生成器正在尝试生成测试以确保验证成功或失败。该工具专注于正则表达式中的边界情况以避免生成不必要的数据似乎是合理的。

例如,考虑一个正则表达式 ^([a-z]{3,6})$ 那么边界情况包括:

  • 任何仅由 [a-z] 组成且长度等于 2 的字符串(失败)
  • 任何仅由 [a-z] 组成且长度等于 3 的字符串(成功)
  • 任何仅包含 [a-z] 长度等于 4 的字符串(成功)
  • 任何仅由 [a-z] 组成且长度等于 5 的字符串(成功)
  • 任何仅由 [a-z] 组成且长度等于 6 的字符串(成功)
  • 任何仅由 [a-z] 组成且长度等于 7 的字符串(失败)
  • 任何不包含 [a-z] 的字符串(失败)
  • 任何不以 [a-z] 开头但以 [a-z] 结尾的字符串(失败)
  • 任何以 [a-z] 开头但不以 [a-z] 结尾的字符串(失败)

关注边界情况的原因是任何仅由 [a-z] 组成且长度大于 6 的字符串都会验证正则表达式中定义的字符串长度的上边界。所以测试长度为 7、8、9 的字符串实际上只是测试相同的(边界)条件。

这是出于简单性而选择的任意正则表达式,但任何合理的正则表达式都可以作为输入。

是否存在代码生成器可以用来为正在生成的系统的不同层的测试用例生成输入字符串的框架/工具。当系统在开发周期的后期不再生成和修改时,测试用例就会发挥作用。

最佳答案

如果我正确理解您的问题,您希望根据验证正则表达式为系统生成输入,以便您可以自动化单元测试。

但这不是违背了单元测试的目的吗?如果有人更改正则表达式,您不希望验证失败吗?

无论如何,简单的答案是从正则表达式生成字符串几乎是不可能的。如果可以做到,那将是极其复杂的。例如,考虑这个正则表达式:

(?<=\G\d{0,3})(?>[a-z]+)(?<=(?<foo>foo)|)(?(foo)(?!))

我很容易想到匹配(和/或生成匹配)的字符串:

abc123def456ghi789jkl123foo456pqr789stu123vwx456yz

比赛将是:

  • “abc”
  • “定义”
  • “吉”
  • “jkl”

但是你如何从表达式中生成一个字符串呢?没有明确的起点 - 需要一些极端的(对于计算机而言)智能加上一点创造力才能制定出解决方案。对人来说简单的东西,但对计算机来说非常非常难。即使您可以想出一种可以生成匹配字符串的计算机算法,它也很容易看起来像这样:

a

这会生成一个匹配项,但它在执行正则表达式方面做得很差。 \d{0,3} 从未真正尝试过,\G 仅用于匹配输入的开头(而不是最后一次匹配的结尾)。 (?<=(?<foo>foo)) 从未经过测试(如果经过测试,将导致不匹配)。

生成不匹配的字符串也很容易:

1

但是,同样,这并没有真正让正则表达式完成它的步伐。

我对计算机理论的了解不足以证明这一点,但我相信这属于 P v NP class of problems 。生成一个正则表达式来匹配复杂字符串的集合相对容易,但是生成一个复杂字符串的集合来匹配一个正则表达式则比较困难。

关于c# - 通过关注正则表达式中定义的边界情况,从正则表达式生成示例数据以验证输入字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11277942/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com