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

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

Ответы

Ответ 1

Фон

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

Установка

В документации здесь вы увидите пример использования интерфейса 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 Tests, используя функцию, предусмотренную в интерфейсе 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.

Ответ 2

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

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