Библиотека check.h • Как и зачем хранить тестовые данные во внешних файлах

Развиваем тему «А давайте запускать один тест на разных наборах данных». Эта свежая мысль доведёт нас сегодня до xUnit, фикстур и фокусов с макросами в C. Полезно любому, кто смотрит в сторону тестирования, независимо от языка разработки. Таймлайн: 00:00 — Введение: библиотека Check (Чекпс), цель — отделить данные от обработки. 00:41 — Последнее «копание» в Check, связь с другими фреймворками юнит-тестирования. 01:15 — Где найти библиотеку, ссылка на референс, плюсы и минусы документации. 02:09 — Напоминание о прошлых разборах: базовые тесты и запуск циклов. 02:28 — Раздел Advanced Features в документации, интересные возможности. 03:05 — Что такое Check как фреймворк. 03:40 — Фреймворк и юнит-тестирование: объяснение простыми словами. 04:28 — На пальцах: набор правил для организации программ. 05:12 — Аналогии с Django, React и другими фреймворками. 05:28 — Юнит-тестирование: тестируем функции, а не интеграцию. 06:02 — C-программы и их общность с другими языками высокого уровня. 06:43 — Бытовое понимание юнит-тестов и «модель тестирования». 07:17 — Хранение тестовых данных во внешних файлах как более высокий уровень абстракции. 08:06 — Модель юнит-тестирования: общее понимание. 09:10 — Термины во фреймворках: почему появляются новые слова. 10:14 — Каждый фреймворк изобретает свою терминологию для старых идей. 10:50 — Модель xUnit как стандарт де-факто. 11:27 — Питон и тестирование: кейсы, моки, фикстуры и прочие термины. 12:13 — Схема xUnit: Runner → Suites → Cases → Fixtures. 13:44 — Кейсы независимы, порядок не должен влиять на результат. 13:51 — Fixtures как данные для кейсов. 14:22 — Аналогия с С-программой: точка входа, модули, функции, аргументы. 15:47 — Новые слова = старые идеи, понимания этого достаточно для старта. 16:26 — Fixtures ≈ аргументы функций. Вопрос: как вынести их во внешние файлы. 17:05 — Метод: сопоставлять новые термины со знакомыми парадигмами. 17:44 — Пример предыдущего кода: глобальные массивы как источник данных. 18:35 — Циклические кейсы в Check: прогон теста на разных данных. 19:19 — Сравнение ожидаемого и реального результата, глобальные массивы. 20:28 — Переменная _i, предоставляемая фреймворком. 21:02 — Обращение к массивам через индекс, минимальная логика сравнения. 22:01 — Макросы, имена функций и корреляция с кейсами. 23:12 — Fixtures = аргументы теста. Но данные внутри кода неудобны. 24:11 — Fixtures чаще задают «среду» (setup/teardown). 25:00 — Check умеет многопоточность и выделение кейсов в отдельные потоки. 25:28 — Проблема глобальных переменных и копипаста. Ошибки при изменениях. 27:28 — Решение в xUnit: setup/teardown для каждого кейса. 29:20 — Setup/teardown напоминают открытие/закрытие файла. 30:06 — Важность закрытия ресурсов после теста. 31:05 — Требования к хранению данных во внешних файлах: каждому кейсу свой файл. 32:20 — Привязка имени файла к имени кейса через макросы. 33:03 — Каждый кейс имеет свой набор данных. 34:02 — Поток условий: нет готового решения, нужно шаг за шагом. 35:00 — Программистские задачи решаются не «сел и сделал», а через размышления. 37:23 — Железное знание: придётся работать с файлом и курсором. 38:15 — Идея: расширенный «курсор», отвечающий за работу с файлом. 39:02 — Одна строка = один набор данных. 40:25 — В первой строке можно хранить формат данных. 41:05 — C не позволяет хранить динамические типы, поэтому только жёсткие структуры. 42:17 — Курсор должен уметь: открыть файл, закрыть, выдать элемент. 43:38 — Setup снаружи, teardown снаружи → гарантированное закрытие. 45:09 — Перед кейсом вызывается setup, после — teardown. 46:19 — Макросы связывают функции setup/teardown с кейсом. 47:00 — Имя кейса используется как имя файла. 48:00 — Данные строки превращаются в переменные через scanf. 49:18 — Реализация структуры курсора: путь, дескриптор файла, шаблон, номер элемента. 50:15 — Описание элемента: номер и значение. 51:12 — Функции: init/destroy, next, count, get element. 52:07 — Макросы: для создания глобального курсора, setup, teardown. 53:00 — Глобальная переменная курсора и функции для конкретного кейса. 54:12 — Setup открывает файл и инициализирует курсор. 55:22 — Teardown закрывает курсор. 56:02 — Создание cyclic test с привязкой к курсору. 57:11 — Использование курсора вместо массива: получаем i-тую строку. 58:02 — Сборка в Docker: библиотека Check+ и тесты. 58:35 — Пример запуска кейсов, все проходят. 59:09 — Данные: строки с тремя числами, проверяем сумму. 1:00:03 — Макрос fix2fun: создаёт курсор, setup, teardown. 1:00:23 — Циклический тест: получает элемент из курсора. 1:01:20 — Вывод пути к файлу и значения элемента. 1:02:41 — Парсинг строки по шаблону и проверка суммы. 1:05:06 — Тестирование функции sum(A, B) == C. 1:06:19 — Проверка с неправильными данными → тест ломается. 1:07:15 — Применимость подхода при большом числе тестов и данных. 1:07:56 — Недостаток: необходимость указывать SIZE. Конспект:

Смотрите также