Как использовать HUnit и Cabal для автоматического тестирования?

Я боролся с Cabal большую часть дня, пытаясь заставить его функции автоматического тестирования работать с HUnit. Я прочитал документацию здесь и здесь, и у меня есть Раздел Test-Suite настроен так, как показано на рисунке, но всякий раз, когда я пытаюсь собрать пакет с использованием cabal build, Кабал говорит, что поддерживается только тип Test-Suite exitcode-stdio-1.0. Что дает?


person Dwilson    schedule 08.08.2012    source источник


Ответы (2)


Задний план

Итак, дело в том, что документация на сайте клики - это «будущая документация», то есть еще не все эти функции реализованы и выпущены. Cabal-install 0.14.0 поставляется с интерфейсом detailed-0.9, который является версией, отличной от того, что указано в документации (detailed-1.0), но я еще не сталкивался с какими-либо проблемами, связанными с этим. Если у вас есть платформа Haskell версии 2011.4, которая поставляется с cabal-install 0.10.2, вы не сможете использовать интерфейс detailed-0.9. Вам нужно будет перейти на платформу Haskell 2012.2, которая поставляется с cabal-install 0.14.0. Вы также можете просто обновить cabal-install отдельно, что я и сделал, потому что в Fedora 17 платформа Haskell находится только в версии 2011.4.

Установка

В документации здесь вы Посмотрим, как использовать detailed-0.9 интерфейс с QuickCheck. В нем упоминаются некоторые пакеты, которые имеют интерфейсы для HUnit, QuickCheck1 и QuickCheck2, но только пакет для QuickCheck2 доступен для взлома. Если вам нужны пакеты для остальных фреймворков, вам нужно использовать darcs (VCS), чтобы загрузить их с это место. Команда, которую вы хотите запустить для интерфейса HUnit, выглядит так: darcs get http://community.haskell.org/~ttuegel/cabal-test-hunit/. Возможно, вам придется отрегулировать файл .cabal, чтобы заставить его собираться, в частности, он полагается на ghc 3.* и cabal 1.10. Я изменил это на свои версии (ghc 4.* и cabal 1.14), и все собрано нормально.

Тестирование

После того, как вы создали интерфейс, вам нужно сделать кое-что в своем тестовом модуле, чтобы Cabal мог его запустить. В частности, вам нужно будет импортировать как Distribution.TestSuite, так и Distribution.TestSuite.HUnit. После этого вам нужно будет преобразовать ваши тесты HUnit в тесты Cabal, используя функцию, предоставленную в интерфейсе HUnit. Вот соответствующие строки кода:

import qualified Distribution.TestSuite as Cabal
import qualified Distribution.TestSuite.HUnit as CabalHUnit

tests = map (\(x,y) -> CabalHUnit.test x y) [("Login tests", loginTests)]

Вот и все! Вы должны иметь возможность запустить cabal configure --enable-tests && cabal build && cabal test и увидеть, как ваши модульные тесты проходят (или не проходят).

Изменить
Отредактировано, чтобы уточнить, что detailed-0.9 интерфейс включен в cabal-install 0.14.0, а не detailed-1.0.

person Dwilson    schedule 08.08.2012
comment
Решение не работает с HP 2012.2. cabal --version показывает 0.14.0 и 1.14.0 соответственно, но cabal configure --enable-tests по-прежнему говорит, что типы тестов: exitcode-stdio-1.0, detail-0.9. Так что официальный 1.14.0 по-прежнему без detailed-1.0. - person nponeccop; 01.09.2012
comment
@nponeccop Мне очень жаль, что мое решение вводило в заблуждение. Я отредактировал его, чтобы было понятнее. Чтобы было ясно, интерфейс подробного-1.0 еще не вышел, поэтому вам придется использовать интерфейс подробный-0.9. Я пока не встречал ничего, что должно быть в интерфейсе 1.0, а не в интерфейсе 0.9, а в YMMV. - person Dwilson; 03.09.2012
comment
Всем, кто попадает сюда через поиск Google: обратите внимание, что гораздо более простое решение - использовать тип теста exitcode-stdio-1.0 вместо detailed. Вот рабочий пример, сочетающий exitcode-stdio-1.0 и HUnit: gist.github.com/23Skidoo/8019225 - person Mikhail Glushenkov; 18.12.2013

Хотя ответ Двильсона хорош, detailed в настоящее время не поддерживается. Вы можете интегрировать HUnit с cabal, используя exitcode-stdio-1.0 и Test.Framework.

Он будет выводить все успешные и неудачные тесты в stdout, а также отказываться от сборки, если тесты терпят неудачу. См. Мою суть.

person risto    schedule 06.12.2014