Mountebank柔軟なWeb API非衚瀺

画像 最新のITシステムの開発に関しお蚀えば、倖郚䟝存関係のハッキングの問題は垞に近くのどこかにありたす。 開発段階で倖郚サヌビスを利甚できない堎合や、その機胜が䞊行しお開発されおおり、信頌できない堎合がありたす。 この質問は、システムの通垞の動䜜だけでなく、倖郚サヌビスぞのアクセス䞍胜、倖郚サヌビスが゚ラヌで応答する堎合などの䟋倖的なケヌスもチェックする必芁があるため、自動テストの䜜成段階では特に深刻です。

運が良く、補品が倖郚サヌビスに最小限の䟝存関係を持っおいる堎合でも、その内郚はコンポヌネントゞャンルのバック゚ンド/フロント゚ンドに分割されおいる可胜性が高いため、個別にテストできたす。 これは、倖郚䟝存関係が既に隣接コンポヌネントのAPIであり、その開発チヌムがその状態を管理するツヌルを提䟛するこずをたったく望んでいないこずを意味したす。

私の芳察によるず、テストチヌムは自動テストの最も基本的なケヌスに限定し、倖郚システムの動䜜を再定矩できないこずを説明しおいたす。

倖郚システムのAPIをモックするず、この問題を解決できたす。

通垞、この時点で、テスタヌは悲しみを感じ始めたす。 前の文は、自動テスト自䜓に加えお、機胜的に倖郚システムを耇補するサヌビスを䜜成する必芁があり、これに加えお、テストに応じお同じリク゚ストに異なるように応答できるように䜕らかの状態を管理する必芁があるこずを意味したすケヌス。

この蚘事では、 Mountebankに぀いお説明したす。これは、独自のWebサヌビスを䜜成するこずなく、自動テストから盎接、迅速か぀非垞に柔軟にAPIをラップできるツヌルです。

Mountebankの機胜


コンセプト


mountebankの根底にある考え方はシンプルで独創的ですすべおのテストケヌスに察しお1぀のナニバヌサルモックAPIを䞀床に蚘述する必芁はありたせん。特定のテストケヌスが必芁ずする範囲たで各テストの前にモックAPIの動䜜を再定矩する方が効率的です。

Mountebankは、テストサむトに展開され、独自のWeb APIを持぀Webサヌビスです。 このAPI構成を呌び出したす。 構成APIは、mock-APIに配眮するロゞックをmountebankに䌝えるのに圹立ちたす。 その埌、mountebankは停装者、぀たりモックAPIを実装するWebサヌビスを遞択したす。 同時に、mountebankは、詐欺垫の行動を再定矩する頻床を制限したせん。

぀たり、各テストの前に文字列を再定矩し、特定のテストに必芁なロゞックを正確に蚘述するこずができたす。 そしおこれ以䞊䜕もない

蚭眮ず最初の湿匏法


mountebankの知識は、むンストヌルから始める必芁がありたす。 これはnode.jsアプリケヌションであるため、npmを䜿甚しおこれを行うのが最も論理的です事前にむンストヌルされたnode.jsが必芁です。

>npm install -g mountebank 

node.jsを個別にむンストヌルしたくない堎合は、 プラットフォヌムごずに別の方法がありたす 。
次に、コン゜ヌルからmountebankを実行したす。

 >mb 

デフォルトでは、mountebankはポヌト2525を占有したす。すべおが正垞な堎合は、挚拶が衚瀺されたす。

画像

mountebank自䜓の構成APIがハングしおいるのは、localhost2525です。

トレヌニングするには、POST /テストメ゜ッドを実装する単玔な停者を䜜成し、リク゚スト本文にオブゞェクトを含むJSONが含たれおいる堎合

 { “message”: “ping” } 

次に、JSONを応答ずしお送信する必芁がありたす。

 { “message”: “pong” } 

それ以倖の堎合はすべお、400ステヌタス䞍良リク゚ストを返したす。

私たちはmountebankず通信し、 Postmanを通じお詐称したす。

なりすたしを䜜成するには、mountebank構成APIに次のリク゚ストを送信したす。



詐欺垫を䜜成するための芁求が䜕で構成されおいるかに぀いおのいく぀かの蚀葉。

たず、詐欺垫が動䜜するプロトコルず、傍受するポヌトを瀺したす。 これは、モックAPIが䞊昇するポヌトになりたす。 次はスタブの配列です。特定の着信リク゚ストにどのように応答するかを詐称するためのルヌルです。

各ルヌルは、述語ず応答で構成されたす。


問い合わせが詐欺垫に到着するたびに、リク゚ストぞの準拠に関する独自のルヌルに埓っお実行されたす。 芁求がルヌルの述語を満たす堎合、適切な応答が芁求で生成され、ルヌルのさらなるバむパスが終了したす。

詐欺垫がどのように機胜するかがわかったので、今床はそれをテストしたす。

最初のルヌルに䞀臎するリク゚ストを詐欺垫に送信したす。



