Вынос тестов Zig в отдельные файлы
Когда читаешь статьи о разработке на Zig, часто видишь примеры, где тесты находятся в одном файле с основным кодом. Однако при активной разработке такой подход становится неудобным.
Выносить тесты в отдельные файлы — хорошая практика. Рассмотрим это на примере проекта https://github.com/ktarasov/zigrep.
Для начала создадим директорию tests
в корне проекта и файл unit_tests.zig
. Перенесем туда все тесты из src/main.zig
. В список зависимостей добавим импорт главного модуля: const main_mod = @import("../src/main.zig");
. Вызовы функций и структур в тестах модифицируем, добавив к ним модуль, например: main_mod.parseArgs
.
Важно сделать тестируемые функции публичными, иначе тесты не скомпилируются.
Далее нужно сообщить компилятору, что тесты теперь находятся в другом месте. Для этого изменим файл build.zig
. После строки run_step.dependOn(&run_cmd.step)
добавим создание модуля с тестами:
const unit_test_mod = b.createModule({
.root_source_file = b.path("tests/unit_tests.zig"),
.target = target,
.optimize = optimize,
});
Также изменим блок добавления константы exe_unit_tests
, указав unit_test_mod
в качестве root_module
.
Вроде всё готово. Попробуем скомпилировать и запустить тесты...
О нет, ошибка: "error: import of file outside module path: './src/main.zig'". Компилятор не импортирует файлы за пределами модуля unit_tests.zig
.
Придется явно добавить основной модуль в импорт test-модуля. Для этого вернемся в build.zig
и добавим после создания exe_unit_tests
следующую строку:
exe_unit_tests.root_module.addImport("zigrep", exe_mod);
Снова запустим тесты — и они успешно пройдут!
Итого: мы вынесли тесты в отдельный файл и создали иерархию директорий, разделив основной код и тесты.