Разбор исходников Outwiker. Сборка и тестирование | jenyay.net

Разбор исходников Outwiker. Сборка и тестирование

Содержание

Введение

Поскольку OutWiker полностью написан на интерпретируемом языке Python, то компиляция для запуска этой программы не требуется. Для того, чтобы запустить OutWiker из исходников достаточно выполнить следующую команду в папке src:

python runoutwiker.py

и если у вас установлен Python и все требуемые библиотеки, перечисленные в разделе На чем написан OutWiker, то программа запустится.

Разумеется, таким образом программу не удобно использовать в повседневной работе, хотелось бы иметь полноценный запускаемый exe-файл под Windows или пакет под Linux. На данный момент в исходниках OutWiker уже содержатся скрипты для создания запускаемого файла и инсталлятора под Windows, а также deb-пакета под Ubuntu Linux. Насколько я знаю, существую пакеты под другие дистрибутивы Linux (на основе rpm), но я к ним не имею никакого отношения. Если авторы этих пакетов пришлют скрипты для сборки, я буду им благодарен и включу эти скрипты в исходники.

Начиная с версии 1.8.0.712 , все пакеты и инсталляторы собираются с помощью библиотеки Fabric, которую начал использовать вместо make. Поскольку Fabric - не такая широко известная библиотека, опишу ее более подробно.

Коротко о Fabric

Fabric - это библиотека, предназначенная для автоматизации операций администрирования, развертывания или сборки. Она может работать как на локальном компьютере, так и через SSH, что в данном случае не важно.

Установка

Fabric устанавливается довольно легко, под Linux можно использовать easy_install или pip:

easy_install fabric

или

pip install fabric

Под Windows установка Fabric таким образом может окончиться ошибкой, если у вас не установлен Visual Studio. Дело в том, что Fabric зависит от другой библиотеки - PyCrypto, которая при установке пытается компилироваться из исходников. Это верно с идеологической точки зрения (никогда нельзя доверять непонятной сборке криптографической библиотеки или программы), но не удобно с точки зрения конечного пользователя. К счастью, в сети можно найти инсталлятор PyCrypto под Windows. После установки PyCrypto Fabric установится без проблем.

Возможности Fabric

После установки Fabric появится возможность вызывать программу fab в командной строке. Под Windows для этого может понадобиться добавить в переменную окружения Path путь до C:\Python27\Scripts, хотя если вы используете easy_install или pip, этот путь у вас наверняка уже добавлен.

Использование Fabric напоминает использование make с его Makefile, только вместо файла Makefile создается скрипт fabfile.py, который в данном случае располагается в корне исходников OutWiker. Внутри fabfile.py объявляются функции, которые используются точно также, как и цели сборки в Makefile. Например, в fabfile.py есть цель для сборки дистрибутива под Windows:

def win():
    """
    Создание сборок под Windows
    """

        ...

Для того, чтобы запустить эту цель сборки, в командной строке в папке, где расположен файл fabfile.py, достаточно выполнить команду:

На самом деле команду fab можно вызывать и из более вложенных папок, в этом случае Fabric будет искать fabfile.py на более высоких уровнях дерева папок, но поскольку скрипты для сборок подразумевают, что текущая папка - это именно корень исходников, то вызывать сборки нужно оттуда.

Поскольку эта статья - не является руководством по Fabric, не будем углубляться в подробности про написание скриптов для нее, скажу лишь только, что переделать Makefile в fabfile.py было очень легко, поскольку Fabric позволяет запускать внутри скриптов консольные команды. Для выполнения консольных команд используется функция fabric.api.local, а для перехода в нужную папку (аналог команды cd) - fabric.api.lcd.

В качестве примера приведу функцию для сборки OutWiker под Windows:

import os
import os.path

from fabric.api import local, lcd


def win():
    """
    Создание сборок под Windows
    """

    pluginsdir = os.path.join ("src", "plugins")

    # Папка plugins всегда остается пустой, поэтому ее не удается добавить в git
    # Надо ее создавать вручную
    if not os.path.exists (pluginsdir):
        os.mkdir (pluginsdir)

    with lcd ("src"):
        local ("python setup_win.py build")

    with lcd ("build/outwiker_win"):
        local (r"7z a ..\outwiker_win32_unstable.zip .\* .\plugins -r -aoa")
        local (r"7z a ..\outwiker_win32_unstable.7z .\* .\plugins -r -aoa")

    local ("iscc outwiker_setup.iss")

Теперь давайте рассмотрим процесс сборки OutWiker под разные системы.

Сборка под Windows

Для сборки под Windows нужно установить еще одну библиотеку и две программы:

  • cx_Freeze для создания exe-шника;
  • Inno Setup для создания инсталлятора;
  • 7-zip для архивации полученной сборки под Windows сразу и в zip, и в 7z.

После установки Inno Setup и 7-zip пути до файлов iscc.exe (консольный компилятор Inno Setup) и 7z.exe также должны быть добавлены в переменную окружения Path.

Теперь, когда все установлено, достаточно в корневой папке программы вызвать команду

Сборка цели win выполняет следующие шаги:

Во-первых, создается запускаемый файл outwiker.exe и все файлы, которые нужны для запуска программы в папке build\outwiker_win:

Во-вторых, создаются архивы outwiker_win32_unstable.zip и outwiker_win32_unstable.7z, которые содержат эти же файлы. Архивы создаются в папке build.

