Систематичний спосіб тестування API RESTful за допомогою curl?


14

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

Починає виглядати досить безладним і важче підтримувати. Навіщо доставляти безлад?

Типові випадки використання:

  • Перевірте, чи URL-адреса повертає код коду відповіді, наприклад, 200
  • Перевірте, чи відповідає тип вмісту деякому MIME, який вам потрібен у цьому випадку
  • Переконайтеся, що повернутий вміст відповідає якомусь шаблону чи проходить абстрактну процедуру перевірки

Що я знайшов поки що і вважаю можливим варіантом без винаходи колеса, це:

  • мати піти з PyCurl - сподіваючись, що він повністю реалізує всі варіанти CURL esp. проксі, але й інші комутатори, які мені можуть знадобитися
  • використовувати вбудований модуль Python

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

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 post розвертає гачки ...
Tensibai

2
У шеф-кухарській екосистемі ви знайдете інспектора, який може відповісти на ваше запитання за допомогою ресурсу http , але він заснований на серверіspec / rspec, тому це більше світ рубіну, ніж світ python, але, можливо, варто спробувати.
Тенсібай

2
Я працював над деяким кодом python для здійснення REST-дзвінків за допомогою бібліотеки запитів Python . Це дозволить вам додати будь-який заголовок, який ви хочете, і підтримує підтримку проксі-серверів HTTP (s), тому він повинен бути здатний підтримувати всі функції curl. Ви можете запозичити мій код для ваших потреб або використовувати його як приклад, якщо він корисний.
Джеймс Швай

Відповіді:


7

Ви можете подивитися на такі інструменти, як Postman, який зосереджений на тестуванні API REST за допомогою JavaScript - він має деякі приємні функції, але ви втрачаєте використання Python.

Натомість я б запропонував переглянути плагіни, пов'язані з REST для pytest , тестову рамку Python, яка спрощує ваш тестовий код, при цьому все ще запущені тести, написані з використанням unittest.

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

  • Таверна , яка спеціалізується на тестуванні API REST і здається тут дуже актуальною - свого роду "Листоноша для тестів модулів Python".

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

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

    • Для тих, хто використовує Ляльковий або шеф-кухар, Testinfra схожий на Beaker (з RSpec), ServerSpec або InSpec.

Якщо вам не подобається таверна, ви можете використання курсу pycurlз pytest, що робить його легше діагностувати саме те , що не вдалося. Цей приклад із сайту звітів pytest-curl використовує лише загальні функції 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"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.