在抖动构建失败的情况下检测错误并构建报告

时间:2016-04-27 12:21:41

标签: shake-build-system

我正在使用摇动测试套件。我有多个独立测试,表示为一组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

谢谢。

1 个答案:

答案 0 :(得分:0)

问题b最简单的回答。如果构建引发错误,它将不会写出报告 - 可以改变是合理的(我可以通过两种方式看到参数)。但是,您可以通过--no-build两次调用main来自动执行shake条件 - 首先与您现在一样,第二个使用withArgs或使用shake shakeOptions{shakeReport=...} mempty。基本上你现在就“完成”你现在正在做的“手动”,但是把它放到main函数中,这样它就是自动的。

对于主要问题,我怀疑答案是你应该标记失败没有异常,但有结果值。例如,test1/done可以记录TRUE / FALSE,说明测试是否有效。然后,您可以alldone取决于所有*/done值并写入单个报告。这样你的构建总是会通过(除非你得到一些根本错误的东西),但传递的结果将是“TESTS PASS”或“TESTS FAIL”。