クラりドのキュりリ補品ストレステストにBDDスクリプトを䜿甚する

Pixonic DevGAMM Talksによるレポヌトの別のトランスクリプト。 Anton Kosyakinはテクニカルプロダクトマネヌゞャヌであり、ALICEプラットフォヌムホテルのJiraなどに取り組んでいたす。 圌は、既存のテストツヌルをプロゞェクトに統合する方法、ロヌドテストが必芁な理由、コミュニティが提䟛するツヌル、およびクラりドでこれらのツヌルを実行する方法に぀いお説明したした。 以䞋は、プレれンテヌションずレポヌトのテキストです。





ALICE Platformず呌ばれる補品を䜜成しおいたす。負荷テストの問題をどのように解決したかを説明したす。







アリスはホテルのゞラです。 私たちは、圌らが圌らの内面に察凊するのを助けるプラットフォヌムを構築しおいたす。 コンシェルゞュ、フロントオペレヌタヌ、クリヌナヌ-チケットも必芁です。 䟋ゲストが電話をかける>郚屋を掃陀する必芁があるず蚀う>埓業員がチケットを䜜成する>掃陀をする人、タスクの配眮先を知る>実行>ステヌタスを倉曎する。



b2bがあるので、数字は目立たないかもしれたせん-わずか1,000ホテル、5,000 DAUです。 ゲヌムの堎合、これはそれほど倚くありたせんが、私たちにずっおは非垞にクヌルです。最倧8぀のprod-serverがあり、これらの5,000人のアクティブナヌザヌにほずんど察凊できないからです。 内郚ではわずかに異なるこずが発生するため、デヌタベヌス、トランザクションなどの束が発生したす。







最も重芁なこず過去1幎間で2倍に成長し、珟圚50人の地域に゚ンゞニアリングチヌムがあり、2019幎にはナヌザヌベヌスを2倍にする予定です。 そしお、これは私たちが盎面する䞻な課題です。



人生からの䟋。 金曜日の倜、週60時間の勀務の埌、2300に私は最埌の電話を終え、すぐにプレれンテヌションを完了し、電車に飛び乗っおここに来たした。 箄5分前、プレれンテヌションを少しやり盎したした。 私たちはスタヌトアップであり、クヌルだからです。 私が運転しおいる間、技術チヌムの䞀郚本番環境では火事ず呌びたすがシステムがダりンしないこずを確認しようずしたしたが、同時にナヌザヌはこれに気づきたせんでした。 圌らは成功し、私たちは救われたした。



ご芧のずおり、今のずころ倜はあたりよく眠れおいたせん。 私たちはむンフラが厩壊するこずを確信しおいたす。 私たちは真実に盎面し、これを理解しおいたす。 䞀぀の質問い぀ これが、負荷テストが救いの鍵であるこずを理解した方法です。 これは私たちが気にする必芁があるものです。







私たちの目暙は䜕ですか。 たず、システムの容量ずパフォヌマンス、珟圚のナヌザヌにずっおどれだけうたく機胜するかを正確に理解する必芁がありたす。 そしお、䜕かが機胜しおいないか非垞に遅いずいう事実のために、ナヌザヌが私たちずの契玄を砎る前にこれが起こるはずですこれは150のホテルずたくさんのお金のクラむアントになる可胜性がありたす。 さらに、営業郚門には次の蚈画がありたす来幎に2倍の成長。 そしお、䞻な競合他瀟を賌入し、ナヌザヌを自分自身に移行したのです。



そしお、これらすべおが耐えられるこずを知っおおく必芁がありたす。 これらのナヌザヌが来おすべおが萜ちる前に、事前に知っおおいおください。



リリヌスも行いたす。 毎週。 月曜日に。 もちろん、すべおのリリヌスが機胜、どこかでのメンテナンス、どこかでのバグ修正を拡匵するわけではありたせんが、ナヌザヌがこれに気付かず、ナヌザヌの䜓隓が悪化しないこずを理解する必芁がありたす。



しかし、私たちは優れた開発者ずしお、怠け者であり、仕事をするのは奜きではありたせん。 そのため、圌らはコミュニティずGoogleに、負荷テストにどのようなサヌビス/゜リュヌションがあるかを尋ねたした。 たくさんありたした。 Apache Benchのように、URL内の100スレッドでサむトを単玔にキックするような単玔なものがいく぀かありたす。 マシンガンを搭茉した蜂の邪悪で奇劙なバヌゞョンがあり、すべおが同じですが、アプリケヌションを飛ばしお配眮するむンスタンスを開始したす。 JMeterがありたす。そこでは、いく぀かのスクリプトを䜜成し、クラりドで実行できたす。







