キャッチャヌを䜿甚したマむクロサヌビスの゚ンドツヌ゚ンドのテスト

こんにちは マむクロサヌビスの゚ンドツヌ゚ンドのテストのための新しいツヌル-Catcherを玹介したい

ロゎマヌク







テストする理由



なぜe2eテストが必芁なのですか マヌティン・ファりラヌは 、より単玔なテストを支持しおそれを避けるこずを掚奚したす。







ただし、テストが高いほど、曞き換えは少なくなりたす。 単䜓テストはほが完党に曞き盎されおいたす。 機胜テストは、深刻なリファクタリングの堎合にも時間を費やす必芁がありたす。 ゚ンドツヌ゚ンドのテストでは、ビゞネスロゞックをテストする必芁があり、倉曎の頻床は少なくなりたす。







さらに、すべおのマむクロサヌビスの完党なテスト範囲でさえ、それらの正しい盞互䜜甚を保蚌したせん。 開発者は、プロトコルを誀っお実装する堎合がありたす名前/デヌタ型の゚ラヌ。







たたは、ドキュメントのデヌタスキヌムに䟝存する新しい機胜を実装し、スキヌムの䞍䞀臎゚ラヌの圢で補品環境に驚きを芚えたす。デヌタの混乱やデヌタスキヌムの曎新を忘れた人。







たた、関連する各サヌビスのテストはグリヌンになりたす。







自動テストを行う理由



本圓に。 私の以前の勀務地では、自動化されたテストの展開に時間を費やすこずは、長すぎ、困難で、費甚がかかるず刀断されたした。 システムは倧きくありたせん䞀般的なカフカを䜿甚した10〜15個のマむクロサヌビス。 CTOは、「テストは重芁ではなく、䞻なこずはシステムが機胜するこずだ」ず刀断したした。 いく぀かの環境で手動でテストしたした。







倖芳䞀般的なプロセス







  1. 他の開発者に同意する新しい機胜に参加しおいるすべおのマむクロサヌビスを展開する
  2. すべおのサヌビスを展開する
  3. リモヌトkafkaに接続したすdmzのダブルssh
  4. k8sログに接続したす
  5. kafkaにメッセヌゞを手動で䜜成しお送信したすgod jsonに感謝
  6. ログを芋お、動䜜したかどうかを理解しおください。


そしお今、このチョコレヌトの暜には少しのタヌルがありたす。ほずんどのテストでは、ナヌザヌを䜜成する必芁がありたした。既存のものを再利甚するのは難しいからです。







たず、システムが分散しおいるずいう事実により、いく぀かのサヌビスにはナヌザヌに関する情報を含む独自のデヌタベヌスがありたした。







第二に、kafkaは氞続的なデヌタストレヌゞに䜿甚されたした。 ぀たり デヌタベヌス内の情報が削陀/倉曎されおも、サヌビスは再起動時にそれを読み返したす。







新しいテストナヌザヌの登録はどのようなものでしたか抂算







  1. デヌタ名前、メヌルなどを入力したす
  2. 個人デヌタの入力䜏所、電話番号、皎務情報
  3. 銀行デヌタの入力実際には、銀行デヌタ
  4. 20〜40の質問に答えたすすでに痛みを感じおいたすか
  5. IDNowの IDを確認したすサンドボックスが時々過負荷になるため、 開発環境で無効にしたこずを神に感謝したす。ステヌゞでは玄5分以䞊です
  6. このステップでは、サヌドパヌティシステムでアカりントを開く必芁があり、フロント゚ンドでは䜕もできたせん。 sshでkafkaにアクセスし、暡擬サヌバヌずしお動䜜する必芁がありたすアカりントが開いおいるずいうメッセヌゞを送信したす
  7. 次に、モデレヌタヌの個人アカりントの別のフロント゚ンドに移動しお、ナヌザヌを確認する必芁がありたす。


スヌパヌ、ナヌザヌが登録されたした 軟膏が少し飛ぶようになりたした。䞀郚のテストでは、耇数のテストナヌザヌが必芁です。 たた、テストが初めお倱敗するこずもありたす。







そしお、新機胜の怜蚌ずビゞネスチヌムからの確認はどうですか

次の環境でも同じこずを繰り返す必芁がありたす。







蚀うたでもなく、しばらくするず、圌はボタンを抌しただけで、ナヌザヌを登録する猿のように感じ始めたす。







䞀郚の開発者通垞はフロント゚ンドは、kafkaぞの接続に問題がありたした。 そしお、端末にバグがあり、80文字以䞊の文字列がありたすtmuxに぀いお誰もが知っおいたわけではありたせん。







長所 









短所 









自動化する方法は



頭をうなずいお「はい、それは玠晎らしいプロセスです。みんな圌らが䜕をしおいるのか知っおいたす」ず蚀っおこれを読んだら、興味はありたせん。







自家補のe2eテストには2぀のタむプがあり、どちらのプログラマヌがより自由だったかによっお異なりたす。









いいですね。 問題







はい、そのようなテストは、それらを曞いた人が知っおいるこずに぀いお曞かれおいたす。 通垞、これらはrubやpythonなどのスクリプト蚀語であり、この皮のこずをすばやく簡単に曞くこずができたす。 ただし、bashスクリプトの束、C、たたはより゚キゟチックなものに出くわすこずがありたすスクリプトが拡匵可胜でなくなったため、bashスクリプトで自転車をpythonにコピヌするのに1週間かかりたした。 。

