計算機科学のブログ

コードの整理とプロジェクトのビルド QuickCheckを使ったプロパティテスト さまざまな種類のテスト ghci、ユニットテストの作成とstack testの使用

入門Haskellプログラミング (Will Kurt(著)、株式会社クイープ(監修、翻訳)、翔泳社)のUNIT6(コードの整理とプロジェクトのビルド)、LESSON 36(QuickCheckを使ったプロパティテスト)、36.2(さまざまな種類のテスト)のクイックチェック 36-2、ユニットテストの作成とstack testの使用のクイックチェック 36-3の解答を求めてみる。

コード

palindrome-testing/test/Spec.hs

import Lib

assert :: Bool -> String -> String -> IO ()
assert test passStatement failStatement =
    putStrLn (if test
              then passStatement
              else failStatement)

main :: IO ()
main = do
    putStrLn "Running tests..."
    -- せっかくだからmapM_関数を使用して本著のコードよりちょっと短く
    mapM_ (\word -> assert (isPalindrome word)
                           (mconcat ["passed '", word, "'"])
                           (mconcat ["FAIL: '", word, "'"]))
         ["racecar",
          "racecar!",
          "cat",
          ":racecar:"]
    putStrLn "done!"

入出力結果(Terminal, Zsh)

*Main Lib Paths_palindrome_testing
λ> isPalindrome "sam I mas"
True
it :: Bool
(0.01 secs, 444,216 bytes)
*Main Lib Paths_palindrome_testing
λ> :quit
Leaving GHCi.
% stack test
palindrome-testing-0.1.0.0: unregistering (local file changes: test/Spec.hs)
palindrome-testing> build (lib + exe + test)
Preprocessing library for palindrome-testing-0.1.0.0..
Building library for palindrome-testing-0.1.0.0..
Preprocessing test suite 'palindrome-testing-test' for palindrome-testing-0.1.0.0..
Building test suite 'palindrome-testing-test' for palindrome-testing-0.1.0.0..
[2 of 2] Compiling Main
Linking .stack-work/dist/x86_64-osx/Cabal-3.2.1.0/build/palindrome-testing-test/palindrome-testing-test ...
Preprocessing executable 'palindrome-testing-exe' for palindrome-testing-0.1.0.0..
Building executable 'palindrome-testing-exe' for palindrome-testing-0.1.0.0..
palindrome-testing> copy/register
Installing library in /Users/…/palindrome-testing/.stack-work/install/x86_64-osx/e67eb8948c5ca5b05145d327b42dbaf36b07cbc5c162184cfcce5372fdfb9a45/8.10.7/lib/x86_64-osx-ghc-8.10.7/palindrome-testing-0.1.0.0-ArexdrWdtZoJlI5LW2VA53
Installing executable palindrome-testing-exe in /Users/…/palindrome-testing/.stack-work/install/x86_64-osx/e67eb8948c5ca5b05145d327b42dbaf36b07cbc5c162184cfcce5372fdfb9a45/8.10.7/bin
Registering library for palindrome-testing-0.1.0.0..
palindrome-testing> test (suite: palindrome-testing-test)
                                
Running tests...
passed 'racecar'
passed 'racecar!'
FAIL: 'cat'
passed ':racecar:'
done!

palindrome-testing> Test suite palindrome-testing-test passed
Completed 2 action(s).
%