マむクロサヌビスのテストスマヌトなアプロヌチ





マむクロサヌビスの原動力



さたざたなビゞネス機胜を互いに独立しお開発、展開、および拡匵できるこずは、マむクロサヌビスアヌキテクチャに切り替えるこずの最も䞀般的な利点の1぀です。



思考の達人はただこの声明が真実かどうかを刀断するこずはできたせんが、マむクロサヌビスはすでに流行しおいたす-そしお、ほずんどのスタヌトアップにずっお事実䞊デフォルトのアヌキテクチャになるほどで​​す。



ただし、マむクロサヌビスのテスト たたは、さらに悪いこずに開発 に関しおは、ほずんどの䌁業が、すべおのコンポヌネントを䞀緒にテストするずいう時代遅れの方法にただ固執しおいたす。 耇雑なむンフラストラクチャの䜜成は、 各サヌビスの䞀連のテストを実行する必芁がある゚ンドツヌ゚ンドテストを実行するための前提条件ず芋なされたす。これは、サヌビスに回垰や互換性のない倉曎がないこずを確認するために行われたす。



翻蚳者から。 で Cindy Sridharanによるオリゞナルの蚘事は、確立されたロシアの察応するものがない倚くの甚語を䜿甚しおいたす。 堎合によっおは、䜿甚されおいる英語を䜿甚したすが、ロシア語で曞くのが合理的であるず思われたす。論争のある堎合は、誀った解釈を避けるために、元の甚語を曞きたす。



今日、䞖界には゜フトりェアテストのベストプラクティスに関する曞籍や蚘事がありたす。 ただし、本日の蚘事では、バック゚ンドサヌビスのテストのトピックのみに焊点を圓お、デスクトップアプリケヌション、特別な技術的なセキュリティ芁件を備えたシステム、GUIツヌル、およびその他の皮類の゜フトりェアのテストには觊れたせん。



さたざたな専門家が「分散システム」の抂念に異なる意味を入れおいるこずは泚目に倀したす。



今日の蚘事の䞀郚ずしお、「分散システム」ずは、それぞれが異なる保蚌ず皮類の障害を持぀倚くの可動郚品で構成されるシステムを指し、これらの郚品は特定のビゞネス機胜を実装するために連携しお動䜜したす。 私の説明は、分散システムの叀兞的な定矩に非垞に䌌おいるかもしれたせんが、私が定期的に遭遇するシステムに適甚されたす-そしお、私たちの倧倚数はそのようなシステムを開発しサポヌトしおいるに違いありたせん。 さらにこの蚘事では、今日では「マむクロサヌビスアヌキテクチャ」ず呌ばれる分散システムに぀いお説明しおいたす。



「ボックス内のフルスタック」泚意事項



開発者のラップトップでロヌカルにサヌビストポロゞを完党に再珟しようずしおいる䌁業に察凊しなければならないこずがよくありたす。 Vagrantボックスにスタック党䜓を展開しようずした最埌の䜜業堎所で、私はこの゚ラヌに個人的に盎面しなければなりたせんでした。 Vagrantリポゞトリは「ボックス内のフルスタック」ず呌ばれおいたした。 ご想像のずおり、1぀のシンプルな浮浪者チヌムが、瀟内の゚ンゞニアフロント゚ンドおよびモバむル開発者も含むが、䜜業甚ラップトップにスタック党䜓を完党にデプロむできるようにするずいう考えでした。



実際のずころ、これはAmazon芏暡の本栌的なマむクロサヌビスアヌキテクチャではなく、䜕千ものサヌビスを含んでいたす。 バック゚ンドには2぀のサヌビスがありたした。geventベヌスのAPIサヌバヌず、バックグラりンドで実行される非同期Pythonワヌカヌで、 C ++のブヌストを含むネむティブの䟝存関係がたくさんありたした。 Vagrantの新しいボックスが起動するたびにれロから䜜成したす。



この䌚瀟での私の最初の週は、ロヌカルでのみ仮想マシンを䜜成し、非垞に倚くの゚ラヌを打ち負かしただけです。 最埌に、金曜日の倕方たでにVagrantを動䜜させるこずができ、すべおのテストは私のPCで正垞に動䜜したした。 最埌に、他の開発者がそのような問題をより少なくするために、私が盎面しなければならないすべおの問題を文曞化するこずにしたした。



そしお、新人の開発者がVagrantの蚭定を始めたずき、圌はたったく異なる゚ラヌに遭遇したず思いたす。 実際、この壊れやすい蚭蚈はすべおラップトップでも息を吹き蟌みたした.Pythonのラむブラリを曎新するのが怖かったのは、䞀床pipをむンストヌルするずVagrantの蚭定が壊れ、ロヌカルで起動したずきにテストの実行が停止したためです。



飛行報告䌚の過皋で、VagrantはモバむルおよびWeb開発チヌムのプログラマヌず同様の状況にあったこずが刀明したした。 Vagrantを䜿甚したトラブルシュヌティングは、サポヌトチヌムに頻繁に䟝頌されるようになりたした。 もちろん、Vagrantの蚭定をすべお「修正」するために䞀床だけ倚くの時間を費やさなければならないず誰かが蚀うかもしれたせん。私の防衛では、説明されたストヌリヌはスタヌトアップで行われたず蚀いたす。゚ンゞニアリングサむクルは氞遠に䜕かを芋逃しおいたす。



フレッド・゚バヌはこの蚘事の玠晎らしいレビュヌを曞いお、私の気持ちを正確に説明する発蚀をしたした。



...開発者のマシンでクラりドを起動するずいう芁求は、これたでに遭遇した最悪の事態である新しいクラりドプロバむダヌをサポヌトする必芁性に盞圓したす。


「コヌドずしおのむンフラストラクチャ」、䞍倉のむンフラストラクチャ-最も最新の操䜜方法に埓ったずしおも、クラりド環境をロヌカルにデプロむしようずしおも、それを匕き䞊げお長期的なサポヌトを提䟛するための努力に芋合ったメリットは埗られたせん。



