1

テストスイートにシェイクを使用しています。のセットとして表される複数の独立したテストがありRuleます。これらのルールのいずれかが失敗すると、テストは失敗します。最後に、すべてのテスト ステータスを含むレポートを作成します。

私の問題は次のとおりです。

a) どのテストが実行または失敗したかを検出する必要があります。実際、私は を使用してごまかしてactionOnExceptionいますが、それは各ルールの各コマンドのボイラープレートが多く、複雑です (IORef失敗したステータスを保存するには、ステータス ファイルを作成するか、操作する必要があります)。

b) 最終レポートの一部として Shake レポートを書きたいのですshakeReportが、エラーが発生した場合にファイルを書きません。私の唯一の解決策は、--no-build --report out.html便利ではないビルドを再度実行することです。

編集:実際にはテストが実行されており、依存関係を構築しています。ビルドはおおよそ次のようになります。

main = do
  -- when this fails, `dumpTests` is called,
  -- but the shake report is not written
  _ <- (try shakeMain) :: IO (Either SomeException ())

  -- This write my test report from the success informations it can gather
  -- in the directory hierarchy
  dumpTests

smakeMain = shakeArgs {shakeStaunch=True, shakeReport=["report.html"]} $ do

   "tests" ~> need ["test1/done", "test2/done", ...]

   -- this rules completly runs a test
   "*/done" %> \done -> do
       let test = takeDirectory done
       -- clear all the leftover to be sure that there is nothing useless left. This is important because I use theses outputs to know which command succeeds or fails.
       liftIO $ removeFiles test ["stdout.log", "*/image/*.exr", "*/image/*.png", "done"]

       need [test </> "stdout.log"]

       results <- getDirectoryFiles (test </> "image") ["*.exr"]

       need (map (-<.> "png") results)

       writeFile' done "done"

   "*/stdout.log" %> \log -> do
        let path = takeDirectory log </> "test"
        need [path]

        aCmd path -- this builds stdout.log and all exrs

   "*/image/*.png" %> \png -> do
         need [(png -<.> "exr")]
         toExr png

ありがとうございました。

4

1 に答える 1

0

質問 b は、最も簡単に答えられます。ビルドでエラーが発生した場合、レポートは出力されません。変更できるのは当然です (引数は両方の方法で確認できます)。ただし、呼び出しを2 回行う--no-buildことでピースを自動化できます。1回目は現在のように、2 回目はまたは を使用します。基本的には、現在行っていることを「手動で」正確に行いますが、それを関数に入れて自動化します。mainshakewithArgsshake shakeOptions{shakeReport=...} memptymain

主な質問については、例外ではなく結果の値で失敗をマークする必要があるというのが答えだと思います。たとえばtest1/done、テストが機能したかどうかを示す TRUE/FALSE を記録できます。次にalldone、すべての値に依存し*/done、単一のレポートを作成することができます。そうすれば、ビルドは常に成功しますが (何か根本的な間違いがない限り)、成功した場合の結果は "TESTS PASS" または "TESTS FAIL" になります。

于 2016-04-28T14:32:50.310 に答える