- 2015/10時点
- OSX Yosemite環境向け
- 開発環境構築から単体テスト実行まで
- http://qiita.com/sasarkyz/items/67a3458e4d0b89745ae1
- http://qiita.com/manji-0/items/463ea051f624a9a4a83a
- http://succzero.hatenablog.com/entry/2014/02/05/031319
- http://alice345.hatenablog.com/entry/2015/02/05/084723
- https://github.com/kazu-yamamoto/unit-test-example/blob/master/markdown/ja/tutorial.md
- https://sites.google.com/site/klovelab/Home/cabal
- http://demmys.hatenablog.com/entry/2014/09/13/Mac_OS_X%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AEHaskell%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83
- homebrewが入っていなければインストールしておくこと
//最新にしておく
$ brew doctor
$ brew update
$ brew install ghc
動作確認
$ ghci
GHCi, version 7.10.2: http://www.haskell.org/ghc/ :? for help
Prelude> 1+1
2
Haskellのパッケージ管理コマンドCabalをインストールする
$ brew install cabal-install
$ cabal update
$ cabal install cabal-install
後述するATOMで利用するためのライブラリを入れておく
$ cabal install happy
$ cabal install haskell-src-exts
$ cabal install hlint ghc-mod stylish-haskell
Cabalを利用してプロジェクト雛形を作成する
$ mkdir sample
$ cd sample
$ cabal update //最新パッケージを利用するためアップデート
$ cabal sandbox init //サンドボックス環境作成
$ cabal init //プロジェクト作成
- Please choose a license:適当に何か選択する
- What does the package build:Executableを選択
- その他:デフォルト値で良い
sample.cabalファイルが生成される(下記は生成ファイルに手を加えている)
name: sample
version: 0.1.0.0
license: Apache-2.0
license-file: LICENSE
build-type: Simple
cabal-version: >=1.10
executable sample
default-language: Haskell2010
ghc-options: -Wall -fno-warn-missing-signatures -fno-warn-type-defaults
hs-source-dirs: src
main-is: Main.hs
build-depends: base >=4.8 && <4.9
ファイル構成
├── .cabal-sandbox
│ └── ...
├── LICENSE
├── Setup.hs
├── cabal.sandbox.config
└── sample.cabal
cabal init
でライセンス種別を指定しておかないとLICENSEファイルが生成されず、後述のcabal install
でエラーになるので注意
$ mkdir src
$ touch src/Main.hs
$ vim src/Main.hs
main = putStrLn "hello world"
sample.cabalで指定された依存パッケージを取得する
$ cabal install
$ cabal configure
$ cabal run
ATOMのPreferenses>Installから haskell-ghc-mod
ide-haskell
language-haskell
autocomplete-haskell
linter
linter-hlint
パッケージをインストール
- Use Backend:
haskell-ghc-mod
を選択
- Ghc Mod Path :/Users/YOUR_NAME/.cabal/bin/ghc-mod
- Ghc Modi Path:/Users/YOUR_NAME/.cabal/bin/ghc-modi
- One Save Prettify:有効化
- Cabal Path:/usr/local/bin/cabal
- Stylish Haskell Path:/Users/YOUR_NAME/.cabal/bin/stylish-haskell
- Use Backend:
haskell-ghc-mod
を選択 - Use Linter:有効化
- The hlint executable path:Users/YOUR_NAME/.cabal/bin/hlint
$ cabal install hspec
test/HelloSpec.hs
module HelloSpec (main, spec) where
import Test.Hspec
hello :: String -> String
hello name = "hello, " ++ name
specHello :: Spec
specHello = describe "hello" $ do
it "standard" $
hello "world" `shouldBe` "hello, world"
it "empty" $
hello "" `shouldBe` "hello, "
main :: IO ()
main = hspec specHello
$ runhaskell test/HelloSpec.hs
sample.cabal編集し、library、test-suiteを追加する
name: sample02
version: 0.1.0.0
license: Apache-2.0
license-file: LICENSE
build-type: Simple
cabal-version: >=1.10
executable sample02
default-language: Haskell2010
ghc-options: -Wall -fno-warn-missing-signatures -fno-warn-type-defaults
hs-source-dirs: src
main-is: Main.hs
build-depends: base >=4.8 && <4.9
library
default-language: Haskell2010
ghc-options: -Wall -fno-warn-missing-signatures -fno-warn-type-defaults
build-depends: base >=4.8 && <4.9
test-suite spec
default-language: Haskell2010
ghc-options: -Wall -fno-warn-missing-signatures -fno-warn-type-defaults
type: exitcode-stdio-1.0
hs-source-dirs: test
main-is: HelloSpec.hs
build-depends: base
, hspec >= 1.3
, sample --自プロジェクトへの参照を追加しておく
cabal install --enable-tests --only-dependencies //テスト用を含めて依存パッケージをインストール
cabal configure --enable-tests
cabal build
cabal test
hspecのAutomatic spec discoveryを利用する (参考:http://mike-neck.hatenadiary.com/entry/2015/06/19/103536)
$ touch test/Spec.hs
$ vim test/Spec.hs
{-# OPTIONS_GHC -F -pgmF hspec-discover #-}
$ vim sample.cabal
test-suite spec
main-is: Spec.hs //上記ファイルに変更
testフォルダに *Spec.hs という名称でテストファイルを追加すれば、自動的に検出されテスト対象となる
- specファイルはテストドライバーと同じディレクトリーか、そのサブディレクトリーに置いておくこと
- specファイルは必ずSpec.hsで終わること。また、モジュール名もSpecで終わること
- 各モジュールは必ずトップレベルでSpecを返すspecという関数を定義すること