Java で記述されたアプリケーションのキュウリ テスト ケースを生成する必要があります。
テスト ケースは次のようになります。
Scenario My great test
Given the following input
"""
Code snippet of a DSL
"""
And the following data
| name | type | value |
| a | Boolean | true |
| b | Integer | 5 |
When I run the evaluation
Then the result should be "Yay!"
この構造に似たデータ型を構文ツリーとして作成し、構文ツリーを取得してテスト ケース文字列を作成する「バックエンド」も作成しました。
データ型は次のようになります。
data TestCase = Scenario String DslStatement DataStatement ResultStatement
data DslStatement = Dsl [TopLevelStatement]
data TopLevelStatement =
StatementTypeA String
| StatementTypeB String
| StatementTypeC String SubStatementTypeA [SubStatementTypeB]
| StatementTypeD String [String]
...
など。
今、さまざまな値や型などを使用して、これらのデータ構造を大量に生成したいと考えています。
必要なパラメーターを受け取る関数を作成し、パラメーターの値が表示されるべき場所に挿入された構文ツリーを作成できます。ただし、テスト ケースに含まれる DSL は常に変更される可能性があるため (段階的に開発されます)、さまざまなテスト ケース タイプを作成するすべての関数を常に変更する必要があり、面倒です。また、テスト ケースは、大部分のテスト ケースでほんの一握りの場所でのみ変更される標準の構文ツリーに基づくことができます。
私の考えは、多かれ少なかれ Java の流暢なインターフェースを備えたビルダー パターンに似た関数を作成することです。標準の構文ツリーから始めて、それを変更し、次のようにさらに変更された結果のツリーを返す関数を作成します。
withName :: String -> TestCase -> TestCase
withName name (Scenario _ dsl data result) = Scenario name dsl data result
withResult :: ResultStatement -> TestCase -> TestCase
withResult result (Scenario name dsl data _) = Scenario name dsl data result
...
次に、次のようなものを書くことができるはずです。
withName "My Test Case" . withResult (Result "Yay!") $ createStandardTestCase
そしてDSLが変更されるとすぐに、私のテストケースを適応させるためにビルダー関数とバックエンドを変更するだけで済みます。
これは問題に対する可能な/有効なアプローチですか? このような構文ツリーを作成するためのより良いアイデアはありますか?
どうも!
――マティアス。