web-dev-qa-db-ja.com

複雑な正規表現の単体テストがあるべきですか?

アプリケーションで複雑な正規表現の単体テストを作成する必要がありますか?

  • 一方で:入力と出力の形式は多くの場合単純で明確に定義されているため、テストが容易であり、非常に複雑になりがちなので、それらのテストは特に価値があります。
  • 一方、それら自体が一部のユニットのインターフェースの一部になることはめったにありません。インターフェースのみをテストし、暗黙的に正規表現をテストする方法で行う方が良い場合があります。

編集:

コメント でこれが 内部コンポーネントの単体テスト の特別なケースであると述べているDoc Brownに同意します。

しかし、内部コンポーネントの正規表現にはいくつかの特別な特徴があります。

  1. 単一行の正規表現は、実際には別個のモジュールではなくても、本当に複雑になる可能性があります。
  2. 正規表現は、副作用なしに入力を出力にマップするため、個別にテストするのが非常に簡単です。
34
Lii

独断主義は別として、本当の問題は、複雑な正規表現を単体テストする価値があるかどうかです。正規表現が十分に複雑である場合、バグを見つけて再現し、リグレッションを防ぐことができるため、(正規表現がパブリックインターフェイスの一部であるかどうかにかかわらず)価値を提供することは明らかです。

102
JacquesB

正規表現は強力なツールになる可能性がありますが、複雑な正規表現に少しでも変更を加えただけで機能するという信頼できるツールではありません。

したがって、カバーすべきケースを文書化した多くのテストを作成してください。検証に使用する場合は、失敗するケースを文書化した多数のテストを作成します。

正規表現を変更する必要があるときはいつでも、新しいケースをテストとして追加し、正規表現を変更して最高のものを期待してください。

一般に単体テストを使用しない組織にいたとしても、使用する正規表現をテストするテストプログラムを作成します。必要があれば、自分の時間にそれを行うこともできます。私の髪の毛はもう色を失う必要はありません。

21
Bent

正規表現は、アプリケーションの他の部分と一緒のコードです。コード全体が期待どおりの動作をすることをテストする必要があります。これにはいくつかの目的があります。

  • テストは実行可能なドキュメントです。コードを実行するために必要なことを明確に示しています。テストされている場合は重要です。
  • 将来のメンテナは、変更した場合、テストによって動作が変更されていないことを確認できます。

残りの言語に別の言語のコードを埋め込むことで克服する必要のある追加のハードルがあるので、メンテナンスのためにこの特別な注意を払う必要があります。

つまり、アプリケーション、期間をテストする必要があります。より大きなブラックボックスの一部として、それを単独で実行する自動テストで正規表現をテストするか、それとも手動でそれをいじるだけかは、それが機能することを確認する必要があるポイントの二次的なものです。

単体テストの主な利点は、時間を節約できることです。現在または将来の任意の時点で、何回でもテストすることができます。正規表現がいつでもリファクタリングされ、調整され、より多くの制約を取得すると信じる理由がある場合は、ええ、おそらくそれについていくつかの回帰テストが必要です。変更する場合は、実行する必要がありますすべてのEdgeケースを1時間考えて、それを壊さないようにしました。または、コードを怖がって生活することを学び、単にコードを変更しないでください。

1
sara