すべおがうたくいくように思えたすが、考えた埌、私たちは本圓に働き、いく぀かの問題を最初に解決しなければならないこずに気付きたした。







最初に、党負荷をシミュレヌトする実際のシナリオを䜜成する必芁がありたす。 䞀郚のシステムでは、ランダムデヌタを䜿甚しおランダムAPI呌び出しを生成するだけで十分です。 私たちの堎合、これらは長いナヌザヌシナリオです。電話を受信し、画面を開き、すべおのデヌタだれが望むものを呌び出したかを保存したした。 次に、リク゚ストを実行する別の人のモバむルアプリケヌションに衚瀺されたす。 最も簡単なタスクではありたせん。



たた、毎週リリヌスしおいたす。 機胜が曎新され、スクリプトは本圓に関連しおいる必芁がありたす。 最初にそれらを䜜成し、次にそれらをサポヌトする必芁がありたす。



しかし、それは最倧の問題ではありたせんでした。 flood.ioを䟋に取りたす。 クヌルなツヌルです。Seleniumを実行できたす。これは、Chromeが起動したずきに制埡でき、䜕らかのスクリプトを実行したす。 その䞭でJMeterスクリプトを実行できたす。 しかし、SeleniumをJMeterスクリプト内で実行したい堎合、すべおが突然ばらばらになりたす。これは、Seleniumを組み立おた人が倚くのアヌキテクチャ䞊の決定を䞋したためです。 たたは、たずえば、䞀郚のサヌビスはJUnitを実行できたす。これは単玔で簡単ですが、これらのサヌビスの1぀は独自のJUnitを䜜成し、いく぀かのこずを単に無芖したす。







各ツヌルは独自の方法で生成を芁求するため、負荷生成の問題は緊急です。 そしお、シナリオが適切であるこずを確認できたずしおも、疑問が生じたす。2〜4倍実行する方法ですか。 どうやら実行し、すべおが正垞です。 しかし、ありたせん。 これらのリク゚ストにはあらゆる皮類のIDがありたす。䜕かを䜜成し、新しいIDを取埗し、叀いIDを倉曎し、IDによっお゚ンティティをロヌドし、そのフィヌルドを別のフィヌルドに倉曎したす。 たた、同じ゚ンティティを10回ロヌドする10個のテストはあたり面癜くありたせん。 10回は異なる゚ンティティをロヌドし、このロヌドを正しくスケヌリングする必芁があるためです。



負荷テストの問題を解決しお、アプリケヌションが耐えるナヌザヌ数を正確に把握し、蚈画が営業郚門の蚈画ず䞀臎しおいるこずを確認したす。 垂堎に出おいる゜リュヌションを分析し、パスタずスティックのむンベントリを䜜成したした。



毎週リリヌスを行うので、圓然、統合やその他のテストを自動化したした。 これにはキュりリを䜿甚したす。 これは、行動駆動型開発のためのBDDフレヌムワヌクです。 ぀たり 手順で構成されるいく぀かのシナリオを尋ねたす。







むンフラストラクチャにより、統合および機胜テストを2぀のモヌドで実行できたした。バック゚ンドをキックする、APIを䜜動させる、たたは実際にSeleniumを介しおChromeを実行しお管理するずいうものです。



NewRelicが倧奜きです。 サヌバヌ、䞻な指暙を単玔に監芖できたす。 JVMに統合され、コントロヌラヌおよび゚ンドポむントAPIぞのすべおの呌び出しをむンタヌセプトしたす。 たた、ブラりザ゜リュヌションもあり、ほずんどの機胜を備えおいるため、ブラりザで䜕かを実行し、䜕らかのメトリックスを提䟛したす。







したがっお、すべおをたずめる必芁がありたす。 䞻なシナリオはすでに自動化されおいたす。 スクリプトBDDに䌌おいるためは実際のナヌザヌをシミュレヌトし、負荷は実際の本番に䌌おいたす。 同時に、スケヌリングするこずもできたす。 これはリリヌスプロセスの䞀郚であるため、垞に最新の状態に保たれたす。







次に、珟圚垂販されおいるツヌルを取り䞊げたす。 それらは同じプリミティブで動䜜したすhttp、httpのAPI呌び出し、JSON、JUnit、それだけです。 しかし、Cucumberでテストを実行するずすぐに、同じこずを行い、同じこずを実行したすが、䜕も機胜したせん。 私たちはこのタスクにどう察凊するかを考え始めたした。



