stack runghc에서 테스트 실행

5256 단어 stackTDD하스켈
이런 구현과,

src/FooImpl.hs
module FooImpl where

foo :: Foo -> Bar
foo = ...

이런 테스트가 있었다고 한다.

test/FooImplSpec.hs
module FooImplSpec (main, spec) where

import           Test.Hspec

-- 個別のspecファイルを実行するためにはmainが必要。
main :: IO ()
main = hspec spec


spec :: Spec
spec = do
  describe "foo" $ do
    it "returns bar" $ do
      foo bar `shouldBe` foobar

지금까지 테스트를 실행할 때는 stack test 등으로 하고 있었지만, 컴파일 느리고(특히 링커의 실행이 느린), TDD 하기에는 불편하고 중복이었다. 기억이 맞으면 자동으로 -O1가 걸리므로, 이것도 재빠르게 테스트의 실행을 반복하고 싶은 경우는 방해일 것이다 1

추기: 어느 쪽 링커는 실행되고 있기 때문에, 엄청 빨라지고 있는지 말하면 미묘한 생각이 왔다.
뭐, stack에서 테스트를 실행하는 방법의 소개도 되고 있기 때문에 좋다고 할까.

그래서 확실히 인터프리터에서 실행할 수 있도록 stack runghc에서 개별 테스트를 실행하는 방법을 조사해 보았다.

미리 에 의존하는 패키지를 인스톨한 다음에
$ stack test --only-dependencies
# コマンドの内容に反して、実際には依存関係のインストールしか行わない。
# 「依存パッケージのテスト全部実行されちゃったらどうしよう!?」みたいな心配は不要。

과 같이 실행하면 된다.
$ stack runghc --package <作成中のパッケージ名> test/FooImplSpec.hs

자신의 패키지를 지정해 두는 것이 포인트.
하지 않으면 「 FooImpl 왜 modulule 없어?」라고 분노해 버린다.

당연히, runghc 왜 남은 인수를 건네주면 실행하는 example( it )를 짜낼 수도 있다.
$ stack runghc --package <作成中のパッケージ名> -- test/FooImplSpec.hs --match "実行したいexample"
#                                            ^^^^^^
# 「--」を挟まなければ`test/FooImplSpec.hs`ではなく`stack`にオプションが解釈されてしまう恐れがあるので注意。
# この辺の仕様はほかのCLIツールを見習ってもうちょっと柔軟にしてほしい気もする。

hspec에 전달할 수있는 다른 옵션은 여기을 참조하십시오.

원래의 stack test 에서 사용할 수 있었던 --file-watch 옵션과 동등한 것을 하고 싶은 경우는 watchexec 등의 다른 툴을 사용하자.

덧붙여 같은 테스트가 포함되는 편지지는 stack-templateshspec.hsfiles 에 있으므로, 곧바로 시험하고 싶은 경우는
$ stack new <作りたいパッケージの名前> hspec

실행하면 된다.



단순히 최적화를 해제하고 싶은 경우는 --fast 를 건네주면 좋다.

좋은 웹페이지 즐겨찾기