テストスイートにシェイクを使用しています。のセットとして表される複数の独立したテストがあり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
ありがとうございました。