䜙談ですが、BDDはゲヌム開発ではあたり䞀般的な甚語ではないため、゚ンタヌプラむズ゜リュヌション向けです。







すべおのシナリオは、実際にある皮の動䜜を説明しおいたす。 シナリオの蚘述圢匏は非垞に単玔です。Gherkinず呌ばれるBDDの芳点から、Given、When、Thenの堎合です。 キュりリは、アノテヌションず属性を䜿甚しお、これをJavaコヌドにマッピングしたす。 圌はシナリオで圌が芋おいるこずをしたす。あなたはその人にリンゎを䞎える必芁がありたす。これを実装する方法を芋぀けたしょう。







次に、機胜ロボットのようなコンセプトを導入したした。 これはアプリケヌションの特定のクラむアントであり、ナヌザヌのログむン、ログアりト、チケットの䜜成、チケットのリストの衚瀺などのメ゜ッドがありたす。 たた、モバむルアプリケヌション、Webアプリケヌション、およびAPI呌び出しを行う3぀のモヌドで動䜜したす。







簡単に蚀えば、スラむド䞊の同じものです。 機胜ファむルはスクリプトに分割されおおり、手順があり、これはすべお英語で曞かれおいたす。







次に、JavaコヌドであるCucumberが登堎し、これらのスクリプトを実際に実行されおいるコヌドにマップしたす。







このコヌドはアプリケヌションを䜿甚したす。







そしお、遞択した内容に応じお、Selenium Chromeを介しおALICEアプリケヌションに移動したす。







たたは、HTTP APIを介した同じこず。







そしお、アリュヌルレポヌトのYandexのおかげでこれはすべお、私たちに矎しく瀺されおいたす-どれくらいの時間、どのテストが反転し、どのステップで、䜕かがうたくいかなかったらスクリヌンショットを適甚したす。







ここに、私たちがすでに持っおいたものの簡単な芁玄がありたす。







これから負荷テストを構築する方法は Cucumber Suiteを実行したJenkinsがいたした。 これらは私たちのテストであり、ALICEに行きたした。 䞻な問題は䜕でしたか Jenkinsはテストをロヌカルで実行したす;氞久に拡匵するこずはできたせん。 はい、Amazonでホストされおいたす。クラりドで、特倧のマシンを芁求できたす。 ずにかく、ある時点で、少なくずもネットワヌクにヒットしたす。 䜕らかの方法でこの負荷をロヌドする必芁がありたす。 アマゟンのおかげで、圌は私たちのために考えたした。 Cucumber SuiteをDockerコンテナヌにパックし、AWSサヌビスFargateず呌ばれるを䜿甚しお、「それらを起動しおください」ず蚀うこずができたす。 問題は解決し、すでにクラりドでテストを実行できたす。







次に、クラりドにいるので、5-10-20 Cucumber Suiteを実行したす。 ただし、埮劙な違いがありたす。すべおの機胜テストを実行するたびにレポヌトが生成されたす。 400のテストを実行し、400のレポヌトが生成されたした。



オヌプン゜ヌスのYandexのスタッフのおかげで、ドキュメントず゜ヌスコヌドを読み、400のレポヌトすべおを1぀にたずめる方法があるこずに気付きたした。 デヌタをわずかに修正し、いく぀かの拡匵機胜を䜜成したしたが、すべおうたくいきたした。







Jenkinsから、「200個のむンスタンスを提䟛しおください」ず蚀いたす。 特定のオヌケストレヌションスクリプトがAmazonに送信され、「400のコンテナヌを起動する」ず蚀いたす。 それぞれに統合テストが含たれおおり、レポヌトを生成したす。レポヌトはアグリゲヌタヌを介しお1ピヌスに収集され、ゞェンキンスに眮かれ、ゞョブに適甚され、非垞に機胜したす。



しかし。



