Unit тестирование
Мне понравилась идея гайдов в 1 скрин, помойму это одновременно показывает насколько это просто и является хорошей шпаргалкой. Так что вот еще один.
Meson

Как делать Unit тесты в Meson:
добавить в meson build
test(название, executable(execname, files, deps))
Всё, meson неплохо интегрирован в VS Code, так что теперь в его подразделе просто появятся пункты запуска тестов, клик по ним скомпилирует и запустит соответствующий тест.
Фичи
Параметры для тестов
test('command line test', exe, args : ['first', 'second'])MALLOC_PERTURB_ По умолчанию для переменной среды
MALLOC_PERTURB_задано случайное значение между 1..255. Это может помочь обнаружить утечки памяти в конфигурациях с использованием glibc, в том числе с компиляторами, не относящимися к GCC.Coverage Флаг
-Db_coverage=true, вкючает создание отчетов о покрытии кода. Meson автоматически определит, какие инструменты генератора покрытия вы установили, и сгенерирует соответствующие цели. Эти цели являютсяcoverage-xmlиcoverage-text, обе предоставлены Gcovr (версия 3.3 или выше). Дляcoverage-htmlтребуются Lcov и GenHTML или Gcovr . Для удобства мониторинга покрытия также создается цель высокого уровня, которая, по возможности, создаст все 3 типа отчетов о покрытии.Вывод этих команд записывается в каталог журнала
meson-logsв вашей директории сборки.Parallelism Чтобы сократить время тестирования, Meson по умолчанию будет запускать несколько модульных тестов параллельно. Если тест не следует запускать паралельно, укажите флаг
test('unique test', t, is_parallel : false)По умолчанию Meson использует столько параллельных процессов, сколько ядер имеется на тестовой машине. Для переопределения и этого параметра используйте переменную окруженияMESON_TESTTHREADS=5 ninja testPriorities Тестам может быть назначен приоритет, который определяет, когда тест начнется.
Subsets Для ясности рассмотрим meson.build, содержащий:
Укажите тест (ы) по имени, например:
$ meson test A Dили по имени suite$ meson test --suite (sub)project_name:suiterepeat
$ meson test --repeat=10wrap
$ meson test --wrap=valgrind testnameargs for wrap
$ meson test --wrap='valgrind --tool=helgrind' testnameGDB
$ meson test --gdb testnameПример команды для теста который даёт сбой в редких случаях
$ meson test --gdb --repeat=10000 testnameЭто автоматически запускает тест до 10 000 раз под GDB. В случае сбоя программы GDB остановится, и пользователь сможет отладить приложение.путь к GDB
$ meson test --gdb --gdb-path /path/to/gdb testnameerrorlogs Meson сообщит результаты, полученные в результате неудачных испытаний, вместе с другой полезной информацией в качестве переменных среды. Это полезно, например, когда вы запускаете тесты на Travis-CI, Jenkins и т.п.
Vala
GLib.Test
В GLib уже встроен юнит тест фреймворк (а значит и в Vala), все что нужно это инициализировать его передав аргументы Test.init (ref args), добавить функций Test.add_func(test_path,func) и запустить Test.run()
Фичи:
timer_startиtimer_elapsedдля замера времени и таймаутовTest.minimized_resultиTest.maximized_resultдля отображения результатов бенчей по времени с сортировкой;Test.skip(string msg)для пропуска теста с сообщением;Test.summary- Установите сводку для теста, которая описывает, что проверяет тест, и как он проходит проверку;Test.log_set_fatal_handler(log_func)для кастомного обработчика ошибок который будет решать насколько они фатальны для завершения программы, тут сложно, читать фул здесь;Test.bug_base(URL)иTest.bug(string)вот это вообще круто, в отчет будут сразу вставленны ссылки на issue например гитхаба(на скриншоте это есть);Test.fail()отметить тест зафейленным, но продолжать его выполнение; --Test.failed()возвращаетtrueесли тест уже зафейлин;Test.trap_reached_timeoutдобавляет в тест timeout;Test.trap_assert_passedЕсли вы хотите выстроить зависимости между тестами, чтобы например если тест А не прошел то Б даже не стартовал и наоборот. Данная функция это assert что предыдущий тест был завершен успешно;Test.incomplete(string? Msg = null )Указывает что тест не пройден из-за неполной функциональности, функция может быть вызвана несколько раз за один и тот же тест;Test.trap_subprocess(test_path,timeout,flags)возвращает текущую программу(ага) как подпроцесс для запуска из другой при вызове с аргументомnullто есть, Программа А делаетtrap_subprocess(путь до exec программы Б)а такжеtrap_assert_failedиtrap_assert_stderrдля перехвата результата и вывода. А в программе Б стоитtrap_subprocess (NULL, 0, 0);который перезапускает Б как подпроцесс А. Пример
Это далеко не все, но я думаю хватит, осталось подключение файлов к конкретным тестам по путям, TestCase - класс-тест, функции для генерации рандомных значений и тд.
Для копирования
ValaDate
Также, если одних Unit тестов вам мало, существует фреймворк для тестирования ValaDate рассказывать тут я про него не буду, у автора и так хорошая вики. Только приведу список фич и пример. И вот еще статейка Writing tests for Vala из 2012.
Arrange >> Act >> Assert
Описание
Для разработчиков Vala, которым необходимо тестировать свой код, Valadate представляет собой мощную среду тестирования, которая предоставляет функции поведенческого, функционального и модульного тестирования, помогающие им писать отличное ПО с открытым исходным кодом. В отличие от других сред тестирования, Valadate разработан специально для Vala, в то же время плавно интегрируясь в существующие наборы инструментов.
Фичи:
Автоматическое обнаружение тестов, также как в JUnit или .NET Framework.
Функции утилиты для ожидания в
mainloop, пока не произойдет указанное событие или тайм-аут.Поддержка асинхронных тестов.
Служебные функции, предоставляющие временный каталог для тестов.
Пропущенные тесты и ожидаемые сбои.
Пример
Last updated
Was this helpful?