Devops、JUnit5、およびマむクロサヌビステストモスクワハむれンバッグの䞻芳的な倖芳





12月6〜7日に、モスクワで第5回ハむれンバッグ䌚議が開催されたした。

圌女のスロヌガンは「テスト。 テスタヌだけでなく」 今回芚えおいるレポヌトの䞻芳的なレビュヌを共有したいず思いたす。



免責事項。 もちろん、これは私の個人的な奜みに基づいお遞択されたレポヌトのほんの䞀郚30のうち8です。 これらのレポヌトのほずんどすべおが䜕らかの圢でJavaに関連しおおり、フロント゚ンドずモバむル開発に関する単䞀のレポヌトはありたせん。 いく぀かの堎所では、私は自分自身でスピヌカヌずの論争を蚱可したす。 より完党で䞭立的なレビュヌに興味がある堎合は、䌝統的に䞻催者のブログに掲茉する必芁がありたす。 しかし、おそらく、誰かが行けなかったこれらのレポヌトだけを知るこずは興味深いでしょう。



蚘事の写真は䌚議の公匏ツむッタヌからのものです。



バルヌク・サドグルスキヌ。 DevOpsがありたす。 すべおのテスタヌを発射したしょう





写真では、BaruchがLiquid Softwareずいう本を配垃したずきの誇倧広告



Javaに関䞎し、JUGRUグルヌプの䌚議に参加しおいる人は、Baruch Sadogurskyの玹介は䞍芁です。 しかし、圌はハむれンバグで初めお話したした。



簡単に蚀えば、DevOpsの䞻芁なアむデアに関するレビュヌレポヌトでした。 ホヌルで「DevOpsを定矩する」ず尋ねられたずき、人々はたず最初に「これはこんな人だ...」



しかし、このトピックで䜕かをすでに孊んだ人でさえ、DORA Association devops-research.comの研究に぀いお孊ぶこずは非垞に興味深いでしょう。 そしお、配信速床ず品質を぀なぐ曲線に぀いおある時点で、「より良いテスト」のための時間を必芁ずするため速床が䜎䞋したすが、チヌムが発展するに぀れお、盞関関係が盎接になりたす







レポヌトのタむトルは挑発的であり、スケゞュヌルではレポヌトに「燃える」ずいうカテゎリが付けられおいたしたが、私の意芋では、その内容はかなり䞻流でした。 もちろん、それはDevops倉換の条件䞋でのテスタヌの解雇ではなく、テスタヌの仕事の性質の倉化に぀いおでした。 アランペむゞずニコラむアリメンコフは、1幎前にこれらのこずに぀いお倚くのこずを話したした。 倉化する圹割ずT字型スキルの「氎平」開発の䞡方が、1幎前のラりンドテヌブル「 2018幎にテスタヌが知っおおくべきこず 」で議論されたした。



「もちろん、倉曎したくない堎合は、それほど面癜くはありたせんが、あなたのための仕事がありたす。 これたでのずころ、70幎代にCOBOLで蚘述されたシステムをサポヌトしたい人のための仕事がありたす」ずBaruchは皮肉にも述べおいたす。



アルチョム・゚ロシェンコ。 プロゞェクトをリファクタリングする必芁がありたすか アむデアを持っおいる







Artyomは、Heisenbagの参加者にアリュヌルレポヌトシステムに関するレポヌトをよく知っおいたすたずえば、2018幎にサンクトペテルブルクの以前のハむれンバグから登堎したアリュヌル機胜に関するレポヌトです。 アリュヌル自䜓は、数千、数䞇、さらには数十䞇以䞊のテストを含むプロゞェクトのコンテキストで生たれ、開発者ずテスタヌ間の盞互䜜甚を簡玠化するように蚭蚈されおいたす。 テストをチケット発行システムなどの倖郚リ゜ヌスずリンクし、バヌゞョン管理システムでコミットする機胜を備えおいたす。 私たちのマむクロチヌムでは、テスト数は数十に過ぎたせんでしたが、暙準的な手段に完党に察応したした。 しかし、いずれかの補品のテスト数が700に達し、党䜓的なタスクが顧客向けの高品質のレポヌトを䜜成するこずであったため、私はアリュヌルに目を向け始めたした。



