Ubuntu logo

Packaging Guide

3. autopkgtest: Автоматическое тестирование пакетов

Спецификация DEP 8 определяет, как можно легко интегрировать автоматическое тестирование в ваши пакеты. Для этого, необходимо:

  • добавить файл 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. Выполнение теста

While the test script can be easily executed on its own, it is strongly recommended to actually use autopkgtest from the autopkgtest package for verifying that your test works; otherwise, if it fails in the Ubuntu Continuous Integration (CI) system, it will not land in Ubuntu. This also avoids cluttering your workstation with test packages or test configuration if the test does something more intrusive than the simple example above.

The README.running-tests (online version) documentation explains all available testbeds (schroot, LXD, QEMU, etc.) and the most common scenarios how to run your tests with autopkgtest, e. g. with locally built binaries, locally modified tests, etc.

Система непрерывной интеграции Ubuntu CI использует эмулятор QEMU и запускает тесты из пакетов в архиве, с включённом флагом -proposed. Чтобы вручную получить то же окружение, сначала необходимо установить следующие пакеты:

sudo apt-get install autopkgtest qemu-system qemu-utils

Теперь выполните сборку тестового окружения, выполнив следующее:

autopkgtest-buildvm-ubuntu-cloud -v

(Более подробно о выборе других релизов, архитектур, целевых директорий, и об использовании прокси – в manpage и в выводе опции --help). Эта команда выполнит сборку, например adt-trusty-amd64-cloud.img.

Теперь запустите тесты исходного пакета, например libpng, в образе QEMU:

autopkgtest libpng --- qemu adt-trusty-amd64-cloud.img

The Ubuntu CI system runs packages with only selected packages from -proposed available (the package which caused the test to be run); to enable that, run:

autopkgtest libpng -U --apt-pocket=proposed=src:foo --- qemu adt-release-amd64-cloud.img

or to run with all packages from -proposed:

autopkgtest libpng -U --apt-pocket=proposed --- qemu adt-release-amd64-cloud.img

The autopkgtest manpage has a lot more valuable information on other testing options.

3.4. Дальнейшие примеры

Этот список не полон, но может помочь вам получить представление о том, как автоматические тесты реализованы, и как они используются в Ubuntu.

  • Для библиотеки libxml2 , тесты очень похожи. Они так же запускают тестовую сборку простого кода на C и выполняют его.

  • Тесты пакета gtk+3.0 также компилируют/линкуют/запускают проверку в тесте “build”. Также есть дополнительный тест “python3-gi”, проверяющий что библиотека GTK может быть использована из языка Python.

  • В пакете ubiquity tests используется набор тестов родительского пакета

  • Пакет gvfs tests – очень интересный пример: он тестирует свой функционал “по полной”, включая эмуляцию CD, Samba, DAV и прочих компонентов.

3.5. Инфраструктура Ubuntu

Пакеты с включённым autopkgtest будут тестироваться при выгрузке, или если обновятся какие-либо зависимости. Результат работы автоматического запуска тестов autopkgtest может быть просмотрен на сайте, и он регулярно обновляется.

Debian also uses autopkgtest to run package tests, although currently only in schroots, so results may vary a bit. Results and logs can be seen on http://ci.debian.net. So please submit any test fixes or new tests to Debian as well.

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: разработчики наверняка вам помогут.