Haskell Tasty单元测试-如何使用组和简单的固定装置来避免重复



您将如何编写一个Tasty HUnit测试,该测试在单个测试中对单个fixture变量进行多个检查,或者至少是一组整洁的此类测试?

例如,考虑这个小黄瓜规范:

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

我可以做这样的事情,但它非常重复:

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

我担心的是,我已经重复了三次场景名称,而且我还创建了三次固定装置。我想找到一种方法,将所有三个断言分组到一个标题为"3-Vector有x、y和z组件"的组中,并且只指定一次fixture Vec。

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

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。

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

unitTests = testGroup "All Unit Tests"
[ testScenario "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
]
]

感谢Joachim Breitner,他建议我的"非真实代码"不会太离谱。他是对的。

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

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
]
]

在一个testCase中有多个断言是完全可以的。所以你可以这样做:

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
]

最新更新