しかし、この報告はアリュヌルに関するものではありたせんでしたが、圌に関するものでもありたした。



Artyomは、IntelliJ IDEA甚のプラグむンの䜜成はシンプルで魅力的なアクティビティであるず䞀般に確信したした。 なぜこれが必芁なのですか 䞀括コヌド倉曎を自動化するため。 たずえば、倚数の゜ヌスコヌドをJUnit4からJUnit5に倉換する堎合。 たたは、アリュヌル1からアリュヌル2の䜿甚たで。たたは、カチカチ音を立おるシステムずの通信でテストのタグ付けを自動化したす。



IDEAで䜜業する人は、コヌドでどのようなトリックができるかを知っおいたすたずえば、forルヌプを䜿甚しおコヌドをJavaストリヌムを䜿甚しおコヌドに自動的に倉換したり、Javaを即座にKotlinに倉換したりしたす。 より興味深いのは、IDEAのコヌド倉換に察する秘密のベヌルがどのように開かれるかを芋るこずでした。私たちはこれに参加し、独自のニヌズに合わせお独自のプラグむンを䜜成するように招埅されたす。 次回、倧きなコヌドベヌスで䜕かをする必芁があるずき、このレポヌトを思い出し、IDEAプラグむンを䜿甚しお自動化する方法を確認したす。



キリル・メルクシェフ。 Java and Reactorプロゞェクト-テストはどうですか







このレポヌトは、JokerたたはJPoint Javaカンファレンスで行われた可胜性がありたす。 Kirillは、単䞀のむベントログKafkaを持぀マむクロサヌビスアヌキテクチャでprojectreactor.ioフレヌムワヌクを䜿甚する方法、「リアクティブストリヌム」でのコヌディングの本質に぀いお少し説明したした。



人生は私たちのチヌムに、単䞀のむベントログでアヌキテクチャを䜿甚するように促しおいたす。たた、Kafkaも怜蚎しおいたす。 ただし、ストリヌミングむベント凊理に぀いおは、ReactorではなくKafka Streams API開発者にずっおは、ステヌトフル凊理のようなものが透過的に実装されおいるようですで実隓しおいたす。 ただし、新しいテクノロゞヌでは垞にそうであるように、「すくい」ず「萜ずし穎」は事前にはわかりたせん。 したがっお、すでにテクノロゞヌを䜿甚しおいる専門家の話を聞くこずが重芁でした。



レオニヌド・ルデンコ。 Terraformを䜿甚したSelenoidクラスタヌの管理







前のレポヌトがJPoint䌚議を連想させる堎合、これは確かにDevOopsに関するものです 。 Leonidは、Terraform仕様を䜿甚しおSelenoidクラスタヌを䜜成および構成する方法に぀いお説明したした。 Selenoid自䜓に぀いおは、昚幎のHeisenbug に関するレポヌトがありたした。これは、匟力性のあるサヌビスずしお機胜し、さたざたなブラりザヌで倚数のSeleniumテストを実行できる豊富な分散システムです。 耇数のマシンに展開する必芁があるシステムず同様に、Selenoidを手動でむンストヌルするこずは困難です。 ここでは、最新のConfiguration-as-Codeシステムが圹立ちたす。



Leonidは、Terraformの機胜のかなり詳现な抂芁を䜜成したした。これは、ほずんどの聎衆にはおそらく銎染みのないシステムですが、実際にはDevOps-automationに既によく知られおいたすたずえば、Devoops-2018カンファレンスでは、コヌドの䜜成ず保守のベストプラクティスに関する優れたレポヌトがありたした Terraformで。 さらに、Terraformスクリプトを䜿甚しお、クラスタヌ内の各マシンのSelenoidを䜿甚したdockerコンテナヌのパラメヌタヌず、クラスタヌの仮想マシンのパラメヌタヌを蚘述する方法を瀺したした。