В-третьих, в той же папке build создается инсталлятор outwiker_setup.exe.

На этом сборка под Windows завершается.

Сборка deb-пакетов

В файле fabfile.py содержатся цели для сборки deb-пакетов под различные версии Ubuntu Linux. Список поддерживаемых дистрибутивов перечислен в самом начале файла fabfile.py в переменной distribs. На данный момент, этот список выглядит следующим образом:

# Поддерживаемые дистрибутивы Ubuntu
distribs = ["saucy", "trusty", "quantal", "precise"]

Для сборки deb-пакетов есть несколько целей:

  • deb. Создает deb-пакеты для всех дистрибутивов. Эта цель создана в первую очередь для создания пакетов, которые затем можно установить локально (не из PPA).
  • debsingle. Аналогично цели deb, но создает deb-пакет только для дистрибутива, перечисленного в списке distribs первым.
  • debinstall. Создает deb-пакет с помощью цели debsingle и сразу же его устанавливает с помощью команды sudo dpkg -i ...
  • debsource. Создает файлы *_source.changes и *.debian.tar.gz предназначенные для закачки пакета в PPA.
  • ppaunstable. Закачивает файлы, созданные с помощью цели debsource, в PPA (цель debsource нужно предварительно вызывать вручную).

Другие цели сборки

Кроме перечисленных, в fabfile.py содержатся еще несколько вспомогательных целей сборки.

  • wintests. Создает exe-файл под Windows для запуска unit-тестов (про unit-тесты будет сказано ниже). Для выполнения тестов собирать их не обязательно, эта цель сборки создана только для того, чтобы иметь возможность отлавливать проблемы, возникающие при запуске программы из exe-шника под Windows, а не в виде скрипта.
  • plugins. Создает zip-архив для каждого плагина, а также файл outwiker-plugins-all.zip, содержащий сразу все плагины.
  • nextversion. Увеличивает номер сборки (четвертую цифру в номере версии, например, 1.8.0.712). Эту цель надо запускать под Linux (причем, на основе Debian), поскольку одновременно увеличивается номер версии в deb-пакете. А вообще, номер версии хранится в файле src/nextversion.txt вот в таком виде:
1.8.0
712
dev

Последняя строка обозначает, что это версия еще находится в разработке.

  • run. Запускает OutWiker. Эта цель предназначена в первую очередь для того, чтобы все основные действия, необходимые при разработке программы можно было бы делать из корневой папки с исходниками без захода в папку src.
  • test. Запускает на выполнение unit-тесты, о чем более подробно описано в следующем разделе.

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

При разработке OutWiker я по возможности стараюсь использовать методологию TDD (Test-Driven Development), разработку через тестирование. Это не всегда удается использовать в классах, представляющие собой GUI, но части без интерфейса с пользователем практически все покрыты тестами (на момент написания этих строк количество тестов превысило 1300).

Для того, чтобы запустить unit-тесты, есть два пути. Первый - это зайти в папку src и выполнить команду

python tests.py

Того же самого можно добиться из корневой папки исходников, выполнив команду

fab test

После ее запуска начнет отображаться прогресс выполнения тестов и мелькать создаваемые и удаляемые окна (частично GUI все-таки удается покрыть unit-тестами). Процесс выполнения тестах может затянуться на несколько минут, особенно под Windows (под Linux те же тесты выполняются в разы быстрее). Если все прошло нормально, то вы увидите в консоли примерно вот такую картину:

outwiker_tests.png: 642x454, 26k (03.03.2014 22:13)

Для успешного выполнения всех тестов нужно подключение к интернету, т.к. тесты включают в себя проверку работоспособности плагинов, в том числе и UpdateNotifier, который проверяет доступность обновлений.

Под Windows иногда могут проваливаться два теста, связанных с копированием в буфер обмена. В этом нет ничего страшного, просто изменение содержимого буфера обмена происходит слишком быстро (под Linux эта проблема не возникает).

Для написания тестов используется стандартная библиотека unittest, все тесты содержатся в папке src/test и во вложенных папках. Для тестирования используются файлы из папки test в корне исходников - там содержатся различные небольшие деревья заметок, в том числе с ошибками, картинки и другие файлы.

Как вы, наверное, знаете, python позволяет запускать тесты выборочно по имени их класса. Например, чтобы запустить только тесты из класса MainWndTest (тесты для главного окна программы), нужно выполнить команду

python tests.py MainWndTest

Если вы для запуска тестов используете Fabric, то дополнительные параметры в функцию "сборки" передаются через двоеточие. Таким образом, если вы хотите выполнить только тесты из класса MainWndTest, то вам нужно выполнить следующую команду:

fab test:MainWndTest

Если же вы хотите выполнить тесты из нескольких классов (например, из класса MainWndTest и TagsListTest), то должны выполнить следующие команды:

python tests.py MainWndTest TagsListTest

или

fab test:"MainWndTest TagsListTest"

Обратите внимание на кавычки в последнем случае.

На этом закончим данную часть описания внутренностей OutWiker, в следующей части будет описан формат хранения заметок.

К оглавлению документации

Вы можете подписаться на новости сайта через RSS, Группу Вконтакте или Канал в Telegram.
5 stars

Рейтинг 5.0/5. Всего 4 голос(а, ов)




Подписаться на комментарии
Автор:
Тема:
 Ваш комментарий
 
 
Введите код 234