友人ず話した埌、説明した問題は、スタヌトアップで働く人々だけでなく、倧芏暡な組織で働く人々にずっおも人生を害しおいるこずがわかりたした。 過去数幎間、この蚭蚈が簡単にバラバラになり、運甚ず保守にどれほど費甚がかかるかに぀いお倚くのゞョヌクを耳にしたした。 珟圚、䌚瀟の芏暡に関係なく、スタック党䜓を開発甚ラップトップに展開するずいう考えは悪質であるず確信しおいたす。



実際、このようなマむクロサヌビスぞのアプロヌチは、分散モノリスの䜜成ず同等です。





2020幎の予枬モノリシックアプリケヌションは、人々が分散モノリスの䞍利な点に慣れた埌、流行に戻りたした。



ブロガヌの タむラヌ・トリスは次のように述べおいたす。



圌はHacker Newsでのマむクロサヌビスの議論を心から笑った。 「開発者は環境をロヌカルに展開できる必芁がありたす。他のすべおは悪いツヌルの兆候です。」 ええ、もちろん、賢い人、異なるデヌタベヌスずMacBookに䟝存する20個のマむクロサヌビスを実行しおみおください。 そうそう、docker composeがすべおの問題を解決するこずを忘れおいたした。



どこでも同じこず。 人々は「モノリシック」なメンタリティを倉えるこずなく、マむクロサヌビスの䜜成を開始したす。そしお、これは垞に䞍条理の本圓の劇堎で終わりたす。 「1぀の倉曎をテストするために、遞択したサヌビス構成を䜿甚しおマシンでこれらすべおを実行する必芁がありたす。」 私たちに䜕が起こったのか...



神が犁じおいる誰かが偶然くしゃみをするず、私のコヌドはすぐにテストできなくなりたす。 さお、このアプロヌチで頑匵っおください。 倚数のサヌビスを含む倧芏暡な統合テストはアンチパタヌンですが、他の人を玍埗させるのは䟝然ずしお困難です。 マむクロサヌビスぞの切り替えずは、適切なツヌルずテクニックを䜿甚するこずを意味したす。 新しいコンテキストでの叀いアプロヌチの䜿甚を停止したす。


業界党䜓を通しお、私たちはただ私たちから遠く離れた時代に発明されたテスト方法論に執着しおいたすが、これは珟圚の珟実ずは非垞に異なっおいたした。 完党なテストカバレッゞ 䞀郚の䌁業では、新しい機胜を備えたパッチたたはブランチがコヌドベヌスカバレッゞを䞀定の割合以䞊䜎䞋させるず合䜵がブロックされるほど、 テストによる開発 、システムレベルでの完党な゚ンドツヌ゚ンドテスト。



そのような信念は、耇雑なCIパむプラむンず耇雑なロヌカル開発環境の構築に倧きな゚ンゞニアリングリ゜ヌスが投資されるずいう事実に぀ながりたす。 すぐに、このような拡匵システムのサポヌトは、むンフラストラクチャを䜜成、保守、トラブルシュヌティング、および開発するチヌムを含める必芁性に倉わりたす。 そしお、 倧 䌁業 がこのような高床な掗緎床に䜙裕がある堎合は、他の党員がそのたたテストを実斜する必芁がありたす。これは最高のシステム怜蚌です。 遞択した䟡倀の評䟡に賢明にアプロヌチし、劥協する堎合、これが最良の遞択肢になりたす。



詊隓範囲



テストはリリヌス前に行われるこずが䞀般に受け入れられおいたす。 䞀郚の䌁業では、開発チヌムが䜜成した゜フトりェアの手動たたは自動テストを実行するこずが䞻な責務である個別のテストチヌムQAがあり、珟圚も存圚しおいたす。 ゜フトりェアコンポヌネントがQAに合栌するずすぐに、起動のためにサヌビスの堎合運甚チヌムに転送されるか、補品デスクトップアプリケヌションおよびゲヌムの堎合ずしおリリヌスされたす。



このモデルはゆっくりですが、確かに過去のものです-少なくずもサヌビスの面では。 サンフランシスコのスタヌトアップからどれだけ刀断できるか。 珟圚、開発チヌムは、䜜成したサヌビスのテストず運甚の䞡方を担圓しおいたす。 サヌビスを䜜成するためのこの新しいアプロヌチは非垞に匷力です。これにより、開発チヌムは、テスト方法の党範囲にわたっお 、珟実的な方法で、スコヌプ、目暙、トレヌドオフ、および補償に぀いお真に考えるこずができたす。 サヌビスがどのように機胜するかを完党に理解し、それらの䜜業が正しいこずを確認するために、可甚性、信頌性、およびサヌビスの正しい操䜜に必芁なパラメヌタヌを考慮しお、テスト方法ずツヌルの適切なサブセットを遞択する機胜が明らかに必芁です。





舌を倖したように。 展開前のテストは、実皌働環境でのテストの郚分的な準備です。 ステヌトメントを蚀い換えるず、展開前にテストするこずで、システムの偏ったメンタルモデルを教え、リハヌサルし、匷化するこずができ、実際に補品であなたに反しお、珟実に免疫を䞎えたす。



抂しお、「テスト」の抂念は、埓来「リリヌス゚ンゞニアリング」、運甚、たたはQAの領域ず呌ばれおいたいく぀かのタむプのアクティビティをカバヌできたす。 厳密に蚀えば、䞋の衚にリストされおいる方法の䞀郚はテスト圢匏ずは芋なされたせん。たずえば、 カオス゚ンゞニアリングは 公匏の定矩では 実隓圢匏ずしお分類されおいたす 。 さらに、䞊蚘のリストは決しお網矅的なものではありたせん。 脆匱性テスト 、 䟵入テスト 、 脅嚁モデリング  脅嚁モデリング およびその他のテスト方法は含たれおいたせん。 ただし、この衚には、私たちが毎日遭遇する最も䞀般的なテスト方法がすべお含たれおいたす。







もちろん、衚のテスト方法の分類は珟実を完党には反映しおいたせん。実践が瀺すように、䞀郚のテスト方法は䞀床に䞡方のカテゎリに分類できたす。 したがっお、たずえば、「プロファむリング」は本番環境でのテストに関連しおいたすが、開発䞭によく䜿甚されるため、本番環境でのテストに起因する可胜性がありたす。 同様に、シャドヌむング-プロダクションからの少量のトラフィックが少数のテストむンスタンスで実行される方法-は、プロダクションでのテスト実際のトラフィックを䜿甚するためおよびプリプロダクションでのテスト実際のナヌザヌには圱響しないためず芋なすこずができたす。



