набор тестов perl для API

Я пишу модуль perl, который взаимодействует с API, и я хотел бы написать для него набор тестов, прежде чем помещать на CPAN. Однако, поскольку этот модуль в основном является просто интерфейсом для API, для всех тестов потребуется действительный ключ API и пользователь. Очевидно, я не могу выпустить этот модуль с моим ключом API и именем пользователя в наборе тестов, так как же лучше всего справиться с чем-то подобным? Должен ли я просто протестировать локально, а затем разместить его на CPAN без тестов? Кто-нибудь сталкивался с этим раньше и придумал хорошее решение? Я знаю, что писать тесты — лучшая практика, поэтому я хотел бы сделать это, если смогу. Спасибо!


person srchulo    schedule 09.07.2013    source источник
comment
Вы можете написать и развернуть поддельный API, которому не нужен ключ или поддельный ключ для проверки механизма ключей. Это может быть заменено реальным API через переменную среды для людей, у которых есть реальная вещь.   -  person KeepCalmAndCarryOn    schedule 10.07.2013
comment
@KeepCalmAndCarryOn - см. мой ответ :)   -  person DVK    schedule 10.07.2013


Ответы (3)


Почему бы не обернуть вызовы API в небольшие функции (например, функция НИЧЕГО не делает, кроме вызова API), а затем имитировать эти функции в своих тестах по мере необходимости, используя Test::MockObject или что-то подобное?

Это было бы еще лучше, так как вы могли бы иметь тесты, которые проверяют разные результаты API (сбой, сбой аутентификации и т. д.).

person DVK    schedule 09.07.2013
comment
В качестве примечания: это, безусловно, решение, гораздо более предпочтительное, чем пропустить тесты, но хуже, чем имитировать тесты для модульного тестирования. 100% кода без вызова API + позволить пользователям предоставлять свой собственный ключ и пользователя для тестов интеграции. - person DVK; 10.07.2013
comment
Этот ответ тоже хорош. Вы сможете протестировать биты, которые выполняют возвращаемые значения API. - person Len Jaffe; 10.07.2013

Я четко указал в своей документации, что мой модуль бесполезен без ключа API, и использовал конструкции skip:{} Test::More, чтобы пропустить все тесты, если ключ отсутствует. Вы можете выбрать слишком bail_out вместо пропуска.

Просто убедитесь, что ваши документы объясняют, как передать ключ API модулю.

person Len Jaffe    schedule 09.07.2013
comment
не могли бы вы сказать мне название вашего модуля, чтобы я мог посмотреть на него в качестве примера? - person srchulo; 10.07.2013
comment
да. дайте мне минуту, чтобы посмотреть его. Я не работал над ним более 2 лет :-) - person Len Jaffe; 10.07.2013
comment
Я хочу добавить, что, кроме службы тестирования CPAN, я не могу представить, кому нужно установить модуль-оболочку API без ключа API. - person Len Jaffe; 10.07.2013
comment
Спасибо за пример! Всегда полезно иметь работающий код, который уже делает то, что вы хотите :) - person srchulo; 10.07.2013
comment
Обратите внимание, что мой код также использует переменную myriad или ENV, чтобы определить, какие тесты запускать. Таким образом, если у вас нет объектов типа B, вы не будете выполнять вызовы API для их проверки CRUD. - person Len Jaffe; 10.07.2013
comment
Я сделал то же самое: I22r-Translate - person mob; 10.07.2013

Обычно я справляюсь с такими вещами, требуя переменную среды для запуска набора тестов. Переменная среды будет содержать полезную информацию (например, ключ API, имя хоста для подключения и т. д.).

Вот пример того, как вы можете справиться с подобными вещами из тестового файла. Мы используем это для дистрибутива MongoDB, чтобы проверить, есть ли доступный сервер для запуска:

BEGIN {
    eval {
        my $host = exists $ENV{MONGOD} ? $ENV{MONGOD} : 'localhost';
        $conn = MongoDB::MongoClient->new( host => $host, ssl => $ENV{MONGO_SSL} );
    };

    if ( $@ ) {
        plan skip_all => $@;
        exit 0;
    }
};

Все, что он делает, это пытается подключиться к хосту, указанному в переменной окружения MONGOD (или к локальному хосту). Если это не удается, он пропускает все тесты и сообщает причину. Пропуски по-прежнему считаются безотказными, поэтому это не помешает установке модуля, если тестовый сервер недоступен.

У меня есть этот код в файле .pm, который я use устанавливаю в каждый файл .t в дистрибутиве.

person friedo    schedule 09.07.2013