Хаскелл тестує робочий процес


101

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

Я переглянув:

Які, здається, дуже добре працюють у своїх областях, але я шукаю комплексний підхід до тестування і цікавився, що добре працює для інших людей.

Відповіді:


70

Правильне тестування одиниць, покриття коду та орієнтирів - це здебільшого підбір правильних інструментів.

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

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

http://github.com/ekmett/speculation

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

http://github.com/ekmett/speculation/blob/master/speculation.cabal

Потім ви можете розповісти кабалу про те, як запустити тестовий набір. Оскільки тест на кабалі ще не існує - у нас є студент, який працює над цим кодом цього року! - найкращий механізм, який ми маємо, - це як використовувати механізм гака користувача користувача. Це означає перехід на "власну" збірку за допомогою кабалу та встановлення testHook. Приклад testHook, який запускає тестову програму, написану з тестовою рамкою, а потім застосовує hpc до профілю, можна знайти тут:

http://github.com/ekmett/speculation/blob/master/Setup.lhs

І тоді ви можете використовувати тест-фреймворк для з’єднання тестів QuickCheck і HUnit в одну програму:

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

Файл кабалу слід обережно включити -fhpc, щоб увімкнути тестування покриття коду, а потім testHook у Setup.lhs вручну запускає hpc і записує свій вихід у ваш дистрибутив.

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

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попередніх cabal testта cabal bench.
Едвард КМЕТТ

2
@EdwardKmett: Я бачив, що в пакеті лінзи використовується лише інтерфейс тестового набору вихідного коду-stdio-1.0. Посібник користувача Cabal зазначає, що `` бажано, щоб нові тестові набори були написані для інтерфейсу з детальною інформацією 1,0 ''. Будь-які коментарі до цього?
коптон

9
@copton Вони ніколи цього не реалізовували. Цю документацію потрібно вивезти назад і зняти.
Edward KMETT

2
На жаль, всі посилання на github все вказували на головну гілку, і схоже, що все, що стосується тестування, було видалено з файлу cabal, тому посилання фактично розриваються.
Андрій Тадеус Мартін

52

Підхід є прихильником у RWH ch 11 і в XMonad приблизно:

  • Складіть усі властивості системи в QuickCheck
  • Показати тестове покриття HPC.
  • Підтвердіть поведінку в просторі за допомогою купірування профілю .
  • Підтвердьте поведінку потоку / паралелі за допомогою ThreadScope .
  • Підтвердіть поведінку мікробензика за допомогою критерію .

Як тільки ваші основні інваріанти будуть встановлені за допомогою QuickCheck, ви можете розпочати рефакторинг, перемістивши ці тести на інваріанти типу.

Практики для підтримки ваших зусиль:

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

14

Пакет тестових рамок дійсно приголомшливий. Ви можете легко інтегрувати тести HUnit і QuickCheck і отримувати виконуючі файли, які виконують лише визначені набори, засновані на прапорах командного рядка, з кількома вихідними цілями.

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


Більш активно підтримуваний наступник тестових рамок є смачним .
sjakobi

10

Для тестування я покладаюся на властивості HUnit та QuickCheck і використовую Haskell Test Framework щоб автоматично збирати всі тестові одиниці та всі властивості QuickCheck.

Відмова: Я є головним розробником тестової системи Haskell.


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.