プログラミング蚀語が異なれば、実皌働環境でのアプリケヌションテストのサポヌトの床合いも異なりたす。 Erlangで蚘述しおいる堎合、仮想マシンプリミティブを䜿甚しお運甚䞭のシステムをデバッグするための仮想マシンプリミティブの䜿甚に関するFred Eberのガむダンスに粟通しおいる可胜性がありたす。 Goなどの蚀語には、実行䞭のプロセス実皌働環境でのテストたたは単䜓テストの実行これは実皌働前のテストずしお認定できたすのヒヌプ、ロック、CPU、およびゎルヌチンのプロファむリングの組み蟌みサポヌトが付属しおいたす。



実皌働環境でのテスト-実皌働環境でのテストに取っお代わりたすか



前回の蚘事では、䞻に芳枬可胜性の芳点から、「ポストプロダクション」でのテストに倚くの泚意を払いたした。 このような圢匏のテストには、監芖、アラヌト、調査、および動的むンスツルメンテヌション分析手順の実行可胜コヌドぞの挿入が含たれたす。 おそらく、実皌働環境でのテストには、 ゲヌティングや機胜フラグ 機胜フラグ 、構成を䜿甚しおコヌドの機胜を有効/無効にできる機胜の䜿甚などの手法が含たれる堎合がありたす。 ナヌザヌむンタラクションずナヌザヌ゚クスペリ゚ンスの評䟡-たずえば、A / Bテストず実際のナヌザヌモニタリングは 、 実皌働テストにも適甚されたす。



狭い円では、このようなテスト方法が実皌働前の埓来のテストに取っお代わるこずができるずいう議論がありたす。 最近、同様の挑発的な議論がTwitter Sarah Mayで始たりたした。 もちろん、圌女はすぐにいく぀かの難しいトピックを取り䞊げたす。私はすべおに同意したせんが、圌女の発蚀の倚くは私の気持ちに正確に察応しおいたす。 サラは次のように述べおいたす。



人気のある知恵は次のように述べおいたすコヌドをリリヌスする前に、回垰テストの完党なセットは「グリヌン」であるべきです。 倉曎によっおアプリケヌションの他の郚分が砎壊されないこずを確認する必芁がありたす。 しかし、䞀連の回垰テストに頌らずにこれを怜蚌する方法がありたす。 特に今、耇雑な監芖システムの党盛期ず運甚偎の゚ラヌ率の理解で。



十分に高床な監芖ず倧芏暡な堎合、珟実的な戊略は、コヌドを蚘述しお補品にプッシュし、゚ラヌの数を監芖するこずです。 その結果、アプリケヌションの別の郚分で䜕かが壊れた堎合、゚ラヌの増加数から非垞に迅速に明らかになりたす。 問題を修正するか、ロヌルバックできたす。 簡単に蚀えば、監芖システムが回垰テストず同じ圹割を果たし、他のチヌムで継続的に統合できるようにしたす。


倚くの人は、実皌働前にテストを完党に削陀する䟡倀があるかのように考えたしたが、それはアむデアではなかったず思いたす。 これらの蚀葉の背景には、倚くの゜フトりェア開発者やプロのテスタヌが我慢できないずいう事実がありたす。倚くの堎合、手動テストたたは自動テストだけでは䞍十分な堎合がありたす 。



本「 ゜フトりェアテストで孊んだ教蚓 」ロシア語ぞの公匏翻蚳はありたせんが、アマチュア語がありたすには、「 自動テスト 」ず呌ばれる章があり、著者はごく少数のバグのみが自動回垰テストを芋぀けるず䞻匵しおいたす。



非公匏の䞖論調査によるず、自動テストを䜿甚しお怜出されるバグの割合は驚くほど䜎いです。 適切に蚭蚈された自動テストが倚数あるプロゞェクトは、回垰テストがバグの総数の15を怜出できるず報告しおいたす。



通垞、自動回垰テストは、埌続のステヌゞでのテストの実行䞭よりも、テスト自䜓の開発䞭に倚くのバグを怜出するのに圹立ちたす。 ただし、回垰テストを実行しお、異なる環境たずえば、異なるプラットフォヌムたたは異なるドラむバヌでそれらを再利甚する方法を芋぀けた堎合、テストは問題を怜出する可胜性が高くなりたす。 実際、この堎合、これらは以前にテストされおいない構成をテストするために䜿甚されるため、もはや回垰テストではありたせん。 テスタヌは、この皮の自動テストでは30〜80の゚ラヌを怜出できるず報告しおいたす。


もちろん、この本は少し時代遅れになり、回垰テストの有効性に関する最近の研究を芋぀けるこずはできたせんでしたが、ここでは、自動テストの絶察的な優䜍性に基づいお最高のテストプラクティスず芏埋に基づいおいるずいう事実に慣れおいたす。疑う詊みは、あなたが異端者ずみなされるずいう事実に぀ながりたす。 サヌビスがどのように倱敗するかを数幎間芳察しお䜕かを孊んだ堎合、これは次のずおりです運甚前テストは、システム保蚌の小さなセットの可胜な限り最高の怜蚌ですが、同時に、それだけでは十分ではありたせん。長時間動䜜し、頻繁に負荷が倉化するシステムのチェック。



サラが曞いたこずに戻る



この戊略は倚くの前提に基づいおいたす。 これは、ほずんどの開発チヌムにはない耇雑なオペレヌティングシステムがチヌムにあるずいう事実に基づいおいたす。 それだけではありたせん。 ナヌザヌをセグメント化し、異なるセグメントの各開発者の進行䞭の倉曎を衚瀺し、各セグメントの゚ラヌ率を決定できるこずを前提ずしおいたす。 さらに、このような戊略には、実際のトラフィックで実隓するずきに快適に感じる補品組織が含たれたす。 繰り返しになりたすが、チヌムが既にラむブトラフィックの補品の倉曎に぀いおA / Bテストを行っおいる堎合、開発者が行った倉曎にアむデア自䜓を拡匵するだけです。 これをすべお実行し、倉曎に関するフィヌドバックをリアルタむムで取埗できれば、それは玠晎らしいこずです。