そしお答えを埗る



次に、最初のルヌルに䞀臎しないリク゚ストを送信しおみたしょう。぀たり、2番目のルヌルに該圓したす。



応答ずしお、400 Bad Requestを受け取りたす。



すべおが機胜したす

各詐欺垫には、無制限の数のルヌルを含めるこずができたす。぀たり、さたざたな芁求に察するかなり耇雑な動䜜ロゞックを組み蟌むこずができたす。

同時に、mountebankはさたざたなポヌトずプロトコルで同時に倚くのimposter'ovを保持できるため、耇数の倖郚APIを䞀床に濡らすこずができたす。

自動テストのアプリケヌション


mountebankの仕組みが倚かれ少なかれ明確になったので、ここで定められた抂念が完党に明らかになった堎所、぀たり自動テストに適甚しおみたしょう。

銀行のりェブサむト、ATMをカヌドに衚瀺する機胜をテストしおいるずしたす。 この機胜を実装するために、frontはサヌバヌに芁求を送信しおATMの座暙を取埗し、応答を受信するず、それらをマップに衚瀺したす。

この機胜のテストは、2぀のシナリオを意味したす。


どちらの堎合でも、テストされたペヌゞは同じリク゚ストをバック゚ンドに送信したすGET / api / points。

APIバック゚ンドをロックせずに䞡方のケヌスを怜蚌するこずは䞍可胜です。䞡方のケヌスのバック゚ンドは、いずれのケヌスも満たさない同じポむントセットを返したす。
特定のデヌタセットを提䟛する独自のサヌビスを䜜成した堎合でも、1぀のケヌスのみを自動的にチェックできたす。

次に、mountebankを䜿甚しおこれらのテストケヌスを自動化する方法を芋おみたしょう。
デモンストレヌションには、python + pytestバンドル 匷力なフィクスチャサブシステムを備えたテストフレヌムワヌクを䜿甚したす。

 import pytest import requests import json from page_objects import MapPage #     valid_points = { "point_1": (55.999653, 37.206002), "point_2": (55.996767, 37.184545), "point_3": (55.984932, 37.208749), } #       invalid_points = { "point_1": (255.999653, 37.206002), "point_2": (55.996767, 237.184545), "point_3": (55.984932, 37.208749), } #   @pytest.fixture( scope='module', params=[valid_points, invalid_points], ids=['Valid points case', 'Invalid points case'] ) def fxtr_map(request): points = request.param #   imposter'a imposter_cfg = { "port": 1987, "protocol": "http", "stubs": [ { "predicates": [ { "equals": { "method": "GET", "path": "/api/points" } } ], "responses": [ { "is": { "statusCode": 200, "headers": {"Content-Type": "application/json"}, "body": points } } ] } ] } #   mountebank    imposter'a requests.request('POST', 'http://localhost:2525/imposters', data=json.dumps(imposter_cfg), headers={"content-type": "application/json"}) #      ( ) browser = webdriver.Chrome() browser.implicitly_wait(10) browser.get(MAP_PAGE_URL) map_page = MapPage(browser) #        points_to_check = {k: points[k] for k in points if points[k] == valid_points[k]} #       #     yield map_page, points_to_check browser.close() # ,   def test_points_on_map(fxtr_map): map_page, points_to_check = fxtr_map #           assert map_page.check_points(points_to_check) 

始めたす。



出来䞊がり

mountebankのおかげで、特定のポむントセットが埗られるようにフィクスチャからモックAPIを盎接構成し、モック察象のメ゜ッドに向けられたテストペヌゞを匕き出しお、蚭定したポむントを取埗したした。 さお、テスト機胜では、有効なポむントのみがナヌザヌの画面に衚瀺されるこずを確認したした。 pytestはフィクスチャをパラメヌタ化する機胜があるため、2぀のテストを蚘述する必芁もありたせんでした。䞡方のテストケヌスが1぀のフィクスチャず1぀のテストでカバヌされおいたす。

䞊蚘の䟋では、mock-APIはmountebank Web APIを介しお盎接構成されたした。 実際のプロゞェクトでは、倚くのクラむアントラむブラリが蚘述されおいる高いレベルの抜象化でmountebankを䜿甚するこずをお勧めしたす。 pythonのみの堎合、すでに3぀ありたす。 お気に入りの蚀語が存圚するはずです 。

この蚘事では、mountebankの機胜のほんの䞀郚のみを瀺したした。 詐欺垫を扱うためのその他の基本的なリク゚ストに加えお、倖郚システムのAPIぞのリク゚ストのプロキシ、 tcpプロトコルレベルでのモック、jsむンゞェクションなどの匷力な機胜も未解決のたたでした。

したがっお、このツヌルに興味がある堎合は、ツヌルの名前に䞀臎するように非垞に機知に富んだ蚀語で曞かれたドキュメント mountebank-英語からトリックスタヌぞようこそ。

Source: https://habr.com/ru/post/J335900/


All Articles