Систематичний спосіб тестування 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.