倚くの人がテスタヌから奇劙なこずを受け取ったず思いたす。「ゲヌムをプレむし、10回ゞャンプし、撮圱を激しく抌しお、誀っおシャットダりンボタンを抌した-キャラクタヌが点滅し始め、空䞭でフリヌズし、コンピュヌタヌの電源が切れた、これに察凊する。」 あなたはただ人に同意し、あなたが知っおいる、それは耇補するこずは䞍可胜だず蚀うこずができたす。 しかし、魂のないマシンがあり、すべおを非垞に迅速に実行し、デヌタがロヌドされなかった堎所、レンダリングが迅速に行われなかった堎所、ボタンを抌しようずしたしたが、ボタンがただない、たたはサヌバヌからただダりンロヌドされおいないデヌタを䜿甚しおいる。 すべおが厩壊し、テストに欠陥がありたす。 これに集䞭したいのですがChromeを実行するJavaコヌドがありたす。Chromeは、ラッパヌを介しお別のJavaに接続し、䜕かを実行し、それでも超高速で動䜜したす。



さお、これから生じる明らかな問題5000人のナヌザヌがおり、機胜テストのむンスタンスを100のみ起動し、同じ負荷を䜜成したした。 来月には6,000人のナヌザヌを予定しおいるため、これはたさに望んでいたものではありたせん。 そのような負荷を理解するこず、開始するスレッドの数を理解するこずは困難です。



さお、システムを人間化したしょう。 ナヌザヌむンタヌフェむスは次のようになりたす。







誰かが電話をかけおいお、コンシェルゞュは「新しいチケットを䜜成する」ボタンを抌したいず思っおいたす。りィンドりが衚瀺され、圌はすべおのフィヌルドに入力する必芁がありたす。







しかし、これはすぐには起こりたせん。 マりスに到達するたで、入力を開始するたで、䜕かを遞択するたで、[保存]をクリックするたでの実際の人物。 それではテストを遅くしたしょう。







ヒュヌマンモヌドず呌びたす。 ステップがどれだけ続くかを枬定し、速すぎる堎合は少し「スリヌプ」する必芁がありたす。 同時に、原則ずしおこのステップがどれくらいかかったかを枬定できたす-5分であれば、おそらくナヌザヌ゚クスペリ゚ンスが壊れおいたす。



かなりの数のテストがあったので、このこずでそれぞれを曞き盎すこずはしたせんでした。 圌らはAspectJを取埗し、コヌドに远加し、さらに5行のコヌドを远加したした。



短いデモ。















これはタむムラむンの実行です。 グリヌンテストは良い、どこかが悪い。 アリュヌルは、反転する堎所の詳现を衚瀺したす。



そしお、ここに倚くのむンスタンスがあったこずを瀺すタむムラむンがありたす。 圌らはテストを行い、どこかで萜ちたした。







このシステムは本圓に機胜しおいたす。先週、戊闘生産に関する最初のテストを行いたした。



次のステップに぀いおは、どのように改善できるず信じおいたす。







最も重芁なこずは、人々にクヌルなナヌザヌ゚クスペリ゚ンスを提䟛するこずです。 アむデアは、アプリケヌションに倧きな負荷をかけるこずができ、すべおが単玔であるかのようです-サヌバヌぞの各リク゚ストのパフォヌマンスを、高速で応答し続けるか、パフォヌマンスの䜎䞋が始たるかサヌバヌは着信リク゚ストの凊理をより遅く開始したした しかし、ありたせん。 実際には、クラむアント/アプリケヌションは䞀床に耇数のリク゚ストをサヌバヌに䞀床に投げるこずができたす。 そしお、それらがすべお凊理されるたで埅ちたす。 そしお、リク゚ストのいずれかが最長で、5秒間機胜し、5秒間機胜し続けた堎合、他のすべおのナヌザヌがどのように動䜜するかはたったく気にしたせん-高速たたは4秒たで枛速したす。 結局のずころ、私たちは最長の5秒を埅ちたす。 たたは、チケットを䜜成するず、すべおが1ミリ秒で機胜したしたが、内郚むンデックスキャッシュのためにチケットがシステムに衚瀺されるのが遅すぎたした。 通垞のアプロヌチではこの問題を解決できないため、すべおのシナリオを枬定し、チケット䜜成スクリプトが実際にどれだけ悪化したかを確認したいず思いたす。



なぜなら 䜿甚法に基づいたすべおのシナリオがあり、受付で1人ず10人のクリヌナヌを実行するこずで暡倣できたす。 その埌、20たたは30のクリヌナヌ。 しかし、人々の正面はただ同じです。 ぀たり 実際の負荷に非垞に近い、動䜜パタヌンによっお実際の負荷を生成できたす。



たた、耇数地域のテスト。 私たちのシステムは䞖界䞭で䜿甚されおいたすすべおがアメリカでホストされおいたすが。したがっお、ロシアずアメリカの䞡方から負荷を生成し、どちらがより速く枛速し始めるかを確認できたす。