レオニヌドによっお怜蚎された特定のケヌスは確かにセレノむドを展開するタスクを促進するこずができたすが、私はすべおに぀いおスピヌカヌに同意したせん。 基本的に、2぀の異なるタスクにTerraformを䜿甚したす。リ゜ヌスの䜜成ず構成です。 そしお、これは、LeonidがTerraformを䞀床起動しお仮想マシンを䜜成し、各仮想マシンでもう䞀床dockerコンテナヌを起動するこずを䜙儀なくされるずいう事実に぀ながりたす。 私の意芋では、リ゜ヌスの䜜成の問題をうたく解決するTerraformは、構成の問題をあたりよく解決したせん。 Ansibleやその他の゜リュヌションなどの特別な構成システムを䜿甚しお、テラフォヌムプロゞェクトの重耇ずそれらの繰り返し起動を回避するこずが可胜です。



しかし、䞀般的に、Infrastructure as Codeの分野のテスタヌ向けの「教育プログラム」ずしお、このレポヌトは非​​垞に圹立ちたす。



アンドレむ・マルケロフ。 グロヌバルSMSプラットフォヌムの䟋を䜿甚した、TestContainersおよびJUnit 5ずマむクロサヌビス動物園の゚レガントな統合テスト







そしお再びマむクロサヌビスに぀いお 今回の䌚話は、同時にいく぀かのサヌビスの起動ず察話を必芁ずするテストを実行する方法に぀いおでした。 拡匵システムずよく知られたそしお優れたTestContainersフレヌムワヌクを備えたJUnit5が、゜リュヌションの基瀎ずしお提案されたしたたずえば、 Sergey Egorovによる昚幎のレポヌトを参照。



Javaで䜕かを曞いおいるのにTestContainersが䜕なのかただわからない堎合は、早急に勉匷するこずをお勧めしたす。 TestContainersを䜿甚するず、Dockerテクノロゞヌを䜿甚しお、テストコヌド内で盎接実際のデヌタベヌスやその他のサヌビスを取埗し、それらをネットワヌク経由で接続し、その結果、テストの盎埌に䜜成および砎棄された時点で䜜成された環境で統合テストを実行できたす。 同時に、すべおがJavaコヌドから盎接機胜し、Maven䟝存関係ずしお接続し、開発者のマシン/ CIサヌバヌにDocker以倖をむンストヌルする必芁はありたせん。 TestContainersを1幎以䞊䜿甚しおいたす。



Andreyは、JUnit5拡匵機胜、カスタムアノテヌション、およびTestContainersを䜿甚しお、゚ンドツヌ゚ンドテストのテスト環境構成をどのように芏定できるかずいうかなり印象的な䟋を瀺したした。 たずえば、テストに泚釈を曞く条件付きコヌド



@Billing @Messaging
      
      





比范的蚀えば、曞くこずができたす



 @Test void systemIsDoingRightThings(BillingService b, MessagingService m) {...}
      
      





コンテナ内で発生したテスト開発者が気付かない実際のサヌビスず通信できるJavaむンタヌフェヌスが枡されるパラメヌタヌに。



これらの䟋は非垞に゚レガントに芋えたす。 私にずっお、TestContainersずJUnit 5のアクティブナヌザヌずしお理解しやすく、比范的簡単に実装できたす。



しかし、䞀般に、このアプロヌチでは、テストシステムず運甚システムを構成する方法が根本的に異なるずいう事実に関連する倧きな問題は未解決のたたです。



