{ 2013.12.6 }

すごいHなテスト

    はてなブックマーク - すごいHなテスト
    このエントリーをはてなブックマークに追加

    福岡事務所に電話をしたら、「どなたですか?」と聞かれた中野@東京事務所です。

    テストコードを書くのが苦手です。ついつい、手抜きを考えてしまいます。
    何が面倒かというと、やはり、テスト用のデータを作成することがめんどいです。

    ということで、そんなあなたにお勧めのHaskellです。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    
    {-# LANGUAGE GeneralizedNewtypeDeriving #-}
    -- hoge.hs
     
    import Test.QuickCheck
    import Test.QuickCheck.Monadic
     
    import Control.Applicative
    import Control.Monad.State
    import Control.Monad.Writer
     
    data Q = Q Int deriving Show
    data S = S { fstS :: String, sndS :: String } deriving Show
    data W = W { getQ :: Q,  getS :: S } deriving Show
     
    instance Arbitrary S where
      arbitrary = S <$> elements ["Mr.", "Ms.", "Mrs."] <*> elements ["Hoge", "Foo", "Bar", "Hage"]
     
    newtype AppT w m a = AppT { runQ :: StateT W (WriterT w m) a }
        deriving (Monad, MonadIO, MonadState W, MonadWriter w)
     
    exec :: AppT [String] IO Int
    exec = do
      w <- get
      let Q(q) = getQ w
          s = getS w
          name str = fstS str ++ " " ++ sndS str
      tell ["No." ++ show q]
      tell [name s]
      return q
     
    main' :: S -> Int -> IO [String]
    main' s a = main'' (W (Q a) s)
      where
        main'' w = do
          (_, r) <- runWriterT $ runStateT (runQ exec) w
          return r
     
    prop_main' :: S -> Int -> Property
    prop_main' s a = (a < 100 && a > 0) ==> monadicIO $ do
      res <- run $ main' s a
      assert $ res == ["No." ++ show a, fstS s ++ " " ++ sndS s]
     
    main :: IO ()
    main = quickCheck prop_main'
     
    -- $ runghc hoge.hs

    OH, さすがすごいHな言語。自動でテストのデータを作成してくれました。
    (ScalaにもScalaCheckという似たようなやつがあります)

    まとめ

    まあ、ランダムな値なので確実とはいいませんが、簡単にできるので重宝しております。
    弊社ではよくPHPやRubyなどの動的型付言語をやってるみたいですが、型推論がある関数型言語はいろいろと手抜きができて便利です。

    テストを書くのに疲れたから、さぼってたわけではありません。暁ちゃんかわいい。

    Comments are closed.