福岡事務所に電話をしたら、「どなたですか?」と聞かれた中野@東京事務所です。
テストコードを書くのが苦手です。ついつい、手抜きを考えてしまいます。
何が面倒かというと、やはり、テスト用のデータを作成することがめんどいです。
ということで、そんなあなたにお勧めの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などの動的型付言語をやってるみたいですが、型推論がある関数型言語はいろいろと手抜きができて便利です。
テストを書くのに疲れたから、さぼってたわけではありません。暁ちゃんかわいい。