2016-04-27 3 views
1

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

Мои вопросы:

а) мне нужно определить, какой тест работает или не удается. На самом деле я обманываю, используя 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 

спасибо.

+0

Являются ли тесты в 'Action' или' IO'? Они сначала «строят» свои зависимости? –

+0

Пример добавлен, все находится в 'Action' /' Rule', за исключением окончательного создания отчета. На самом деле я буду рад, что окончательное создание отчета в «Правиле», но мне нужен способ его создания, даже если его зависимости терпят неудачу. – Guillaum

ответ

0

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

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

+0

Для б) решения, это умно, спасибо. – Guillaum

+0

Для основного вопроса ваше решение работает, однако оно заставляет меня думать об очистке test1/done перед попыткой команды, потому что, если команда по какой-либо причине не работает, test1/done сохранит результаты предыдущей попытки, которая может вводить в заблуждение. Однако вы подтвердили, что нет простого решения «из коробки», которое для меня является удовлетворительным ответом. Спасибо. – Guillaum

+0

Если правило test1/done всегда успешно (насколько это касается Shake), но успех/сбой теста записывается в файл, тогда все будет всегда обновляться должным образом. –

Смежные вопросы