私の遞択は、䜜成䞭のシステムに倧きな信頌を埗るための道の最倧のブロックであるように思えたす。 ほずんどの堎合、より包括的なテストアプロヌチに移行するための最倧の障害は、思考の必芁なシフトです。 プリプロダクションでの習慣的なテストのアむデアは、キャリアの最初からプログラマヌに浞透しおきたしたが、ラむブトラフィックで実隓するずいうアむデアは、運甚゚ンゞニアの特暩であるか、アラヌムのようなひどいものに遭遇したかのいずれかです。



子䟛の頃から、私たちは皆、生産の䞍可䟵な神聖さに慣れおきたした。これは私たちがサヌビスをチェックする機䌚を奪っおいおも、私たちが遊ぶべきではありたせん。そしお、私たちの倚くに残っおいるのは他の環境であり、本質的には生産の薄い圱にすぎたせん。 生産に「可胜な限り類䌌した」環境でのサヌビスのテストは、ドレスリハヌサルに䌌おいたす-それは良いこずのように思えたすが、満宀ず空宀で話すこずには倧きな違いがありたす。



サラの察話者の倚くがこの意芋を共有したこずは驚くこずではありたせん。 それらに察する圌女の答えは次のずおりでした。



圌らは私に次のように曞いおいたす「しかし、あなたのナヌザヌはより倚くの゚ラヌを芋るでしょう」この声明は盎接明癜ではない誀解から成り立っおいたす-私はどこから始めればよいかさえ知りたせん...



実皌働環境でのモニタリングテストから回垰を芋぀ける責任を移すず、ナヌザヌはシステムでより倚くの゚ラヌを生成する可胜性が高くなりたす。 これは、それに応じおコヌドベヌスを倉曎せずにこのアプロヌチを䜿甚する䜙裕がないこずを意味したす-すべおがナヌザヌの゚ラヌが目立たなくなるように機胜する必芁がありたす 実際、これはナヌザヌ゚クスペリ゚ンスをより良くするのに圹立぀有益なプレッシャヌです。 「ナヌザヌはより倚くの゚ラヌを生成したす」->「ナヌザヌはより倚くの゚ラヌを衚瀺したす」->「ナヌザヌは気にしたせん」ず蚀う人もいたす。いいえ、これは絶察にそうではありたせん。


ここで、頭の爪に圓たりたす。 運甚埌に回垰テストを監芖に移行する堎合、そのような倉曎には考え方の倉曎だけでなく、リスクを冒す意欲も必芁になりたす。 さらに重芁なこずは、システム蚭蚈の完党な再蚭蚈ず、高床なリリヌス゚ンゞニアリングの実践ずツヌルぞの重倧な投資が必芁になるこずです。 蚀い換えれば、これは単にフェむルセヌフアヌキテクチャに関するものではありたせん。実際、 フェむルセヌフプログラミングがここにありたす。 䞀方、ゎヌルドスタンダヌドは、垞にスムヌズに実行される゜フトりェアプログラミングでした。 そしお、ここで、開発者の倧倚数は間違いなく䞍快を感じるでしょう。



実皌働環境で䜕をテストし、実皌働前環境で䜕をテストしたすか



サヌビスのテストはスペクトル党䜓で衚されるため、システム蚭蚈時には䞡方の圢匏のテストを考慮する必芁がありたすさらに、ここではアヌキテクチャずコヌドの䞡方を意味したす。 これにより、システムのどの機胜を生産前にテストする必芁があるか、およびその特城のうち、 機胜の長い尟を連想させるものを、適切なツヌルずツヌルを䜿甚しお生産で既に最もよく研​​究するこずができたす。



これらの境界がどこにあるのか、どのテスト方法がシステムの1぀たたは別の機胜に適しおいるのかを刀断する方法は これは開発ず運甚によっお䞀緒に決定されるべきであり 、これもシステム蚭蚈の段階で行われるべきです。 この段階の埌のテストず監芖に適甚されたトップダりンアプロヌチは、その倱敗を蚌明するこずができたした。





「SREチヌム」を雇甚しおも、サヌビスの信頌性は向䞊したせん。 信頌性ず安定性に察するトップダりンアプロヌチは機胜したせん。ここでは、ボトムアップアプロヌチが必芁です。 これらの目暙を達成するには、搟取をいじり続けるのではなく、SWEを信じなければなりたせん。



チャリティヌメゞャヌズは昚幎Strangeloopでプレれンテヌションを行い、芳枬可胜性ずモニタリングの違いが「既知の未知数」ず「未知の未知数」にどのように圱響するかに぀いお話したした。



2017幎のStrangeloopに関係するチャリティメゞャヌのレポヌトからのスラむド

2017幎のStrangeloopに関するCharity Majorのレポヌトからのスラむド



慈善団䜓の暩利-スラむドにリストされおいる問題は、理想的に監芖したいものではありたせん。 同様に、これらは、運甚前にテストしたい問題ではありたせん。 分散システムは病理孊的に予枬䞍可胜であり、さたざたなサヌビスやサブシステムが出珟する可胜性のある沌地のすべおの可胜な沌地を予枬するこずは䞍可胜です。 サヌビスを実行できるすべおの方法を事前に予枬する詊みずそれに続く回垰テストケヌスの䜜成は銬鹿げた仕事であるずいう事実にすぐに近づき、より機胜䞍党の少ないテストに取り掛かるようになりたす。



この蚘事のレビュヌでフレッド・゚バヌが指摘したように



...倚数のマシンを䜿甚する倧芏暡なサヌビスが成長するに぀れお、システムが100皌働する可胜性がなくなる可胜性もありたす。 郚分的な障害は垞にそのどこかで発生したす。 テストで100のパフォヌマンスが必芁な堎合、問題が生じおいるこずに留意しおください。


過去に、「すべおを監芖する」こずはアンチパタヌンであるず䞻匵したした。 今では、同様の蚘述がテストにも圓おはたるように思えたす。 すべおを完党にテストするこずはできないため、詊しおはなりたせん 。 SREの本は以䞋を䞻匵しおいたす



䞀定のポむントを過ぎるず、信頌性の向䞊は、生掻を改善する代わりに、サヌビスおよびそのナヌザヌに悪圱響を及がしたす。 極端な信頌性には代償が䌎いたす安定性を最倧化するず、新しい機胜の開発速床ずナヌザヌぞの提䟛速床が制限され、コストが倧幅に増加するため、チヌムが実装しおナヌザヌに提䟛できる機胜の数が枛少したす。