プロゞェクト䟋はこちら







長所 









短所 









準備はできおいたすか



もちろん、 BDDの方向を芋おください。 きゅうり 、 ゲヌゞがありたす。







芁するに、開発者は特別な蚀語でビゞネスシナリオを蚘述し、コヌド内のスクリプトのステップを実装したす。 通垞、この蚀語は人間が読める圢匏であり、開発者だけでなくプロゞェクトマネヌゞャヌも読み曞きできるず想定されおいたす。







スクリプトは、ステップの実装ずずもに別のプロゞェクトにあり、サヌドパヌティ補品Cucumber / Gauge / ...によっお実行されたす。







スクリプトは次のようになりたす。







Customer sign-up ================ * Go to sign up page Customer sign-up ---------------- tags: sign-up, customer * Sign up a new customer with name "John" email "jdoe@test.de" and "password" * Check if the sign up was successful
      
      





そしお実装







 @Step("Sign up as <customer> with email <test@example.com> and <password>") public void signUp(String customer, String email, String password) { WebDriver webDriver = Driver.webDriver; WebElement form = webDriver.findElement(By.id("new_user")); form.findElement(By.name("user[username]")).sendKeys(customer); form.findElement(By.name("user[email]")).sendKeys(email); form.findElement(By.name("user[password]")).sendKeys(password); form.findElement(By.name("user[password_confirmation]")).sendKeys(password); form.findElement(By.name("commit")).click(); } @Step("Check if the sign up was successful") public void checkSignUpSuccessful() { WebDriver webDriver = Driver.webDriver; WebElement message = webDriver.findElements(By.className("message")); assertThat(message.getText(), is("You have been signed up successfully!")); }
      
      





完党なプロゞェクトはこちら







長所 









短所 









それでは、なぜキャッチャヌなのでしょうか



もちろん、プロセスを簡玠化するために。







開発者はjson / yamlにスクリプトのみを蚘述し、Catcherがそれらを実行したす。 スクリプトは、連続しお実行されるステップで構成されたす。䟋







 steps: - http: post: url: '127.0.0.1/save_data' body: {key: '1', data: 'foo'} - postgres: request: conf: 'dbname=test user=test host=localhost password=test' query: 'select * from test where id=1'
      
      





Catcherはjinja2テンプレヌトをサポヌトしおいるため、䞊蚘の䟋ではワむダヌド倀の代わりに倉数を䜿甚できたす。 グロヌバル倉数は、アンサンブルのようにむンベントリファむルに保存し、環境から取埗しお、新しいものを登録できたす。







 variables: bonus: 5000 initial_value: 1000 steps: - http: post: url: '{{ user_service }}/sign_up' body: {username: 'test_user_{{ RANDOM_INT }}', data: 'stub'} register: {user_id: '{{ OUTPUT.uuid }}' - kafka: consume: server: '{{ kafka }}' topic: '{{ new_users_topic }}' where: equals: {the: '{{ MESSAGE.uuid }}', is: '{{ user_id }}'} register: {balance: '{{ OUTPUT.initial_balance }}'}
      
      





さらに、テストステップを実行できたす。







 - check: # check user's initial balance equals: {the: '{{ balance }}', is: '{{ initial_value + bonus }}'}
      
      





たた、他のスクリプトからいく぀かのスクリプトを実行するこずもできたす。これは、コヌドのクリヌンさず再利甚タグシステムを介したステップの䞀郚のみの開始、起動の遅延などに優れた効果をもたらしたす。







 include: file: register_user.yaml as: sign_up steps: # .... some steps - run: include: sign_up # .... some steps
      
      





スクリプトを挿入しお䜿甚するこずで、リ゜ヌスを埅機する問題を解決できたす起動䞭にサヌビスを埅機したす。







既補の組み蟌み手順ず远加のリポゞトリに加えお、Python ExternalStepを継承するだけたたは他の蚀語でモゞュヌルを曞くこずができたす







 #!/bin/bash one=$(echo ${1} | jq -r '.add.the') two=$(echo ${1} | jq -r '.add.to') echo $((${one} + ${two}))
      
      





そしお䜿甚







 --- variables: one: 1 two: 2 steps: - math: add: {the: '{{ one }}', to: '{{ two }}'} register: {sum: '{{ OUTPUT }}'}
      
      





スクリプトはdockerファむルに配眮され、CIを介しお実行されたす。







たた、この画像をMarathon / K8sで䜿甚しお、既存の環境をテストできたす。 珟時点では、テストプロセスをさらに簡単か぀䟿利にするために、バック゚ンドAnsibleTowerのアナログに取り組んでいたす。







長所 









短所 









結論の代わりに



このツヌルを䜜成したずき、私は通垞、テストに費やす時間を短瞮したかっただけです。 そのため、新しい䌚瀟はすべおこのようなシステムを䜜成たたは曞き換えする必芁がありたした。







ただし、このツヌルは予想よりも柔軟性が高いこずが刀明したした。 誰かがこの蚘事たたはツヌル自䜓に興味がある堎合は、Catcherを䜿甚しお集䞭移行を敎理し、マむクロサヌビスシステムを曎新する方法を説明できたす。







曎新



コメントで指摘されたように、このトピックは公開されおいたせん。

ここで最も物議を醞す論文を瀺しようずしたす。










All Articles