Систематический способ тестирования RESTful API с помощью curl?

14

Во время интеграционного тестирования я заметил, что на самом деле я работаю над повторяющимися сценариями использования с API-интерфейсами restful (или вообще интерфейсами HTTP), которые я проверяю здесь и там с помощью bash + cURL.

Это начинает выглядеть довольно грязно и становится все труднее поддерживать. Зачем доставлять беспорядок?

Типичные случаи использования:

  • Убедитесь, что URL возвращает http код ответа, например 200
  • Убедитесь, что тип контента соответствует некоторому MIME, который вам нужен в этом случае.
  • Убедитесь, что возвращаемое содержимое соответствует некоторому шаблону или проходит абстрактную процедуру проверки

То, что я нашел до сих пор и считаю работоспособным вариантом, не изобретая велосипед, это:

  • попробуйте PyCurl - в надежде, что он полностью реализует все опции cURL, особенно. проксирование, но и другие переключатели, которые мне могут понадобиться
  • использовать встроенный в Python модуль testng

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

import unittest, pycurl

class TestService (unittest.TestCase):

    def test_1(self):
        self.assertEqual(pycurl.returncode("some_url"), 200)

    def test_2(self):
        self.assertTrue(pycurl.response("some_url").matches ("xxx") )

    def test_3(self):
        self.assertTrue (pycurl.ContentType("some_url").equal("xxx"))

if __name__ == '__main__':
    unittest.main()

Имеет ли это смысл или существует более высокоуровневый (но не слишком сложный, чтобы подобрать и интегрировать) инструмент?

Петр Мурышкин
источник
1
Что такое код API? Существует множество систем интеграционных тестов, и выбор обычно выполняется на том же языке, что и тестируемый код, поэтому один и тот же разработчик может обновлять оба.
Тенсибай
это может быть разнородным и у меня нет контроля
Петр
1
Так на каком языке ваша команда чувствует себя более комфортно? Каждый инструмент подойдет для тестирования такого рода вещей, от bash + curl до capistrano hooks после развертывания ...
Tensibai
2
В экосистеме шеф-повара вы найдете inspec, который может ответить на ваш вопрос с помощью ресурса http , но он основан на serverpec / rspec, так что это скорее мир рубинов, чем мир питонов, но, возможно, стоит попробовать.
Тенсибай
2
Я работал над кодом Python для выполнения вызовов REST с использованием библиотеки запросов Python . Он позволит вам добавить любой заголовок и поддерживает прокси-серверы HTTP, поэтому он должен поддерживать все функции curl. Вы можете одолжить мой код для своих нужд или использовать его в качестве примера, если это полезно.
Джеймс Шивей

Ответы:

7

Вы можете взглянуть на такие инструменты, как Postman, который фокусируется на тестировании API-интерфейсов REST с JavaScript - у него есть несколько приятных функций, но вы теряете использование Python.

Вместо этого, я бы посоветовал взглянуть на связанные с REST плагины для pytest , тестовой среды Python, которая упрощает ваш тестовый код, в то же время выполняя тесты, написанные с использованием unittest.

Pytest имеет огромный набор плагинов, которые упрощают различные задачи, в том числе:

  • Таверна , которая специализируется на тестировании API-интерфейсов REST и выглядит здесь весьма актуальной - своего рода «Почтальон для юнит-тестов Python».

  • pytest-curl-report - при тестировании с requestsбиблиотекой напечатает curlкоманду, которую можно использовать для воспроизведения ошибки из оболочки.

  • Testinfra - фокусируется на тестировании сервера (например, состояние пакетов ОС, файлов, процессов и т. Д., Обычно тестируемых на удаленных серверах) - настоятельно рекомендуется, если вам также нужен этот тип, например, для тестирования Ansible-кода.

    • Для тех, кто использует Puppet или Chef, Testinfra похож на Beaker (с RSpec), ServerSpec или InSpec.

Если вам не нравится таверна, вы можете, конечно, использовать pycurlс pytest, что упрощает диагностику именно то, что не удалось. В этом примере с сайта pytest-curl-report используются только общие возможности pytest:

$ py.test test.py
============================= test session starts ==============================
platform darwin -- Python 2.7.9 -- py-1.4.27 -- pytest-2.6.4
plugins: curl-report, httpbin, cache, capturelog, cov, flakes, pep8
collected 1 items

test.py F

=================================== FAILURES ===================================
______________________________ test_requests_get _______________________________

    def test_requests_get():
        r = requests.get('http://httpbin.org/get')
>       assert False
E       assert False

test.py:7: AssertionError

Pytest позволяет вам писать все тесты с простым текстом assertи, при желании, включать полезное сообщение как часть вывода. Например, один из ваших тестов может быть написан:

def test_2():
    assert pycurl.response("some_url").matches ("xxx"), "xxx not found in response"
RichVel
источник