Unit testing Haskell Tasty单元测试-如何使用组和简单夹具避免重复?

Unit testing Haskell Tasty单元测试-如何使用组和简单夹具避免重复?,unit-testing,haskell,tasty,Unit Testing,Haskell,Tasty,您将如何编写一个美味的HUnit测试,在一个测试或至少一组这样的测试中针对单个fixture变量合并多个检查 例如,考虑这个Gukin规范: Scenario: A 3-Vector has x, y and z components Given: a <- Vec(1.0, 2.0, 3.0) Then: a.x = 1.0 And a.y = 2.0 And a.z = 3.0 我担心的是,我已经重复了三次场景名称,并且我还创建了三次fixture。我想找到一种方法,

您将如何编写一个美味的HUnit测试,在一个测试或至少一组这样的测试中针对单个fixture变量合并多个检查

例如,考虑这个Gukin规范:

Scenario: A 3-Vector has x, y and z components
  Given: a <- Vec(1.0, 2.0, 3.0)
  Then: a.x = 1.0
  And a.y = 2.0
  And a.z = 3.0
我担心的是,我已经重复了三次场景名称,并且我还创建了三次fixture。我想找到一种方法,将所有三个断言分组到一个标题为“一个3向量有x、y和z分量”的组中,并且只指定一次fixture向量

我可以扩展测试规范,以尽量减少一些重复的描述,但如果可以的话,我宁愿坚持小黄瓜规范:

unitTests = testGroup "All Unit Tests"
  [ testCase "A 3-Vector has x component" $ assertEqual [] (x $ Vec 1.0 2.0 3.0) 1.0
  , testCase "A 3-Vector has y component" $ assertEqual [] (y $ Vec 1.0 2.0 3.0) 2.0
  , testCase "A 3-Vector has z component" $ assertEqual [] (z $ Vec 1.0 2.0 3.0) 3.0
  ]
我不知道有什么方法可以为团队定义一次Vec

我想做的是这样的事情(不是真正的代码!)

谢谢你建议我的“非真实代码”没有太大的偏差。他是对的

经过一点调整,我最终得到了这样一个效果,正如我所希望的:

data Vec = Vec { x, y, z :: Double } deriving (Show)

unitTests = testGroup "All Unit Tests"
  [ testGroup "A 3-Vector has x, y and z components" $
    let v = Vec 1.0 2.0 3.0 in
    [ testCase "x" $ assertEqual [] (x v) 1.0
    , testCase "y" $ assertEqual [] (y v) 2.0
    , testCase "z" $ assertEqual [] (z v) 3.0
    ]
  ]

在一个测试用例中有多个断言是非常好的。所以你可以这样做:

unitTests = testGroup "All Unit Tests"
  [ testCase "A 3-Vector has x, y and z components" $ do
    let v = Vec 1.0 2.0 3.0
    assertEqual [] (x v) 1.0
    assertEqual [] (y v) 2.0
    assertEqual [] (z v) 3.0
  ]

为什么这不是真正的代码?只需将
testScenario
重命名为
testGroup
,在该行末尾添加一个
$
,它就可以完全满足您的需要了。@JoachimBreitner谢谢您,作为Haskell初学者,我很惊喜地发现我所希望的几乎是可能的。我已经发布了我的工作代码作为答案。
data Vec = Vec { x, y, z :: Double } deriving (Show)

unitTests = testGroup "All Unit Tests"
  [ testGroup "A 3-Vector has x, y and z components" $
    let v = Vec 1.0 2.0 3.0 in
    [ testCase "x" $ assertEqual [] (x v) 1.0
    , testCase "y" $ assertEqual [] (y v) 2.0
    , testCase "z" $ assertEqual [] (z v) 3.0
    ]
  ]
unitTests = testGroup "All Unit Tests"
  [ testCase "A 3-Vector has x, y and z components" $ do
    let v = Vec 1.0 2.0 3.0
    assertEqual [] (x v) 1.0
    assertEqual [] (y v) 2.0
    assertEqual [] (z v) 3.0
  ]