curlを使用してRESTful APIをテストする体系的な方法は?


14

統合テスト中に、実際にRESTful API(または一般的なHTTPインターフェイス)を使用して繰り返し使用するケースに取り組んでいることに気付きました。bash+ cURLで確認します。

それはかなり乱雑に見え始め、維持するのが難しくなります。なぜ混乱をもたらすのですか?

典型的な使用例は次のとおりです。

  • URLがhttp応答コードを返すことを確認してください(例:200)
  • その場合、コンテンツタイプが必要なMIMEと一致することを確認します
  • 返されたコンテンツが何らかのパターンに一致することを確認するか、抽象的な検証手順に合格する

私がこれまでに見つけたのは、車輪を再発明することなく実行可能なオプションを検討することです。

  • PyCurlを試してください-すべてのcURLオプションを完全に実装することを期待してください。プロキシだけでなく、私が必要とするかもしれない他のスイッチ
  • Pythonの組み込みユニットテストを使用する

次に、たとえば、チェックするサービスごとに1つのユニットテストを実行できます。

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コードとは何ですか?多数の統合テストシステムがあり、通常、テスト対象のコードと同じ言語で選択するため、同じ開発者が両方を更新できます。
テンシバイ

これはheterogeneuosすることができ、私が制御することはできません
ピーター・

1
それで、あなたのチームがより快適な言語は何ですか?すべてのツールは、bash + curlからcapistranoポストデプロイフックまで、この種のことをテストします
...-Tensibai

2
chefエコシステムには、httpリソースで質問に答えられるinspecがありますが、これはserverspec / rspecに基づいているため、pythonの世界よりもルビーの世界ですが、試してみる価値はあります。
テンシバイ

2
Pythonの要求ライブラリを使用してREST呼び出し行うために、いくつかのPythonコードに取り組んでいます。必要なヘッダーを追加でき、HTTP(s)プロキシサポートをサポートするため、curlのすべての機能をサポートできるはずです。あなたのニーズに合わせて私のコードを借りたり、それが参考になる場合は例としてそれを使用することを歓迎します。
ジェームズシェウェイ

回答:


7

JavaScriptを使用したREST APIのテストに焦点を当てたPostmanなどのツールを見ることができます。いくつかの便利な機能がありますが、Pythonを使用できなくなります。

代わりに、Pythonを使用して記述されたテストを実行しながら、テストコードを簡素化するPythonテストフレームワークであるpytestの REST関連プラグインを検討することをお勧めしunittestます。

Pytestには、次のようなさまざまなタスクを簡素化する膨大なプラグインセットがあります。

  • Tavernは、REST APIのテストに特化しており、ここでは非常に関連性が高いと思われます-「Python単体テスト用のポストマン」のようなものです。

  • pytest-curl-report-requestsライブラリでテストする場合curl、シェルからエラーを再現するために使用できるコマンドを出力します。

  • Testinfra-サーバーテスト(たとえば、通常リモートサーバーでテストされるOSパッケージ、ファイル、プロセスなどの状態)に焦点を当てています-Ansibleコードのテストなどにこのタイプが必要な場合は、強くお勧めします。

    • PuppetまたはChefを使用するユーザーにとって、TestinfraはBeaker(RSpecを使用)、ServerSpecまたはInSpecに似ています。

あなたは居酒屋好きではない場合は、することができますコースの使用のpycurlpytest、それが簡単に失敗した正確に何を診断することができ、。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では、すべてのテストをplain assertで記述し、オプションで有用なメッセージを出力の一部として含めることができます。たとえば、テストの1つを作成できます。

def test_2():
    assert pycurl.response("some_url").matches ("xxx"), "xxx not found in response"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.