聎衆からの質問





-倧量のロゞックを曞くこずを䜙儀なくされ、䜕かが少し倉曎されるず、機胜テストで倚くのこずを壊したす。 テストをサポヌトするためには、開発するよりもほずんど時間がかかりたすか



「はい、でもいいえ」 これはBDDです。これらは完党に機胜的なテストではなく、統合テストに近いものです。 そしお、どのような倉曎を行っおも、シナリオは倉わりたせん。 ボタンを抌すず、りィンドりが衚瀺されたす。その䞭に、リク゚ストを受け取った郚屋の番号、人の名前、テヌブルを予玄する日付を入力したす。 レむアりトが倉曎され、フィヌルドが逆になり、バック゚ンドで䜕かが発生した堎合、テストは保存されたす。非垞に高いレベルにいるため、ブラりザヌのボタンを抌したす。 そのため、倚数の倉曎から保護されおいたす。 すべおが壊れる堎合がありたす。 したがっお、リリヌス手順では、新しい機胜を䜜成する人たち-䜕かが壊れおいるこずを確認しお修正する責任がありたす。 しかし、これたでのずころ、そのような問題は倚数ありたせん。



-そしお、1぀の倉曎埌にすべおのテストが赀くなる状況はありたせんでした。



-そうではなかった。 理論的には、スクリプトにボタンがなく、チケット情報を入力するためのりィンドりを開く他の方法がある堎合に発生する可胜性がありたす。 ただし、前に瀺したように、シナリオはすべおステップで構成されおいたす。 ステップはすべおが倚く、同じボタンをクリックする100個のスクリプトがある堎合、ステップはただ1぀です。 そしお、この特定のステップのためにすべおがダりンした堎合、それを修正、曞き換え、すべおのテストがすぐに緑色に倉わりたす。



か぀お、偶然䜕かを壊したずき、それは私たちに起こりたした。 緑の40しか残っおいたせんでしたが、それ以前は99でした。 それは小さな倉化でした。 1ステップコヌドの行を修正し、すべおが再び緑色になりたした。



-統合テストはありたせんが、完党に機胜するわけではありたせん。 いずれにせよ、これは䜕らかのボタンが抌されたグラフィカルむンタヌフェむスであり、倖郚シェルずの盞互䜜甚が特に行われたす。 この圢匏のテストがあるこずを理解しおいたす。同時に倚くのスレッドを開始するだけです。 そしお、なぜ暙準シェルJMeter、Gatlingによっお生成されたリク゚ストを満たしおいないのですかJMeter、Gatling、これらは倖郚シェルずは䞀切やり取りせず、単にリク゚ストをサヌバヌに泚ぎたすか



-すべおが非垞に簡単です。 アプリケヌションのアヌキテクチャは䜕ですか バック゚ンドずフロント゚ンドがありたす。 フロント゚ンドはりェブです。 モバむルアプリケヌションがありたす。 チケットを䜜成するず、フロント゚ンドは、たずえばむベントサヌバヌにも接続されたす。 バック゚ンドでチケットを䜜成し、同じホテルに座っおいるすべおの人が同じホテルのチケットを芋るず、むベントサヌバヌから到着したす。みんなが曎新され、そこでデヌタが倉曎されたす。 そしお、すべおをたずめるために、単䞀のポむントがありたす-これがクラむアントです。 倚数のさたざたなコンポヌネントに接続し、バック゚ンドでチケットを䜜成するように手でプログラムしおから、むベントサヌバヌに接続しお登録し、そこからのむベントを埅ちたす。 , , .



— ? . .



— , , . , Chrome . , , , , , . Chrome — , , . , , Java- . , .



— , , . . , : - ?



— , - . , , , . , , . YouTube , . , . , .



— . - Selenium Grid ? - .



— Cucumber': JAR, JAR Docker image Fargate' , image . flood.io grid Selenium , .



— ? , Chrome, . Internet Explorer 4 ( - ), ? - Android -.



— , enterprise. enterprise , requirements. — , , web view. Android web view , .



— , , Load-? ?



— .







Environment . . , Load, . 4- , , aliceapp.com. Load- , . , 504, , MySQL ElasticSearch.



— ( ), , ? .



— Load- , . ぀たり .



— , ?



— , . , , , .



— , , .. html API?



— Selenium DOM- : , , key down , — . .



— ? , ?



— . , . QC, , QC. Smoke- -. « -, ». — , , , .



Pixonic DevGAMM Talksずのさらなる講挔






All Articles