其實test 在elm裡頭和其他語言的test大同小異。不過還是簡單介紹一下常用的套件。目前市面上(至少我知道的,如果有其他套件也請推薦)是由elm-community下的 elm-test 為大宗。
安裝:
npm install -g elm-test
在你的專案的根目錄下:
elm-test init
就會幫你建好你好的,你的test的檔案如下,會有一個獨立的 tests/
資料夾, 把你的 elm-package.json
複製一份到tests/
裡,這樣裡頭有三個檔案。在 tests/elm-package.json
可以在加入你想要的,測試專用的東西。
.
├── elm-package.json
├── src
└── tests
├── Main.elm
├── Tests.elm
└── elm-package.json
如果你要跑測試的話: elm test
就可以了!
這是 elm-test github上的例子,直接拿來說明:
suite : Test
suite =
describe "The String module"
[ describe "String.reverse" -- Nest as many descriptions as you like.
[ test "has no effect on a palindrome" <|
\_ ->
let
palindrome =
"hannah"
in
Expect.equal palindrome (String.reverse palindrome)
-- Expect.equal is designed to be used in pipeline style, like this.
, test "reverses a known string" <|
\_ ->
"ABCDEFG"
|> String.reverse
|> Expect.equal "GFEDCBA"
-- fuzz runs the test 100 times with randomly-generated inputs!
, fuzz string "restores the original string if you run it again" <|
\randomlyGeneratedString ->
randomlyGeneratedString
|> String.reverse
|> String.reverse
|> Expect.equal randomlyGeneratedString
]
]
第一是寫個描述,再來是把你要的test 放在list 之中。
第一也是個描述,再來是寫個function來test 你要的東西,譬如 \_ -> "ABCDEFG" |> String.reverse |> Expect.equal "GFEDCBA"
是一個module,像上面的例子常用的是 equal: a -> a -> Expectation
type alias Expectation =
Expectation
-- The result of a single test run: either a pass or a fail.
其他在Expect 常用的還有:
equal (arg2 == arg1) notEqual (arg2 /= arg1) lessThan (arg2 < arg1)
atMost (arg2 <= arg1) greaterThan (arg2 > arg1) atLeast (arg2 >=
arg1) true (arg == True) false (arg == False)
這個我覺得很像是在Haskell裡的 QuickCheck
:
automatic testing,也就是說他會幫你產生test,幫你測試就對啦。 不懂haskell 沒有關係,我們來看一下 fuzz
在幹麼:
fuzz : Fuzzer a -> String -> (a -> Expectation) -> Test
-- 和test比一下:
test: String -> (() -> Expectation) -> Test
看起來差不多,多了個 Fuzzer a
, 這個就是神奇的地方了:
fuzz (list int) "List.length should always be positive" <|
-- This anonymous function will be run 100 times, each time with a
-- randomly-generated fuzzList value.
\fuzzList ->
fuzzList
|> List.length
|> Expect.atLeast 0
如果這裡你放了個 list int
,在測式的 function 裡,他就會幫你自動產生 list int
(上例取了名叫fuzzList
,你也可以改成你想要的名稱。)
我們一開始的例子是用 fuzz string
,也就是之後的function會幫我自動產生100個隨意的 string
。
大概就是這樣。