7

特定の正規表現のサンプル データを生成するツールがいくつかあります。いくつかが含まれます:

ただし、データセットをシードするには十分かもしれませんが、検証など、正規表現自体に依存するコードのテストにはあまり役立ちません。

プロパティを持つモデルを生成するコード ジェネレーターがあるとします。ユーザーは、プロパティを検証する正規表現を指定します。ここで、コード ジェネレーターが検証の成功と失敗を適切に確認するためのテストを生成しようとしているとします。不要なデータの生成を避けるために、ツールが正規表現内の境界ケースに焦点を当てることは合理的と思われます。

たとえば、正規表現^([a-z]{3,6})$を考えてみましょう。境界ケースには次のものが含まれます。

  • [az] のみで構成される任意の文字列、長さは 2 (失敗)
  • [az] 3 に等しい長さのみで構成される任意の文字列 (成功)
  • [az] のみで構成される任意の文字列、長さは 4 (成功)
  • [az] だけで構成される任意の文字列、長さは 5 (成功)
  • [az] のみで構成される任意の文字列、長さは 6 (成功)
  • [az] のみで構成される任意の文字列で、長さが 7 に等しい (失敗)
  • [az] で構成されていない任意の文字列 (失敗)
  • [az] で始まらず、[az] で終わる任意の文字列 (失敗)
  • [az] で始まり [az] で終わらない任意の文字列 (失敗)

境界ケースに焦点を当てる理由は、長さが 6 を超える [az] のみで構成される文字列は、正規表現で定義された文字列の長さの上限を検証するためです。したがって、長さ 7、8、9 の文字列をテストすることは、実際には同じ (境界) 条件をテストしているだけです。

これは単純化のために選択された任意の正規表現ですが、妥当な正規表現であれば入力として機能する可能性があります。

生成されるシステムのさまざまなレイヤーのテスト ケースの入力文字列を生成するためにコード ジェネレーターが使用できるフレームワーク/ツールは存在しますか。テスト ケースは、開発サイクルの後半でシステムが生成および変更されなくなったときに、本来の意味を持ちます。

4

1 に答える 1

1

私があなたの質問を正しく理解していれば、検証正規表現に基づいてシステムへの入力を生成して、単体テストを自動化することができます。

しかし、これは単体テストの目的に反しませんか? 誰かが正規表現を変更した場合、検証が失敗することを望みませんか?

いずれにせよ、単純な答えは、正規表現から文字列を生成することはほとんど不可能だということです。もしそれができたとしても、それは非常に複雑なものになるでしょう。たとえば、次の正規表現を考えてみましょう。

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

一致する (および/または一致を生成する) 文字列を考えるのは非常に簡単です。

abc123def456ghi789jkl123foo456pqr789stu123vwx456yz

一致は次のようになります。

  • 「abc」
  • 「デフ」
  • 「ギ」
  • 「jkl」

しかし、式から文字列を生成するにはどうすればよいでしょうか。明確な出発点はありません。解決策を導き出すには、ある程度の極端な (コンピューターの場合) 知性と少しの創造性が必要です。人間にとっては簡単なことですが、コンピューターにとっては非常に難しいことです。一致する文字列を生成するコンピューター アルゴリズムを思いついたとしても、簡単に次のようになります。

a

これにより一致が生成されますが、正規表現の実行はうまくいきません。は\d{0,3}実際に試行\Gされることはなく、(最後の一致の終わりではなく) 入力の開始に一致するためにのみ使用されます。(?<=(?<foo>foo))はテストされません (テストされた場合、不一致になります)。

一致しない文字列を生成するのも簡単です。

1

しかし、繰り返しになりますが、これは正規表現のペースを実際には上げません。

私はそれを証明できるほどコンピューター理論をよく知りませんが、これはP v NP クラスの問題に分類されると思います。複雑な文字列のコレクションに一致する正規表現を生成するのは比較的簡単ですが、正規表現に一致する複雑な文字列のコレクションを生成するのは困難です。

于 2013-01-17T15:49:18.503 に答える