Haskell Вкусные модульные тесты - как использовать группы и простые приспособления, чтобы избежать повторения? - PullRequest
1 голос
/ 08 мая 2020

Как бы вы, go, написали тест Tasty HUnit, который включает в себя несколько проверок одной переменной фикстуры в одном тесте или, по крайней мере, аккуратную группу таких тестов?

Например, рассмотрите это Спецификация корнишона:

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-вектор имеет компоненты x, y и z» и указать прибор Ve c только один раз.

Я мог бы расширить спецификацию теста, чтобы свести к минимуму повторение описаний, но я бы предпочел использовать Gherkin spe c, если смогу:

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
  ]

Я не знаю, как определите Ve c только один раз для группы.

Я бы хотел сделать что-то вроде этого (не настоящий код!):

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

1 Ответ

2 голосов
/ 09 мая 2020

Спасибо Иоахиму Брайтнеру , который предположил, что мой «ненастоящий код» не слишком далек от истины. Он прав.

После небольшой настройки я получил следующее, которое работает так, как я хочу:

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