你如何testing正则expression式?

我是TDD的新手,我发现RegExp相当特殊。 有没有什么特别的方法可以对它们进行unit testing,或者我可以把它们当作常规函数呢?

你应该总是testing你的regexen,就像其他任何代码块一样。 它们是最简单的函数,它接受一个string并返回一个bool,或者返回一个值数组。

这里有一些关于如何deviseregexenunit testing的思考。 这些不是unit testingdevise的硬性规定,而是一些指导思想。 与往常一样,衡量您的testing需求与失败的成本之间的平衡,实现全部所需的时间。 (我发现“实施”testing是一件容易的事情: – ])

要考虑的要点:

  • 想想每个组(圆括号)作为一个大括号。
  • 想想每一个| 作为一个条件。 确保testing每个分支。
  • 把每个修饰符(*,+,?)想象成不同的path。
  • (注意上面的内容:记住*,+,?和*?,+?和??之间的区别)。
  • 对于\ d,\ s,\ w和他们的否定,在每个范围内给出几个尝试。
  • 对于*和+,您需要为每个testing“无值”,“一个”和“一个或多个”。
  • 对于重要的“控制”字符(例如,你正在寻找的正则expression式中的string)来testing,看看如果它们出现在错误的地方会发生什么。 这可能会让你感到惊讶
  • 如果你有真实世界的数据,尽可能多地使用它。
  • 如果你不这样做,一定要testing应该是有效的简单和复杂的forms。
  • 确保在插入时testing哪些正则expression式控制字符。
  • 确保validation空string是否被正确接受/拒绝。
  • 确保validation每种不同types的空格字符的string是否被正确接受或拒绝。
  • 确保正确处理不区分大小写(i标志)。 这比我在文本parsing(除空格以外)中的其他任何事情都要多一些。
  • 如果您有x,m或s选项,请确保您了解他们所做的工作并对其进行testing(此处的行为可能会有所不同)

对于返回列表的正则expression式,还请记住:

  • validation您所期望的数据是否以正确的顺序在正确的字段中返回。
  • validation轻微的修改不会返回良好的数据。
  • validation混合匿名组和命名组是否正确parsing(例如, (?<name> thing1 ( thing2) ) ) – 此行为可以基于您使用的正则expression式引擎而不同。
  • 再一次,给大量的现实世界的考验。

如果您使用任何高级function(如非回溯组),请确保完全理解function的工作方式,并使用上述指导原则构build适用于每个function的示例string。

根据您的正则expression式库实现,捕获组的方式也可能不同。 Perl 5有一个“开放命令”的顺序,C#有一部分除了命名组等。 确保尝试你的味道,确切地知道它的作用。

然后,将它们与其他unit testing一起整合到它们自己的模块中,或者放在包含正则expression式的模块的旁边。 对于特别讨厌的regexen,你可能会发现你需要大量的testing来validation你使用的模式和所有function是正确的。 如果正则expression式构成方法正在做的大量(或几乎所有)工作,我将使用上面的build议来input时间来testing函数,而不是直接使用正则expression式。 这样,如果后来你决定正则expression式不是要走的路,或者你想打破它,你可以捕获提供的正则expression式的行为,而不改变接口 – 即调用正则expression式的方法。

只要你真的知道正则expression式是如何工作在你的正则expression式的风格,你应该能够为它开发体面的testing用例。 只要确保你真的,真的了解这个function是如何工作的!

只要把一堆值,检查你得到正确的结果(无论是匹配/不匹配或特定的替代值等)。

重要的是,如果有任何你知道他们是否会工作的angular落案例,在一个unit testing中捕获他们,并在评论中解释他们为什么工作。 这样,想要改变正则expression式的其他人将能够检查到angular落的情况仍然有效,它会告诉他们如何解决这个问题。

大概你的正则expression式被包含在一个类的方法中。 例如:

 public bool ValidateEmailAddress( string emailAddr ) { // Validate the email address using regular expression. return RegExProvider.Match( this.ValidEmailRegEx, emailAddr ); } 

您现在可以为此方法编写testing。 我想重点是正则expression式是一个实现细节 – 您的testing需要testing接口,在这种情况下,这只是validation电子邮件方法。

我将创build一个具有预期输出值的input值集,与其他testing用例非常相似。

此外,我可以彻底推荐免费的正则expression式工具Expresso 。 这是一个梦幻般的正则expression式编辑器/debugging器,为我节省了过去的痛苦。

我一直在testing他们,就像我做其他function一样。 确保他们匹配你认为他们应该匹配的东西,他们不匹配他们不应该的东西。

我不能相信没有人发布这个惊人的工具:

refiddle.com

它可以让你testing你的正则expression式。 你可以定义一些包含它应该匹配的string的文本,以及不应该匹配的string,如果它们都是绿色的,那么你就很好。 例如这里是我用来匹配slu </s>的: http : //refiddle.com/by/callum-locke/slug-matcher

我认为一个简单的input输出testing就足够了。 随着时间的推移和一些你的正则expression式失败的情况发生,不要忘了添加这些情况下,以及在修复testing。

我喜欢针对相反的正则expression式来testing正则expression式,我将针对可能的testing执行这两个操作,并确保交集是空的。

考虑先写testing,只写正确的正则expression式来通过每个testing。 如果您需要扩展您的正则expression式,请添加失败的testing。