作成: 2018-06-26T15:38:06+09:00

doctestを実行するようにしたのですが, 全部指定するとTravis CIが通らない

これまでhaddock形式のコメントで使い方を書く時にdoctestの形式でコメント書いていました. しかし, 実際doctestは実行していませんでした. いい加減実行してテストしておこうと思ったので導入しました.

Travis CIのコマンドを変えずにテストを自動実行して欲しいのでコマンドラインでの実行はやりたくないですね.

Stack(Cabal)と連携して実行するようにしたいです.

package.yamlに書くことにします.

doctest-discoverを導入してみました しかし公式の導入方法だとだと引数にソースファイルを全指定する必要があるようですね. (勘違い) それはファイル指定に漏れが発生しそうなのでイヤですね. そこでdoctest-discoverを使うと, ファイル一覧を自動生成してくれるようですね. package.yamlに以下のように指定します. tests : doctest : main : doctest-driver.hs ghc-options : - -fwarn-tabs - -threaded - -rtsopts - -with-rtsopts=-N dependencies : - application - doctest - doctest-discover ここで source-dirs: test と指定したい所ですが, 既にHspecを導入しているため以下のエラーが出ます. …/test/Spec.hs:2:8: error: File name does not match module name: Saw: ‘Main’ Expected: ‘Spec’ とりあえずのワークアラウンドとしては, 指定せずにトップディレクトリに doctest-driver.hs を置けば問題なくなります. doctest-driver.hsには公式通り以下を書きます. {-# OPTIONS_GHC -F -pgmF doctest-discover #-} わざと間違ったコメントを書いてエラーを吐くことを確認. …:117: expression `foo (-2.5)' expected: -2 but got: -3 Examples: 7 Tried: 7 Errors: 0 Failures: 1

全部指定すると遅すぎる これだとやたらとテスト実行が遅いんですよね. 手元のマシンで32秒はかかってしまいます. 手元だと問題ないのですが, Travis CIが毎回相当遅くなるのは許容できないですね. 相当時間かかってます. Travis CIの仮想マシンはCPUがかなり貧弱ですからね. まあ時間がかかってもちょっと待てば良いかと思ってたら No output has been received in the last 10m0s, this potentially indicates a stalled build or something wrong with the build itself. Check the details on how to adjust your build configuration on: https://docs.travis-ci.com/user/common-build-problems/#Build-times-out-because-no-output-was-received と言われてしまいました. 何も出力せずに10分沈黙するのはダメみたいですね. これを改善するために, Template Haskellでコードを大量に自動生成するモジュールをテスト対象から除外しようとしました. しかしドキュメントを見て設定してもさっぱりうまくいきませんでした. テストがあるモジュールを除外指定してみても, テスト認識してしまっていて除外設定がうまく動いてないことがわかります. どういうことだと思ってdoctest-discoverやめて自分で書いてみたら, doctestは -isrc のようにディレクトリが指定されていると, import先を自動で見ていって全てテスト実行することがわかりました. -isrc を指定しないと, doctestはcabalのdependenciesを見ないため, 直接依存していないパッケージも見に行ってしまって, import Foundation のようなimportがあると, どっちを参照すれば良いのかわからなくなってエラーになるようです. 他にも孤立インスタンスをちゃんと参照できずにエラーになるようですね.