Рабочий процесс тестирования Haskell


101

Я только начал новый проект на Haskell и хотел с самого начала организовать хороший рабочий процесс тестирования. Похоже, что в Haskell есть множество отличных и уникальных инструментов для тестирования и множество различных способов их интеграции.

Я изучил:

Кажется, что все они очень хорошо работают в своих областях, но я ищу комплексный подход к тестированию, и мне было интересно, что хорошо сработало для других людей.

Ответы:


70

Правильное получение модульного тестирования, покрытия кода и тестов - это в основном выбор правильных инструментов.

  • Тест-каркас обеспечивает один универсальный магазин , чтобы выполнить все ваш HUnit тест-кейсы и QuickCheck свойство все из одной упряжки.
  • Покрытие кода встроено в GHC в виде инструмента HPC .
  • Criterion предоставляет отличные механизмы для тестирования производительности.

Я буду использовать в качестве рабочего примера пакет, который я только что начал включать с помощью модульного тестирования, покрытия кода и тестов:

http://github.com/ekmett/speculation

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

http://github.com/ekmett/speculation/blob/master/speculation.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 в Setup.lhs вручную запускает hpc и записывает свои выходные данные в ваш каталог dist.

Для бенчмаркинга история немного больше ручная, нет опции «бенчмарк Кабала». Вы можете связать свои тесты производительности с вашим тестовым крючком, но мне нравится запускать их вручную, поскольку Criterion имеет так много вариантов графической отчетности. Вы можете добавить свои тесты производительности в файл Cabal, как показано выше, присвоить им отдельные флаги компиляции, скрыть их за флагом Cabal, а затем использовать Criterion для выполнения всей тяжелой работы:

http://github.com/ekmett/speculation/blob/master/Benchmark.hs

Затем вы можете запустить тесты из командной строки и получить всплывающие окна KDE с результатами тестов и т. Д.

Поскольку на практике вы все равно живете в клике, разрабатывая код Haskell, имеет смысл интегрировать с ним вашу цепочку инструментов.

Изменить : теперь существует поддержка тестирования Кабала. См. Http://www.haskell.org/cabal/release/cabal-latest/doc/users-guide/developing-packages.html#test-suites


2
И cabal benchсейчас тоже существует.
nh2

6
Правда. Я хотел бы указать на github.com/ekmett/lens как более современный пример того , как иметь дело с cabal testи cabal bench, смешиваясь HUnit, doctestи quickcheckтесты , основанные с criterionкритериями. Код в speculationфайлах predates cabal testи cabal bench.
Эдвард КМЕТТ

2
@EdwardKmett: Я видел, что пакет lense использует только интерфейс набора тестов exitcode-stdio-1.0. В руководстве пользователя Cabal говорится, что `` предпочтительно, чтобы новые наборы тестов были написаны для интерфейса подробного 1.0 ''. Есть комментарии по этому поводу?
copton

9
@copton Они так и не реализовали. Эту документацию нужно забрать и снять.
Эдвард КМЕТТ 04

2
К сожалению, все ссылки на github указывают на основную ветку, и похоже, что все, что связано с тестированием, было удалено из файла cabal, поэтому ссылки фактически не работают.
Эндрю Фаддеус Мартин

52

Подход пропагандируется в RWH ch 11, а в XMonad примерно так:

  • Укажите все свойства системы в QuickCheck
  • Покажите тестовое покрытие с помощью HPC.
  • Подтвердите поведение пространства с помощью профилирования кучи .
  • Подтвердите поведение потока / параллельности с помощью ThreadScope .
  • Подтвердите поведение микробенчмарка с помощью Criterion .

Как только ваши основные инварианты установлены с помощью QuickCheck, вы можете начать рефакторинг, переместив эти тесты в инварианты типов.

Практики, поддерживающие ваши усилия:

  • Выполняйте упрощенную регрессию QuickCheck для каждой фиксации.
  • Опубликуйте подробную информацию о покрытии HPC.

14

Пакет test-framework действительно потрясающий. Вы можете легко интегрировать тесты HUnit и QuickCheck и получить исполняемые файлы, которые запускают только указанные наборы, на основе флагов командной строки, с несколькими целевыми объектами вывода.

Однако тестирование и профилирование - разные звери. Для профилирования я бы установил отдельный исполняемый файл, который подчеркивает только тот раздел, который вы хотите профилировать, и просто внимательно просматривает результаты профилирующих сборок и запусков (с -prof-auto-all для компиляции и + RTS -p для среды выполнения флаг).


Более активно поддерживаемый преемник test-framework - это вкусно .
sjakobi

10

Для тестирования я полагаюсь на свойства HUnit и QuickCheck и использую Haskell Test Framework для автоматического сбора всех модульных тестов и всех свойств QuickCheck.

Отказ от ответственности: я являюсь основным разработчиком Haskell Test Framework.


5
Стефан, по этому поводу так мало документации. Я думаю, это основная причина того, что он остается непопулярным. Здесь есть вопрос, который определенно заслуживает вашего внимания: stackoverflow.com/questions/8919556/testing-with-htf
Никита Волков

2
К новому выпуску 0.9.0.0 HTF прилагается довольно много документации. Также я перенес разработку на github.com/skogsbaer/HTF . Я надеюсь, что это поможет людям использовать HTF и задавать вопросы о HTF. Не стесняйтесь делать это!
stefanwehr
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.