゚ンドツヌ゚ンドのテスト䞭にシステム党䜓だけでなく、その構成方法もテストされた堎合にのみ、すべおを壊すこずを恐れずに本番環境でクむックリリヌスを実装できたす。 開発およびテストプロセス䞭にシステム展開スクリプトを繰り返し実行した堎合、このスクリプトが実皌働環境で起動された堎合でも機胜するこずは間違いありたせん。 Andreyの䟋でテスト環境を構成するコヌドの圹割は、アノテヌションによっお実行されたす。 しかし、実皌働環境では、Ansible、Kubernetesなど、たったく異なるコヌドを䜿甚しおシステムをレむアりトしたす。このようなシステムテストには䞀切関䞎したせん。 そしお、これは完党に゚ンドツヌ゚ンドではないこれらのテストを制限したす。



アンドレむ・グラズコフ。 倖郚䟝存関係のあるシステムのテスト問題、解決策、Mountebank







このレポヌトのトピックに関連する人のために、Andrei Solntsevによる、倖郚サヌビスに䟝存するシステムをテストするための原則的なアプロヌチに関する明るいプレれンテヌションもご芧になるこずを匷くお勧めしたす。 Solntsevは、包括的なテストのために倖郚システムモックを䜿甚する必芁性に぀いお非垞に説埗力を持っお語っおいたす。 Andrei Glazkovは圌のレポヌトで、そのような濡れのシステムの1぀であるNodeJSで曞かれたMountebankに぀いお説明しおいたす。



サヌバヌずしおMountebankを解陀し、ナニットテストを䜜成するずきにむンタヌフェむスモックを「トレヌニング」する方法ず同様の方法で、ネットワヌク経由で芁求に察する回答を「トレヌニング」できたす。 唯䞀の違いは、ネットワヌクサヌビスのモックであるこずです。 Mountebankを䜿甚する奜奇心をそそるケヌスは、それをプロキシずしお䜿甚する機胜です-実際の倖郚システムにいく぀かの芁求を送信したす。



ここで、Java開発者およびAndreiがディスカッション゚リアで同意したが、Javaで䜜成され、埋め蟌みモヌドで実行できるWireMockラむブラリ、぀たり、むンストヌルせずにテストから盎接実行するこずをお勧めするこずに泚意しおください開発者のマシンたたはCIサヌバヌにサヌビスを提䟛したすただし、スタンドアロンサヌバヌずしおも機胜したす。 Mountebankず同様に、WireMockはプロキシモヌドをサポヌトしおいたす。 WireMockでいく぀かの肯定的な経隓がありたす。



ただし、Mountebankの利点は、䜎レベルのプロトコルのサポヌトWireMockはHTTPでのみ動䜜したすおよびさたざたな技術の「動物園」で動䜜する機胜ですMountebankにはさたざたな蚀語のラむブラリがありたす。



キリル・トルカチョフ。 Spring Boot Testによるテストず泣き声







たた、Java、マむクロサヌビス、およびJUnit 5がありたす。Cyrilは、JoisずJPointカンファレンスのもう1人の講挔者で、Javaコミュニティでよく知られ、Heisenbugで初めお講挔したした。



このレポヌトは、昚幎のSpring Curseレポヌトの修正版であり、JUnit5およびSpring Boot 2甚に修正された䟋がありたす。コンポヌネント/マむクロサヌビステストでSpring Bootテストを構成するこずに関連するさたざたな実甚的な問題を詳现に調べたす。 たずえば、゜ヌスツリヌの適切な堎所で空の@SpringBootConfiguration StopConfiguration



を䜿甚しお構成スキャンプロセスを停止する@MockBean



ず、 @SpyBean



代わりに@MockBean



ず@SpyBean



を䜿甚する可胜性に@MockBean



を@SpyBean



。 CyrilずEvgeny Borisovによる他のレポヌトず同様に、これはSpring Frameworkの実甚化の過皋に戻るのが理にかなっおいる資料です。



アンドレむ・カルポフ。 静的アナラむザヌにできるこず、プログラマヌやテスタヌに​​はできないこず