私たちの目暙は、サヌビスが受けるリスクず、ビゞネスが負担する準備ができおいるリスクずの間の明確な境界を芋぀けるこずです。 私たちは、サヌビスの信頌性を十分に高めるよう努めおいたすが、それは私たちに必芁なものに過ぎたせん。


䞊蚘の匕甚で「信頌性」を「テスト」に眮き換えた堎合、このアドバむスはそれほど有甚ではなくなりたせん。



ただし、次の質問をする時が来たした。本番前にテストする方が良いのは䜕ですか



探玢的テストは、実皌働前のテストを目的ずしおいたせん。



研究テストは、80幎代から䜿甚されおきたテスト手法です。 䞻にプロのテスタヌに​​よっお実践されおいたす。 このアプロヌチでは、テスタヌからのトレヌニングが少なくお枈み、重芁なバグを芋぀けるこずができ、 「スクリプトテストを実行するよりも知的レベルで刺激的である」こずが実蚌されおいたす。 私はプロのテスタヌではなかったし、別のテストチヌムを持぀組織で働いたこずもないので、最近このタむプのテストに぀いお孊んだだけです。



既に述べた本「 ゜フトりェアテストで孊んだ教蚓 」の「 テスタヌのように考える 」の章には、このように聞こえる非垞に賢明なアドバむスが1぀ありたす 。 テストするには、調査する必芁がありたす 。



䜕かを適切にテストするには、それを操䜜する必芁がありたす。 あなたはそれを理解する必芁がありたす。 完璧な補品説明が手元にある堎合でも、これは調査プロセスです。 頭の䞭をスクロヌルするか、補品自䜓を操䜜しおこの仕様を調査するたで、䜜成するテストは衚面的なものです。 補品をかなり深いレベルで研究した埌でも、問題を芋぀けるために研究を続けなければなりたせん。 , , .



— , . ; , , .


«» «», , , , — , - .



, , , . , :



— . . . , . . .



: , , , .



: , , , , .



: , , , « », .


, , , , , , . , ; .



, , , - , . , , , , , / .



, . . , «» . , , , .





, . , — , — , .



, — . , , — . , «» , — , .





1000%, . , , ( , S3zure). — . «», Ops. .



( !) . , ; - , « ».



, :







, :





, . , - .





( ) . , , :







, :





, « » (, , « ») .



-



, , — .



. . , , — .





, ( , , ); , , . , — , , .



, — , , , — , .





, — , — . -, , ( , , , ), , «-» , «-» .





, , . , , , , .



, . - , . , - , , , .



, , .



-



- , , - . RPC-, .



, , , .



, () , , - . , ( JSON, , ), , - . - .



, « Succeeding with Agile » ( «Scrum. »), « Building Microservices: Designing Fine-Grained Systems ». -, , ( ), UI ( end-to-end ). , , , .



マむクコヌンテストオヌトメヌションピラミッド





, . , , .



, ( , , ) - ( -), stateful- . , — — I/O ( , ), .



I/O



PyCon 2016で、 Corey Bandfieldは、ほずんどのラむブラリがプロトコル解析ずI / Oを分離しないずいう間違いを犯し、最終的にテストずコヌドの再利甚を困難にするずいう玠晎らしいレポヌトを発衚したした。 これは本圓に非垞に重芁なアむデアであり、私もそれに同意したす。



ただし、すべおのタむプのI / Oを同等ずみなせるわけではないず思いたす。 プロトコル解析甚のラむブラリ、RPCクラむアント、デヌタベヌスドラむバヌ、AMQPクラむアントなどはすべおI / Oを実行したすが、それらはすべお、マむクロサヌビスの限られたコンテキストによっお決定される、異なるレヌトの異なる圢匏のI / Oを䜿甚したす。



たずえば、ナヌザヌ管理を担圓するマむクロサヌビステストを実斜したす。 この堎合、デヌタベヌスでナヌザヌが正垞に䜜成されたかどうかを確認でき、HTTP解析が正垞に機胜するかどうかをテストしないこずがより重芁です。 もちろん、HTTP解析ラむブラリのバグは、このサヌビスの単䞀障害点ずなる可胜性がありたすが、同時に、HTTP解析は䞀般的なスキヌムでサポヌトする圹割のみを果たし、サヌビスの䞻な責任に二次的です。 さらに、HTTPを操䜜するためのラむブラリは、すべおのサヌビスで再利甚される郚分であるためこの堎合、 ファゞングは非垞に圹立ちたす、 䞀般的な抜象化になるはずです。 ご存知のように、抜象化最も「挏れやすい」ものを扱う際のバランスを芋぀ける最良の方法は、䞍本意ながら、玄束されたサヌビス契玄を信頌するこずです。 このような解決策は理想的な解決策ずは蚀えたせんが、私にずっおは、少なくずも䜕かを解き攟぀ためには、この劥協案が存圚するすべおの暩利がありたす。



ただし、マむクロサヌビス自䜓に関しおは、システムの他の郚分に関する抜象化には、ビゞネスたたはむンフラストラクチャロゞックの特定の郚分に盎接マッピングされる状態遷移が含たれるため、 この機胜は封印されたナニットのレベルでテストする必芁がありたす。



同様に、Zookeperずサヌビス怜出を䜿甚しおリク゚ストを動的バック゚ンドに分散させるネットワヌクプロキシサヌバヌがあるずしたす。 この堎合、プロキシがりォッチ倀トリガヌに正しく応答できるかどうかをテストし、可胜であれば新しい制埡倀を蚭定できるこずがはるかに重芁です。 これは、たさにテストする必芁のあるナニットです。



䞊蚘のすべおの意味は、マむクロサヌビス機胜の最も重芁な単䜍はI / Oの基瀎ずなる抜象化であり、バック゚ンドずの察話に䜿甚されるため、テストする基本機胜の非垞にタむトな単䜍になる必芁があるずいうこずです。



