Unit тестирование

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

Meson

Как делать Unit тесты в Meson:

  1. добавить в 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 test

  • Priorities Тестам может быть назначен приоритет, который определяет, когда тест начнется.

    test('started second', t, priority : 0)
    test('started third', t, priority : -50)
    test('started first', t, priority : 1000)
  • Subsets Для ясности рассмотрим meson.build, содержащий:

    test('A', ..., suite: 'foo')
    test('B', ..., suite: 'foo')
    test('C', ..., suite: 'bar')
    test('D', ..., suite: 'baz')

    Укажите тест (ы) по имени, например: $ meson test A D или по имени suite $ meson test --suite (sub)project_name:suite

  • repeat $ meson test --repeat=10

  • wrap $ meson test --wrap=valgrind testname

  • args for wrap $ meson test --wrap='valgrind --tool=helgrind' testname

  • GDB $ meson test --gdb testname

  • Пример команды для теста который даёт сбой в редких случаях $ meson test --gdb --repeat=10000 testname Это автоматически запускает тест до 10 000 раз под GDB. В случае сбоя программы GDB остановится, и пользователь сможет отладить приложение.

  • путь к GDB $ meson test --gdb --gdb-path /path/to/gdb testname

  • errorlogs Meson сообщит результаты, полученные в результате неудачных испытаний, вместе с другой полезной информацией в качестве переменных среды. Это полезно, например, когда вы запускаете тесты на Travis-CI, Jenkins и т.п.

Vala

GLib.Test

В GLib уже встроен юнит тест фреймворк (а значит и в Vala), все что нужно это инициализировать его передав аргументы Test.init (ref args), добавить функций Test.add_func(test_path,func) и запустить Test.run()

test_path это абстрактный путь к объекту тестирования, например "xml/read" "xml/parse", вложенность может быть любой глубины. Как вы можете заметить для каждой вложенности выводиться сообщение # Start of xml tests # End of xml tests

Фичи:

  • 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); который перезапускает Б как подпроцесс А. Пример

Функциональность предоставляемую trap_subprocess() прекрасно заменяет meson

Это далеко не все, но я думаю хватит, осталось подключение файлов к конкретным тестам по путям, TestCase - класс-тест, функции для генерации рандомных значений и тд.

Для копирования

#main meson.build
project('Compose', 'c', 'vala',
        version: '1.0.0-dev')

glib_dep = dependency('glib-2.0')
libxml_dep = dependency('libxml-2.0')

subdir('src')
subdir('tests')

ValaDate

Также, если одних Unit тестов вам мало, существует фреймворк для тестирования ValaDate рассказывать тут я про него не буду, у автора и так хорошая вики. Только приведу список фич и пример. И вот еще статейка Writing tests for Vala из 2012.

Arrange >> Act >> Assert

Описание

Для разработчиков Vala, которым необходимо тестировать свой код, Valadate представляет собой мощную среду тестирования, которая предоставляет функции поведенческого, функционального и модульного тестирования, помогающие им писать отличное ПО с открытым исходным кодом. В отличие от других сред тестирования, Valadate разработан специально для Vala, в то же время плавно интегрируясь в существующие наборы инструментов.

Фичи:

  • Автоматическое обнаружение тестов, также как в JUnit или .NET Framework.

  • Функции утилиты для ожидания в mainloop, пока не произойдет указанное событие или тайм-аут.

  • Поддержка асинхронных тестов.

  • Служебные функции, предоставляющие временный каталог для тестов.

  • Пропущенные тесты и ожидаемые сбои.

Пример

[Test (name="Annotated TestCase with name")]
public class MyTest : Valadate.Framework.TestCase {

	[Test (name="Annotated Method With Name")]
	public void annotated_test_with_name () {
		assert_true(true);
	}


	[Test (name="Asynchronous Test", timeout=1000)]
	public async void test_async () {
		assert_true(true);
	}

	[Test (skip="yes")]
	public void skip_test () {
		assert_true(false);
	}

}



1..3
# Start of Annotated TestCase with name tests
ok 1 /Annotated TestCase with name/Annotated Method With Name
ok 2 /Annotated TestCase with name/Asynchronous Test
ok 3 /Annotated TestCase with name/skip_test # SKIP Skipping Test skip_test
# End of Annotated TestCase with name tests

Last updated