Написание тестов Python для SPARKL

Не писать тесты - все равно что не платить ростовщику. Ваш долг увеличится. Так будет вероятность того, что ваш дом случайно загорится.

У нас есть несколько примеров конфигураций SPARKL в нашем публичном репозитории. Имея автоматические тесты для этих конфигураций, мы получаем дополнительную защиту от изменений, приводящих к регрессионным ошибкам.

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

Инструмент, позволяющий проводить такие тесты, появился довольно недавно. Это Утилита командной строки SPARKL (SPARKL CLI).

Структура

Интерфейс командной строки SPARKL может подключаться к работающему экземпляру SPARKL, импортировать файлы и выполнять транзакции. Написанный на Python, он легко интегрируется с тестовой библиотекой Python - например, pytest.

projects +
         |
         +- run_tests.sh
         +- public_repo +
                        |
                        +- example_configs +
                        |                  |
                        |                  +- config1.xml
                        |                  +- config2.xml
                        +- tests +
                                 |
                                 +- __init__.py
                                 +- conftest.py
                                 +- template.py
                                 +- test_config1.py
                                 +- test_config2.py

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

В файле conftest.py описаны методы настройки и разборки тестов. Каждая конфигурация имеет собственный соответствующий тестовый файл с рядом тестов.

Я также включил тестовый шаблон, чтобы упростить добавление тестов в будущем.

Переменные среды для конфиденциальной информации

Поскольку тесты находятся в общедоступном репозитории, я избегаю жесткого кодирования определенной информации. Например, пароли.

Вместо этого я использую переменные среды. Для удобства я написал сценарий bash для установки переменных и запуска всех тестов. Этот сценарий находится вне репозитория.

Как это работает

Тесты проверяют единицы транзакций SPARKL - операции запроса / ответа или целые транзакции, состоящие из набора операций. Транзакции начинаются с запроса и заканчиваются ответом на него.

На каждый запрос возможны один или несколько шаблонов ответа, а на каждый запрос возможны один или несколько шаблонов ответа. Каждый ответ или шаблон ответа содержит одно или несколько полей данных.

Например, приведенный выше образец сочетания содержит регистрационный номер и директоров компании.

Тест может проверять либо одну из операций запроса / ответа, либо операцию запроса. Поскольку последний использует оба запроса для сбора полей id и directors, при тестировании запроса косвенно проверяются и запросы.

Тест определяет:

  • Конфигурация, которую нужно протестировать
  • В этой конфигурации операция запроса или запроса, которую он хочет вызвать
  • Поле данных, которое операция должна отправить или получить.

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

Тесты передают свои входные параметры методу настройки с помощью декоратора @pytest.mark.parametrize. Метод настройки получает эти параметры с помощью метода request.param.

Метод настройки возвращает объект с именем шаблона ответа / ответа и значениями полей. Тесты могут собирать значения из этого объекта с помощью ключей. Например, setup_method[‘fields’][‘directors’] возвращает значение поля directors.

Положительные побочные эффекты

Улучшения интерфейса командной строки SPARKL

Инструмент SPARKL CLI не был настроен для тестирования. В некоторых случаях мне приходилось обходиться обходными путями. Это привело к ряду проблем на Github для будущих улучшений.

Например, интерфейс командной строки SPARKL возвращает данные поля в виде списка объектов, что затрудняет доступ к их значениям. Метод настройки реструктурирует этот список как единый объект, где каждое поле представляет собой пару имя / значение.

Основные ошибки

Мои тесты обнаруживают изменения в ядре. Нежелательные и незаметные изменения тоже. Мои тесты уже выявили ошибку, которую не обнаружили основные тесты.

Уведомления об изменениях

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