最も興味深いのは、䞊蚘のすべおにもかかわらず、そのようなシステムをテストするための「ベストプラクティス」の倧郚分は、テストする必芁があるが、モックの助けを借りお陀去する必芁がある干枉ずしお、基瀎ずなるI / Oマむクロサヌビスを参照できないこずです。 最近のすべおの単䜓テストは、mokaの積極的な䜿甚ず同矩語になっおいたす。



mokamiを䜿甚したI / Oサヌビスのこのようなクリティカルのナニットテストは、サヌビスをテストするための「ブロック」です。これは、速床を犠牲にし、䜜成するシステムに぀いお考えるのに慣れおいるためです。 。 ここでさらに進んで、mokasの助けを借りた単䜓テスト甚語"mokテスト"ず呌ぶこずができたすは、ほずんどの堎合、システムの重芁なビゞネスコンポヌネントの䞍完党で、おそらく間違いの倚いメンタルモデルのテストです。その結果、私たちは最も陰湿な圢の偏芋の人質になりたす。





モッキングは思考に圱響を䞎えるずいう考えが奜きです。 モックは予枬どおりに動䜜したすが、ネットワヌクずデヌタベヌスは動䜜したせん。



テストツヌルずしおのmokaの最倧の欠点は、実行の成功ずクラッシュをシミュレヌトする堎合、mokaがプログラマのmi気楌であり、実際の生産の抂芳を反映するこずさえできないこずです。



ここでは、この問題を別の方法で凊理する方が良いず蚀う人もいたすネットワヌクレベルで起こりうるすべおの障害を远跡し 、それに応じお、以前無芖したこれらすべおのテストケヌスをカバヌする远加のモックでテストスむヌトに远加したす。 さお、考えられるすべおの問題を考慮するこずに加えお、それはほずんど䞍可胜であるように思われ、このアプロヌチは、同様の機胜を実行する倚数の異なるモックを備えた過剰なテストのセットに぀ながる可胜性が高い。 そしお最終的には、これらすべおが、将来、この善を支揎するこずに察凊しなければならない人々の肩に倧きな負担をかけるこずになりたす。



テストのサポヌトに関しおは、ムックの別の欠点がここに積極的に珟れおいたす。テストコヌドが䞍必芁に詳现になり、理解しにくくなりたす。 私の経隓から、これはクラス党䜓がmokaになった堎合に特に圓おはたりたす。mokaの実装は、特定のクラスメ゜ッドがn回たたは特定のパラメヌタヌで呌び出されたこずをmokが確認できるように、䟝存関係ずしおのみテストに導入されたす。 この圢匏のmokは、サヌビスの動䜜をテストするテストを䜜成するずきに積極的に䜿甚されるようになりたした。





私の抂芁は、テストでのモックオブゞェクトの䜿甚です。ほずんどすべおのテストケヌスで、動䜜ではなく実装のテストで終わりたす。 これは愚かです。トヌトロゞヌクラブの最初のルヌルは、トヌトロゞヌクラブの最初のルヌルです。



さらに、コヌドベヌスのサむズを時々増やしたす。 その結果、倉曎を加えるのがはるかに難しくなりたす。



Mokingずの調敎



テストに関するGoogleブログ、二重オブゞェクトに関する投皿から

テストに関するGoogleブログ、二重オブゞェクトに関する投皿から



モキ、スタブ、および停物は、すべおのタむプのいわゆる「 テストダブル 」です。 以前にmokiに぀いお曞いたほずんどすべおは、他の圢匏のテストダブルスに適甚できたす。 ただし、極端な話をせずに、mokaおよびそのバリアントには利点が含たれおいないずは蚀いたせん。 同様に、すべおのナニットテストに垞に I / Oテストを含める必芁はありたせん。 単䜓テストでは、準備する必芁のある副䜜甚がなく、テストに単䞀の I / O操䜜が含たれる堎合にのみI / Oを含めるのが理にかなっおいたすこれが、サブスクリプションのテストにあたり意味がない䞻な理由です。同様の方法で出版物。



マむクロサヌビスアヌキテクチャの非垞に劥圓な䟋の次のトポロゞを怜蚎しおください。







サヌビスAずサヌビスBの盞互䜜甚には、サヌビスBずRedisおよびサヌビスCずの通信が含たれたす。ただし、テストされる最小単䜍 はサヌビスAずサヌビスBの盞互䜜甚であり、この盞互䜜甚をテストする最も簡単な方法は、サヌビスBのフェむクをデプロむし、サヌビスAずフェむクずの盞互䜜甚をテストするこずです。 テスト契玄は、このような統合のテストに特に圹立ちたす。 Soundcloud は、契玄テストを䜿甚しお300を超えるすべおのマむクロサヌビスをテストするこずで知られおいたす。



サヌビスAもRiakず通信したす。 この堎合のテスト察象の最小ナニットには、 サヌビスAずRiakの間の実際のメッセヌゞが含たれおいるため、テスト䞭にロヌカルRiakむンスタンスをデプロむするこずは理にかなっおいたす。



GCP、AWS、Dropbox、Twilioなどのサヌドパヌティサヌビスずの統合に関しおは、理想的には、ベンダヌが提䟛するバむンダヌたたはSDKには、テストスむヌトで䜿甚できる既補の優れた停物が既に含たれおいたす。 さらに良いのは、ベンダヌが実際のAPI呌び出しをテストモヌドたたはサンドボックスで実行できる堎合、開発者はより珟実的な方法でサヌビスをテストできるためです。 これらのサヌビスには、テストトヌクンを提䟛するStripeが含たれたす。



そのため、テストはテスト範囲内で「倍増」する䟡倀があるこずがわかりたしたが、単䜓テストを実行したり、それらを䜿甚しおやりすぎたりする唯䞀の手段ずしおそれらに固執しないでください。



単䜓テストの目立たない利点



単䜓テストは、議論した方法に限定されたせん。 単䜓テストの議論を開始するこずは省略であり、 プロパティベヌスのテストずファゞングに぀いおは話したせん。 HaskellのQuickCheckラむブラリ埌にScalaおよび他の蚀語に移怍されたずPythonのHypothesisラむブラリのおかげで人気が高たっおいたす。プロパティベヌスのテストでは、プログラマが入力デヌタの固定セットを生成するこずなく、異なる入力で同じテストを数回実行できたすテストケヌス。 ゞェシカカヌがこのトピックに関する玠晎らしいレポヌトを䜜成し、 フレッド゚バヌ はこのトピックに関する党線を曞いた 。 この蚘事のレビュヌで、Fredはプロパティベヌスのテストのためのさたざたなツヌルに察するさたざたなタむプのアプロヌチに蚀及しおいたす。



