gpt4 book ai didi

haskell - 实现构建器模式以在 haskell 中生成测试用例

转载 作者:行者123 更新时间:2023-12-01 05:18:58 25 4
gpt4 key购买 nike

我需要为用 Java 编写的应用程序生成 cucumber 测试用例。

测试用例如下所示:

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 更改,只需修改构建器函数和后端即可适应我的测试用例。

这是解决问题的可能/有效方法吗?
有没有更好的想法来创建这样的语法树?

谢谢!

——马蒂亚斯。

最佳答案

流畅的界面模式叫做Endo在 haskell 。这是一个 Monoid ,因此您可以使用 mconcat 获得一些效率,虽然我很少看到Endo在实践中使用,因为它不是一个巨大的 yield 。

对于这样的定义,您将面临的一个挑战是需要默认所有内容,毕竟 withName "My Test Case"将需要是有效的 TestCase全靠自己。这可能意味着您的许多类型将是 Maybe s 或者它可能只是意味着您想要仔细定义您的类型。这可能与您对标准语法树的概念有关。

创建这种可扩展 AST 的全能方法是使用 Data types a la carte技术。简而言之,您定义一个通用的“和”类型运算符,然后构建对递归类型的某些组件总和进行操作的函数。通过使用巧妙的默认值,您可以省略许多样板定义并允许可扩展性。

此类技术可能对您的类型有用。

最后,如果不通过 Control.Lens 提出查看镜头的建议,就很难谈论这样的嵌套数据类型。 (包括所有可能的电池)或 fc-labels (更简单)。这些让您可以对可以双向使用的树进行深入检查,以查看和构建更新 Endo s。它们还具有巧妙的通用原则,例如能够同时“关注”树中的多个位置(这些是 FoldTraversal 中的 Control.Lens )。

关于haskell - 实现构建器模式以在 haskell 中生成测试用例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17876469/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com