Unit testing Haskell Tasty单元测试-如何使用组和简单夹具避免重复?
您将如何编写一个美味的HUnit测试,在一个测试或至少一组这样的测试中针对单个fixture变量合并多个检查 例如,考虑这个Gukin规范: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。我想找到一种方法,
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
]