Обнаружение ошибок и отчет о сборке в случае сбоя при сборке встряхивания

Я использую встряхивание для набора тестов. У меня есть несколько независимых тестов, представленных в виде набора Rule. Если какое-либо из этих правил не выполняется, тест не проходит. Наконец, я создаю отчет, содержащий все статусы тестов.

Мои проблемы:

а) Мне нужно определить, какой тест выполняется, а какой нет. На самом деле я жульничаю, используя actionOnException, но в каждой команде в каждом правиле много шаблонов, и это сложно (я должен написать файл состояния или поиграть с IORef, чтобы сохранить статус сбоя).

б) Я хочу написать отчет 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

Спасибо.


person Guillaum    schedule 27.04.2016    source источник
comment
Тесты в Action или IO? Сначала они строят свои зависимости?   -  person Neil Mitchell    schedule 27.04.2016
comment
Пример добавлен, все в Action/Rule кроме создания окончательного отчета. На самом деле я был бы рад создать окончательный отчет в Rule, но мне нужен способ его создания, даже если его зависимости не работают.   -  person Guillaum    schedule 28.04.2016


Ответы (1)


На вопрос б ответить проще всего. Если сборка выдает ошибку, она не выпишет отчет - разумно, что можно изменить (я вижу аргументы в обоих направлениях). Однако вы можете автоматизировать часть --no-build, заставив main вызывать shake дважды - сначала, как вы делаете сейчас, а затем с помощью withArgs или используя shake shakeOptions{shakeReport=...} mempty. По сути, вы делаете именно то, что делаете сейчас, «вручную», но помещаете это в функцию main, чтобы это происходило автоматически.

Что касается основного вопроса, я подозреваю, что ответ заключается в том, что вы должны отмечать ошибки не исключениями, а значением результата. Например, test1/done может записывать ИСТИНА/ЛОЖЬ, говорящая о том, сработал тест или нет. Тогда у вас может быть alldone, который зависит от всех значений */done и пишет один отчет. Таким образом, ваша сборка всегда будет проходить успешно (если только вы не ошибетесь в чем-то принципиальном), но результатом будет либо «ТЕСТЫ ПРОЙДЕНЫ», либо «ТЕСТЫ НЕ ПРОЙДЕНЫ».

person Neil Mitchell    schedule 28.04.2016
comment
Что касается основного вопроса, ваше решение работает, однако оно заставляет меня подумать об очистке test1/done перед попыткой выполнения команды, потому что, если команда по какой-либо причине завершится неудачно, test1/done сохранит результаты предыдущей попытки, что может ввести в заблуждение. Однако вы подтвердили, что простого готового решения не существует, что меня удовлетворяет. Спасибо. - person Guillaum; 28.04.2016
comment
Если правило test1/done всегда проходит успешно (для Shake), но успех/неудача теста записывается в файл, то все всегда будет корректно обновляться. - person Neil Mitchell; 28.04.2016
comment
PS. Если вы хотите обсудить более подробно, список рассылки или трекер github могут быть лучшим местом, и мы можем обновить SO с ответом впоследствии (оба связаны в нижней части shakebuild.com) - person Neil Mitchell; 28.04.2016