Рабочий процесс тестирования Haskell
Я только что начал новый проект Haskell и хотел создать хороший рабочий процесс тестирования с самого начала. Похоже, что у Haskell есть много отличных и уникальных инструментов тестирования и множество различных способов их интеграции.
Я бы посмотрел в:
которые все, кажется, работают очень хорошо в своих областях, но я ищу комплексный подход к тестированию и задавался вопросом, что хорошо работает для других людей.
4 ответов:
получение модульного тестирования, покрытия кода и тестов в основном связано с выбором правильных инструментов.
- test-framework предоставляет единый магазин для запуска всех ваших HUnit.
- критерий обеспечивает некоторые довольно большие бенчмаркинг машины
Я буду использовать в качестве запуск примера пакета, который я только что начал включать с помощью модульного тестирования, покрытия кода и тестов:
http://github.com/ekmett/speculation
вы можете интегрировать свои тесты и тесты непосредственно в свой файл cabal, добавляя для них разделы и маскируя их за флагами, чтобы они не делали это так, чтобы каждый пользователь вашей библиотеки имел доступ (и хотел использовать для себя) точную версию инструментов тестирования, которые у вас есть выбранный.
http://github.com/ekmett/speculation/blob/master/speculation.cabal
затем вы можете рассказать кабалу о том, как запустить свой набор тестов.
поскольку тест cabal еще не существует - у нас есть студент, работающий над ним в течение лета этого года кода! -- лучший механизм у насвот как использовать механизм пользовательского крючка cabal. Это означает переход к "пользовательской" сборке с cabal и настройку testHook. Пример testHook, который запускает тестовая программа написана с помощью test-framework, а затем применяет hpc к профилю его можно найти здесь:http://github.com/ekmett/speculation/blob/master/Setup.lhs
и затем вы можете использовать test-framework для объединения тестов QuickCheck и HUnit в одну программу:
http://github.com/ekmett/speculation/blob/master/Test.hs
файл cabal там осторожно включается-fhpc для включения тестирования покрытия кода, а затем testHook в настройке.lhs вручную запускает hpc и записывает его вывод в ваш dist dir.
для бенчмаркинга история немного более ручная, нет опции "cabal benchmark". Вы можете подключить свои тесты в свой тестовый крючок, но мне нравится запускать их вручную, так как критерий имеет так много графических параметров отчетности. Вы можете добавить свои тесты в файл cabal, как показано выше, дать им отдельные флаги компиляции, скрыть их за флагом cabal, а затем использовать критерий для всех тяжелая подъемная сила:
http://github.com/ekmett/speculation/blob/master/Benchmark.hs
затем вы можете запустить свои тесты из командной строки и получить всплывающие окна KDE с результатами тестов и т. д.
поскольку на практике вы живете в кабале в любом случае при разработке кода Haskell, имеет смысл интегрировать с ним свою инструментальную цепочку.
Edit Кабал поддержке испытаний в настоящее время не существует. Видеть http://www.haskell.org/cabal/release/cabal-latest/doc/users-guide/developing-packages.html#test-suites
подход является адвокатом в RWH ch 11 и XMonad примерно:
- укажите все свойства системы в QuickCheck
- показать покрытие тестами С HPC.
- подтвердите поведение пространства с помощью профилирование кучи.
- подтвердите потоковое / параллельное поведение с помощью ThreadScope.
- подтвердите поведение microbenchmark с помощью критерий.
Как только ваши основные инварианты будут установлены с помощью QuickCheck, вы можете начать рефакторинг, перемещая эти тесты в инварианты типа.
практика для поддержки ваших усилий:
- запустите упрощенную регрессию быстрой проверки на каждом коммите.
- опубликовать сведения о покрытии HPC.
The test-framework package это очень круто. Вы можете легко интегрировать тесты HUnit и QuickCheck и получить исполняемые файлы, которые запускают только указанные комплекты на основе флагов командной строки, с несколькими выходными целями.
тестирование и профилирование-это разные звери. Для профилирования я бы создал отдельный исполняемый файл, который подчеркивает только тот раздел, который вы хотите профилировать, и просто внимательно смотрит на результаты профилирования сборки и запуска (с -prof-auto-all for компиляция и +RTS-p для флага времени выполнения).
для тестирования я полагаюсь на свойства HUnit и QuickCheck и использую Haskell Test Framework для автоматического сбора всех модульных тестов и всех свойств QuickCheck.
отказ от ответственности:я главный разработчик тестовой платформы Haskell.
Comments