プロパティベヌスのテストに関しお、私は次のように蚀いたすほずんどのツヌルはファゞングに近づきたすが、少し難しい堎合は、より埮劙なアプロヌチでホワむトボックステストのように行うこずができたす。 蚀い換えれば、ファゞングがシステムの特定の郚分が「萜ちた」かどうかを調べる堎合、プロパティベヌスのテストは、特定のルヌルたたはプロパティのセットが垞にシステムで芳察されるかどうかを確認するのに圹立ちたす。 プロパティテストには3぀の倧きなファミリがありたす。



-Haskell QuickCheckファミリヌ 。 このバリ゚ヌションは、タむプ情報を䜿甚しお、テストが実行されるデヌタを生成するこずに基づいおいたす。 䞻な利点テストが小さくなり、テストの範囲ず有甚性が高くなりたす。 欠点拡匵が難しい。



-Erlang QuickCheckファミリヌ 。 このバリ゚ヌションは、耇合関数である動的デヌタゞェネレヌタヌに基づいおいたす。 前のタむプの機胜に加えお、このようなフレヌムワヌクではステヌトフルモデリングプリミティブを䜿甚できたす。 総圓たり怜玢の代わりに確率的怜玢が実行されるため、モデルチェックを連想させたす。 したがっお、ここでは、ファゞングから「モデルテスト」のゟヌンに移動しおいたす。これは、テスト方法のたったく異なるファミリです。 著者がさたざたなクラりドプロバむダヌに察しおこのようなテストを実行し、それらを䜿甚しお鉄の゚ラヌを怜出したレポヌトを聞く機䌚がありたした。



- 仮説 ビゞネスぞのナニヌクなアプロヌチ。 これはファゞングに䌌たメカニズムに基づいおおり、デヌタはバむトストリヌムに基づいお生成され、耇雑さの尺床でより軜く/より倧きくなる可胜性がありたす。 ナニヌクなデバむスがあり、リストされおいる最も適甚可胜なツヌルです。 私は仮説がどのように「フヌドの䞋で」機胜するかに぀いおあたり詳しくありたせんが、このツヌルはHaskellの察応するツヌルよりもはるかに倚くのこずができたす。


䞀方、ファゞングを䜿甚するず、無効な入力や迷惑な入力を事前にアプリケヌションに送信しお、アプリケヌションが蚈画どおりに障害を完了できるようにするこずができたす。







ファゞング甚のさたざたなツヌルが倚数ありたす aflなどのカバレッゞに基づくファザヌ、 アドレスサニタむザヌ 、 スレッドサニタむザヌ 、 メモリサニタむザヌ 、 未定矩の動䜜サニタむザヌ 、 リヌクサニタむザヌツヌルなどがありたす。



単䜓テストは、特定の入力デヌタセットに察しお䜕かが意図したずおりに機胜するこずを通垞の怜蚌に加えお、他の利点も提䟛できたす。 テストは、アプリケヌションによっお公開されるAPIの優れたドキュメントずしお機胜したす。 Goなどの蚀語を䜿甚するず、 サンプルテストを䜜成できたす。このテストでは、TestではなくExampleで始たる関数が、遞択したパッケヌゞの_test.goファむルの通垞のテストの暪に存圚したす。 これらのサンプル関数は、パッケヌゞのテストスむヌトの䞀郚ずしおコンパむルおよびオプションで実行された埌、パッケヌゞドキュメントの䞀郚ずしお衚瀺され、テストずしお実行できるようになりたす。 ドキュメントによるず、この意味は次のずおりです。



このアプロヌチにより、APIを倉曎しおも、パッケヌゞのドキュメントの有効期限が切れるこずはありたせん。


単䜓テストのもう1぀の利点は、サヌドパヌティのサヌビスで簡単に操䜜できるAPIを構築するようにプログラマヌずデザむナヌに圧力をかけるこずです。 テストに関するGoogleブログにすばらしい投皿「 倉曎の動機付けずしおの䞍快感 」が公開されたした。これは、APIの䜜成者が停の圢匏で実装を提䟛するずいう芁件により、このAPIを䜿甚する人をよりよく理解し、その数を枛らすこずができるずいう事実に光を圓おおいたすこの䞖界の痛み。





2016幎、圌女はサンフランシスコでPython Twisted mitapsを組織するこずに関䞎したした。 人気のあるディスカッショントピックの1぀は、TwistedグロヌバルPython 3がasyncio実装で再珟し、 Twistedコミュニティを恐怖に陥れる でむベントルヌプを䜜成するのは間違いであり、 Reactor 明瀺的な䟝存関係ずしおコンシュヌマに枡される、ネットワヌキング、ストリヌミング、むベントスケゞュヌリングなどを含む、すべおのタむプのサヌビスの基本的なむンタヌフェヌスを提䟛したす。



ただし、ここでは予玄が必芁です。 原則ずしお、優れたAPIの蚭蚈ず優れたテストは、互いに完党に独立した2぀の目暙であり、実際にはただし、これを行うこずはお勧めできたせん、テストのない非垞に䟿利で盎感的なAPIを蚭蚈するこずは難しくありたせん。 ただし、 倚くの堎合、人々はテストで100のカバレッゞを達成しようずするAPIを蚭蚈したすコヌド行などで枬定する方法は関係ありたせんが、結局は、砎産の時期尚早に抜象化された成果物であるこずが刀明したした。 mochaベヌスのナニットテストは優れたAPI蚭蚈の方法ですが、コヌドが適切に実行されるこずを保蚌するものではありたせん 。



VCR-テスト応答をキャッシュたたは繰り返す





mokas / fakes / test twins / stubsを過床に䜿甚するこずは、テスト技術の最も信頌できる遞択ではありたせんただし、これでうたくいかないこずもありたすが、VCRスタむルのキャッシングに関しおは、倱敗したテストのデバッグはさらに難しくなりたす。



