我需要为用 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 更改只需修改构建器功能和后端以适应我的测试用例。
这是解决问题的可能/有效方法吗?创建这样的语法树有什么更好的想法吗?
谢谢!
——马蒂亚斯。