3. autopkgtest: Автоматическое тестирование пакетов¶
Спецификация DEP 8 определяет, как можно легко интегрировать автоматическое тестирование в ваши пакеты. Для этого, необходимо:
добавить следующую строчку к разделу Source в debian/control:
XS-Testsuite: autopkgtest
добавить файл debian/tests/control, который определяет требования к тестовому окружению,
добавить тесты в debian/tests.
3.1. Требования к тестовому окружению¶
В файле debian/tests/control вы можете определить требования к тестовому окружению. Например, если тесты не проходят при сборке, или требуются права root – вы перечисляете необходимые для тестов пакеты. В Спецификации DEP 8 вы найдёте все доступные опции.
Ниже мы рассмотрим пакет исходного кода glib2.0. В очень простом случае он будет выглядеть так:
Tests: build
Depends: libglib2.0-dev, build-essential
Это будет означать, что для теста debian/tests/build требуются пакеты libglib2.0-dev и build-essential.
Примечание
В поле Depends можно указать @, если вы хотите установки всех бинарных пакетов, собранных из рассматриваемого пакета исходного кода.
3.2. Настоящие тесты¶
Тест, соответствующий рассмотренному выше примеру, будет выглядеть так:
#!/bin/sh
# autopkgtest check: Build and run a program against glib, to verify that the
# headers and pkg-config file are installed correctly
# (C) 2012 Canonical Ltd.
# Author: Martin Pitt <martin.pitt@ubuntu.com>
set -e
WORKDIR=$(mktemp -d)
trap "rm -rf $WORKDIR" 0 INT QUIT ABRT PIPE TERM
cd $WORKDIR
cat <<EOF > glibtest.c
#include <glib.h>
int main()
{
g_assert_cmpint (g_strcmp0 (NULL, "hello"), ==, -1);
g_assert_cmpstr (g_find_program_in_path ("bash"), ==, "/bin/bash");
return 0;
}
EOF
gcc -o glibtest glibtest.c `pkg-config --cflags --libs glib-2.0`
echo "build: OK"
[ -x glibtest ]
./glibtest
echo "run: OK"
Здесь небольшая программа на языке C копируется во временную директорию, затем компилируется с использованием системных библиотек (с использованием флагов и путей к библиотекам, определённых через pkg-config). Затем запускается скомпилированный файл, который запускает несколько основных функций glib.
Хотя этот тест очень маленький и простой, он проверяет многое: что ваш -dev пакет имеет все необходимые зависимости, что ваш пакет устанавливает рабочие файлы pkg-config, заголовочные файлы и библиотеки помещаются в нужное место, или что компилятор и компоновщик работают. Это помогает обнаружить критические ошибки на ранней стадии.
3.3. Выполнение теста¶
Несмотря на то, что скрипт тестирования может быть запущен напрямую, всё же рекомендуется использовать adt-run из пакета autopkgtest для проверки прохождения тестов; в противном случае, если тест покажет ошибку в системе Ubuntu Continuous Integration (CI) – пакет не пройдёт в Ubuntu. Заодно можно избежать “замусоривания” Вашей рабочей станции тестовыми пакетами и конфигурациями в случае, если тест совершает нечто более серьёзное в отношении системы, чем в примере выше.
В документации README.running-tests (онлайн-версия:) объясняются все доступные тестовые окружения (schroot, LXC, QEMU, etc) и приводятся наиболее популярные способы запуска тестов через adt-run. Например, с локальной сборкой бинарников, локально модифицируемыми тестами, и т.д.
Система непрерывной интеграции Ubuntu CI использует эмулятор QEMU и запускает тесты из пакетов в архиве, с включённом флагом -proposed. Чтобы вручную получить то же окружение, сначала необходимо установить следующие пакеты:
sudo apt-get install autopkgtest qemu-system qemu-utils
Теперь выполните сборку тестового окружения, выполнив следующее:
adt-buildvm-ubuntu-cloud -v
(Более подробно о выборе других релизов, архитектур, целевых директорий, и об использовании прокси – в manpage и в выводе опции --help). Эта команда выполнит сборку, например adt-trusty-amd64-cloud.img.
Теперь запустите тесты исходного пакета, например libpng, в образе QEMU:
adt-run libpng --- qemu adt-trusty-amd64-cloud.img
Система Ubuntu CI запускает пакеты с включённым флагом -proposed; чтобы включить это, запустите:
adt-run libpng -U --apt-pocket=proposed --- qemu adt-trusty-amd64-cloud.img
Man-страница adt-run содержит много ценной информации по другим параметрам тестирования.
3.4. Дальнейшие примеры¶
Этот список не полон, но может помочь вам получить представление о том, как автоматические тесты реализованы, и как они используются в Ubuntu.
Для библиотеки libxml2 , тесты очень похожи. Они так же запускают тестовую сборку простого кода на C и выполняют его.
Пакет gtk+3.0 tests <gtk3_> также компилирует/линкует/запускает проверку в тесте “build”. Также есть дополнительный тест “python3-gi”, проверяющий что библиотека GTK может быть использована во время теста.
В пакете ubiquity tests используется набор тестов родительского пакета
Пакет gvfs tests – очень интересный пример: он тестирует свой функционал “по полной”, включая эмуляцию CD, Samba, DAV и прочих компонентов.
3.5. Инфраструктура Ubuntu¶
Пакеты с включённым autopkgtest будут тестироваться при выгрузке, или если обновятся какие-либо зависимости. Результат работы автоматический запуск тестов autopkgtest может быть просмотрет на сайте, и он регулярно обновляется.
Debian также использует adt-run для запуска тестов пакета, но на данный момент – только в окружении schroot, так что результаты могут отличаться. Результаты и логи можно посмотреть по ссылке http://ci.debian.net. Пожалуйста, также отправляйте исправления для тестов или новые тесты в Debian.
3.6. Добавление теста в Ubuntu¶
Процесс добавления и отправки autopkgtest-теста для пакетов очень похож на процесс исправления ошибок в Ubuntu. Достаточно лишь:
выполните bzr branch ubuntu:<имя_пакета>,
включите тесты в debian/control,
создайте директорию debian/tests,
создайте debian/tests/control, основываясь на Спецификации DEP 8,
добавьте ваши тесты в debian/tests,
закоммитьте ваши изменения, отправьте их на Launchpad, предложите merge и дождитесь его рассмотрения и дождаться, – в точности как с любыми другими улучшениями в исходных пакетах.
3.7. Чем вы можете помочь¶
Команда Ubuntu Engineering собрала список необходимых тестов, в котором пакеты, нуждающиеся в тестировании, распределены по категориям. Там можно найти примеры таких тестов и взять их на себя.
Если вы столкнётесь с проблемами, присоединяйтесь к IRC на канал #ubuntu-quality IRC channel: разработчики наверняка вам помогут.