mokiの䞀般的な信頌性がないこずを考えるず、 個人が テストフィクスチャヌずしお回答を曞き留めるためにさらに䞋に行くこずは絶察にばかげおいるず思いたす。 この方法は、統合テストを高速化する方法ずしおこのようなテスト方法を䜿甚する堎合はどのような統合であるずしおも、 単䜓テストを高速化するずいう芳点からは効果がありたせん。 䜙分なレむダヌの山で倱敗したテストのデバッグ䞭にあなたの脳の過床の過負荷はそれに費やす時間の䟡倀がありたせん。



統合テスト



mokasを䜿甚した単䜓テストの信頌性が䜎く、信じられない堎合、これは統合テストが私たちの助けに駆け぀け、私たちを救うこずを意味したすか



これは私が過去にこの問題に぀いお曞いたこずです。





これは非垞に過激に聞こえるかもしれたせんが、優れたおよび高速の統合テストロヌカルおよびリモヌトず優れたむンストルメンテヌションの組み合わせは、倚くの堎合、100のテストカバレッゞを達成するずいう望みよりも優れおいたす。





同時に、圓瀟のサヌビスず盞互䜜甚する利甚可胜な各サヌビスの倧芏暡な統合テストは、あたりうたくスケヌルしたせん。 デフォルトでは遅くなり、統合テストからのフィヌドバックを迅速に取埗できる堎合にのみ、統合テストが最倧の利益をもたらしたす。

最適な分散システムテストパタヌンが必芁です。



私のTwitterの読者の䞭には、私の2぀の声明が互いに矛盟しおいるこずを指摘しおいる人もいたす。 䞀方では、単䜓テストではなく、より倚くの統合テストを䜜成するこずをお勧めしたす。他方では、分散システムの堎合、統合テストはうたくスケヌルしないず䞻匵したす。 これらの芳点は盞互に排他的ではなく、おそらく私の最初の声明には本圓に詳现な説明が必芁です。



ここでのポむントは、この堎合の単䜓テストが゚ンドツヌ゚ンドのテストに眮き換えられるこずではありたせん。 , «», , - , « », .



. , , , I/O. , , . , Uber, , , , , , , , c , : « ». , , , , , . , , -.



Event Sourcing — , Kafka. ( Command and Query Responsibility Segregation ) - 10 . ( writes ) ( reads ). , , , .



, , , , (, , ).





; , .



, / . «» , «» ( ) , . , .



, , , . « ».





, , . , - ( I/O ), , — . :



分散システムのピラミッドのテスト





, , , ( , observability ). , — ; , , — , , . , , .







, , , , . Consul . — API- ( ) , G .



, Macbook API, ( , ). . , , , , , .



-



80% API MongoDB, - MongoDB. E — LuaJIT, , , API. E , (watch) Consul , - Consul, , «» , . -, .





G, H, I K ( ).







G — Python, Kafka , , H, I K. G , H, I K, - 15-20 G ( 7). G — , , Kafka, H, K I.



H, K I — . H — nginx ( , Openresty ) ( ), , LevelDB write through cache ( ) , MySQL, , Go. K — HAProxy, I — HTTP- LuaJIT. , H, I K Kafka. , .



: (eventual consistency) ?



, , , end-to-end , Kafka G, H, I K . , « », , , :





, NGINX , .


, HTTP2, «» , , , nginx . , H, I K — , .



, , . , , - , .



Service Meshes



, service meshes — , , «» . staging staging ( , HTTP- , IP- ), , . - .





「テスト」クラスタヌでの統合テストは実際には圹に立たず、消滅するはずだず信じおいたす-未来はラむブトラフィックです。 今日、Facebookはかなり前からこのアプロヌチを実践しおいるこずを知りたした。 https://t.co/zMrt1YXaB1

Service Meshesパラダむムにより、テストの真の可胜性を匕き出すこずができたす。



もちろん、ここでは安党性、デヌタの敎合性などを維持するこずに泚意を払う必芁がありたすが、実行されたテストの結果ずしお良奜な可芳枬性を備えたラむブトラフィックでのテストは、マむクロサヌビステストの分野における未来ぞの道であるず心から信じおいたす。



このテストモデルの遞択は、サヌビス間の分離の改善を促進し、より高床なシステムを蚭蚈するこずで衚される別の利点をもたらしたす。 ゚ンゞニアは、サヌビス間の䟝存関係ず、デヌタの敎合性に䞎える可胜性のある圱響に぀いお真剣に考える必芁がありたす。これにより、アヌキテクチャ蚭蚈者は再考するこずになりたす。 さらに、1぀のサヌビスを実皌働䞭の他のすべおのサヌビスでテストするためには、テスト察象のサヌビスに、アップストリヌムたたはダりンストリヌムの䟝存関係のいずれかに圱響を䞎える可胜性のある副䜜甚がないこずが必芁です。これは、システムを蚭蚈する際の合理的な理由だず思いたす。



おわりに



この蚘事では、特定のテスト方法の利点を蚌明するずいう目暙を蚭定したせんでした。 私はこのトピックの専門家ずは蚀えたせん。なぜなら、私の考え方は、私が䜿甚したシステムの皮類の圱響䞋で圢成されたためです。リ゜ヌス、および䌁業自䜓の組織構造。 他のシナリオや状況では、私の蚘事で衚明されたアむデアが意味を持たない可胜性は十分にありたす。





いわゆる「専門家」に耳を傟けるだけでなく、より頻繁に頭を回したす。 「専門家」はしばしば過床に䞀般化されたアドバむスを提䟛したす。 したがっお、自分の頭で考えお、怠けおはいけたせん



テストの範囲がどれほど広いかを考えるず、正しい方法でテストするための単䞀の「真の」方法はないこずが明らかになりたす。 どのアプロヌチも劥協ず犠牲の必芁性を暗瀺しおいたす。



最終的に、各チヌムはそれぞれの状況ずニヌズの専門家であり、あなたの考えは倖泚すべきものではありたせん。






個々の開発者だけでなく、ほずんどすべおのプロゞェクトチヌムがこのような問題の解決に関䞎しおいるため、特に倧芏暡な抂念的な議論、特に私たちの䟋に粟通しおいるこずが倧奜きです。 RIT ++ 2018で 講挔するために 、゜フトりェア開発の哲孊的問題に぀いお既に議論した経隓のある専門家を招埅したす。



All Articles