私のチームは、IDEに統合されるドメイン固有言語(DSL)のコンパイラを作成しています。現在、私たちはコンパイラーの分析フェーズに集中しています。リアルタイムのパフォーマンスと非常に詳細なエラー/警告/メッセージ情報が必要なため、既存のパーサージェネレーター(ANTLRなど)は使用していません。我々は持っています
- 各クラスは、言語の具体的な構文ツリーのノードを表します。
- 各ノードの注釈として機能するクラス(つまり、エラーや追加情報)、および
- 具体的な構文ツリー(つまり、レクサー、パーサー、文字列のキャッシュ、構文ビジター)を構築および操作する内部クラス。
テストを整理するための全体的な戦略を決定しようとしています。当社は、行動主導型開発(BDD)とドメイン主導型設計(DDD)を推進しています。弊社のドメイン用にDSLを構築していますが、コンパイラのドメインはプログラミング言語です。
私たちはまだコンパイラーを構築中であり、すでにいくつかのテストを行っています。100%ステートメントカバレッジを目指しています。
現在、構文ツリービルダーにソースコードを入力し、結果の構文ツリーのすべてのノードの各プロパティで検証を実行して、期待される情報(行番号、関連するエラー、子/親トークン、トークンの幅、トークンのタイプなど)。ここで、各ノードは独自のクラスであり、ノードに添付された特定の注釈とエラーは個別のクラスであるため、このテストは多くのクラスを参照することになります。
現在、入力(文字列)と出力(トークンのリスト)を他のクラス(構文ツリーのノードのクラスなど)から分離できるレクサーなどの特定のクラスのテストがあります。これらのテストはより詳細です。
これで、すぐ上の段落のテストを、テスト中のクラス(レクサー、文字列キャッシュなど)に対応させることができます。ただし、上記の2番目の段落のテストは、コンパイラーの分析フェーズ全体を実際にテストします。つまり、入力ソースコードが与えられている場合、各テストは構文ツリーに対して300以上のアサーションを持つことができます。テストは、分析フェーズの動作のためのものです。
これは適切なテスト戦略ですか?そうでない場合、私たちは何を別の方法で行うべきですか?テストにはどのような組織戦略を使用する必要がありますか?