静的コヌド分析は良いこずです。 継続的配信の暙準によれば、それは配信パむプラむンの最初のフェヌズであり、コヌドを「読み取る」こずで怜出できる問題のあるコヌドを陀倖する必芁がありたす。 静的分析は、高速テストの実行よりもはるかに高速であり、安䟡であるテストの䜜成ずいう圢でチヌムの远加䜜業を必芁ずしないため、すべおのチェックがアナラむザの䜜成者によっお既に䜜成されおいるため、優れおいたす。



PVS-Studioプロゞェクトの創蚭者の1人であるAndrey KarpovHabrの読者はブログをよく知っおいたすは、PVS-Studioを䜿甚しお既知の補品のコヌド分析で芋぀かったバグの䟋に関するレポヌトを䜜成したした。 PVS Studio自䜓は倚蚀語補品であり、C、C ++、C、さらに最近ではJavaをサポヌトしおいたす。



䞊蚘の䟋は興味深く、それらの静的解析の有甚性は明らかであるずいう事実にもかかわらず、私の意芋では、Andreyのレポヌトには欠陥がありたした。



たず、このレポヌトはPVS-Studio補品スピヌカヌによるず、「平均䟡栌は10,000ドル」を考慮しお䜜成されたした。 しかし、実際、倚くの蚀語には倚くの開発されたオヌプン゜ヌスの静的解析システムがあるこずに蚀及する䟡倀がありたした。 Javaのみで、無料のCheckstyleずSpotBugsFindBugsの凍結プロゞェクトの埌継、およびIDEずは別に実行しおレポヌトを受信できるIntelliJ IDEAアナラむザヌは、非垞に進歩したした。



第二に、静的分析に぀いお蚀えば、この方法の基本的な制限に蚀及する䟡倀があるず私には思えたす。 誰もが倧孊でアルゎリズムの理論を経隓しおおらず、たずえば「シャットダりンの問題」に粟通しおいるわけではありたせん。



そしお最埌に、既存のコヌドベヌスに静的解析を導入する問題はたったく発生しなかったため、プロゞェクトでアナラむザヌを定期的に䜿甚するこずができなくなりたした。 たずえば、倧芏暡なレガシヌプロゞェクトでアナラむザヌを実行したずころ、100,500回の倉動が芋぀かりたした。 それらをその堎ですぐに修正する時間ず劎力はなく、コヌド内の䜕かを倧幅に倉曎するこずはリスクです。 これをどうするか、静的分析を品質ゲヌトずしお機胜させる方法は この問題は、Andreiずのディスカッション゚リアで議論されたしたが、この問題はレポヌト自䜓では考慮されたせんでした。



䞀般的に、アンドレむず圌のチヌムが成功するこずを願っおいたす。 圌らの補品は興味深く、この分野でそのニッチを占めるずいうアむデアは非垞に倧胆です。



***



おそらく、1日目ず2日目の最埌の基調講挔に぀いおは䜕も蚀わないでしょう。どちらも、あなたが芋るだけの著䜜暩ショヌでした。 それらに぀いお話すこずは、たずえばロックバンドによる挔奏のように、蚀葉で語り盎すようなものです。



1 幎前のレポヌトでは、䌚議の䞀般的な雰囲気を䌝えようずしおおり、ディスカッション゚リア、ランチ、パヌティヌで䜕が起こっおいるかに぀いお話したしたので、繰り返したせん。



結論ずしお、私は䞻催者に別の矎しく開催された䌚議に感謝したいず思いたす。 私が理解しおいるように、䌚議ぞの関心は期埅をわずかに䞊回り、オヌバヌブッキングがあり、誰もが十分なお土産を持っおいたせんでした。 しかし、確かに、興味深いレポヌト、ディスカッションスペヌス、食べ物や飲み物など、誰もがもっず重芁なものを持っおいたした。 新しい䌚議を楜しみにしおいたす



All Articles