Различия между версиями 3 и 4
Версия 3 от 2022-11-29 17:53:16
Размер: 9271
Редактор: FrBrGeorge
Комментарий:
Версия 4 от 2022-11-29 19:49:34
Размер: 9271
Редактор: FrBrGeorge
Комментарий:
Удаления помечены так. Добавления помечены так.
Строка 105: Строка 105:
 1. В репоизтории с домашними заданиями создать подкаталог `09_Testing` и положить решение туда  1. В репоизтории с домашними заданиями создать подкаталог `11_Testing` и положить решение туда

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

Целесообразно начать лекцию с преобразования исходного текста — это шаг №0 репозитория с примером

  • в действительности — шесть шагов).

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

  • модульное → системное → (интеграционное) → приёмочное
  • Модульное: тысячи их

  • Модульное, XUnit

    • Немного терминологии
    • Runner: кто запускает тесты
    • Иерархия test → case → suite
      • Каждый test может завершиться успехом или неуспехом

      • Если все тесты из case успешны, нечто считается оттестированным

      • Для разных случаев / подсистем / etc некоторые случаи объединяются в suit

    • Fixture: подготовка (set up) и последующая ликвидация (tear down) окружения, которое нужно тестировать
      • (например, изготовление специальных тестовых объектов)
  • Coverage: насколько полно оттестирована программа
  • Системное и далее — слишком много методологий
  • CI — не рассматриваем, хотя, возможно, стоило бы

Check

Check:

Check + autotools

Репозиторий с примером

  • За основу взят https://github.com/skeeto/fantasyname/tree/master/c

    • (это довольно безумная генерилка несуществующих имен с непростым синтаксисом шаблонов)
    • Автор — адепт учения «include-библиотеки», придётся превратить в классическую библиотеку
    • Лицензия у него: The Unlicense

Этапы разработки:

  1. Предварительные шаги
  2. Простой тест. Здесь и далее раннером работает shell-perl-… начинка ./test-driver, поставляемая с autotools.

  3. Тест переписан на libcheck.

  4. Тест ещё раз переписан на использование checkmk

  5. Авторские тесты удалены из основной прогарммы и переписаны на checkmk

    • Поскольку runner-ом у нас всё ещё работает ./test-driver, с его точки зрения это один тест, все подробности про внутренние suite и cases libcheck-а ему неизвестны.

    • TODO Возможно, стоит прикрутить к этому Test_Anything_Protocol, поддержка есть и в autotools, и в check

  6. Небольшая плюшка — просмотр журнала тестирования

    • Как минимум, CK_VERBOSITY=verbose make check и  grep "" *.log

TODO добавить фикстуру

Тестовое покрытие

Покрытие кода

  • Запускаются все тесты со сбором статистики:
    • Какие строчки кода сколько раз выполнялись
    • В какую сторону и сколько раз ветвились условия
    • … (см. по ссылке)
  • Составляется БД с этой статистикой
  • Инструменты анализа и просмотра
    • Самый частый критерий: проценты покрытия кода

Опять-таки тысячи их, посмотрим GCov

  • Встроен в gcc ⇒ требует специальной пересборки

    • Понятно, что эксплуатировать такие бинарники не надо

В тестовом репозитории:

  1. Поддержка gcov

    • в частности, просто make check; cd src; gcov -o .libs libnamegen (

    • libnamegen — это название базы, собранной при make check.

CMake / CTest / …

(Не успеем)

Meson / Gcovr

(Не успеем)

Д/З

  1. Изучить выбранный вами фреймворк тестов для Си
    • Например, check, autotools и пример из лекции

      • В ALT Linux понадобятся:
        • make, automake, autoconf

        • libtool

        • libcheck-devel, check

        • (кажется, всё?)
  2. Взять за основу Growable Memory Buffers for C99

    • Превратить в библиотеку
      • (!) Функция в ней всего одна, остальное макросы, и переделывать это не надо

      • Все макросы уезжают в .h-файл

    • Приложение-пример можно не писать

    • Тесты взять из авторского файла tests.c

      • Тесты на память с setjmp() можно выкинуть.

    • Оформить их сообразно правилам фреймворка в несколько отдельных тестов
      • <!> (необязательно) попробовать добиться как можно более полного покрытия (предельные тексты, например, с помощью prlimit)

    • Сделать примитивную поддержку проверки покрытия (чтобы проценты показывало)
  3. В репоизтории с домашними заданиями создать подкаталог 11_Testing и положить решение туда

LecturesCMC/LinuxApplicationDevelopment2022/11_Testing (последним исправлял пользователь FrBrGeorge 2022-11-29 19:49:34)