4

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が変更されるとすぐに、私のテストケースを適応させるためにビルダー関数とバックエンドを変更するだけで済みます。

これは問題に対する可能な/有効なアプローチですか? このような構文ツリーを作成するためのより良いアイデアはありますか?

どうも!

――マティアス。

4

1 に答える 1