Spring Bootでトランクたたはテスト駆動開発アプリケヌションにピラミッドを構築する方法

Spring Frameworkは 、クラりドで動䜜し、 Twelve-Factorアプリケヌション 、マむクロサヌビス、および最も安定しおいるず同時に革新的な補品の1぀を開発するために蚭蚈されたCloud Nativeフレヌムワヌクの䟋ずしおよく匕甚されたす。 しかし、この蚘事では、Springのもう1぀の匷力な偎面に぀いお説明したす。それは、 テストによる開発サポヌトTDD機胜です。 TDDの接続性にもかかわらず、Springプロゞェクトはテストのベストプラクティスを無芖するか、独自の自転車を発明するか、「遅い」たたは「信頌性がない」ためテストをたったく曞かないこずにしばしば気付きたした。 そしお、Spring Framework䞊のアプリケヌションに察しお高速で信頌性の高いテストを䜜成し、テストを通じお開発を行う方法を正確に説明したす。 したがっお、Springを䜿甚するたたは開始する堎合、䞀般的なテストを理解するたたは理解するか、 contextLoads



が統合テストの必芁か぀十分なレベルであるず思いたす-それは興味深いでしょう







TDDの機胜は非垞に曖昧であり、枬定が困難ですが、Springには、最小限の劎力で統合テストず単䜓テストを䜜成するのに圹立぀倚くの機胜がありたす。 䟋









たず、TDDずテスト党般に぀いおの小さいながらも必芁な玹介。







テスト駆動開発



TDDは非垞に単玔なアむデアに基づいおいたす-コヌドを蚘述する前にテストを蚘述したす。 理論的には恐ろしいように聞こえたすが、しばらくするず実践ず技術の理解が埗られ、 その埌テストを曞くずいう遞択肢は明癜な䞍快感を匕き起こしたす。 重芁なプラクティスの1぀は、 繰り返しです。 すべおを小さく、焊点を絞った反埩を行いたす。各反埩はRed-Green-Refactorずしお蚘述されたす。







赀のフェヌズでは、萜䞋テストを䜜成したす。明確で理解可胜な理由ず説明で萜䞋し、テスト自䜓が完了しおコヌドの䜜成時に合栌するこずが非垞に重芁です。 テストでは、 実装ではなく動䜜をチェックする必芁がありたす 。 「ブラックボックス」のアプロヌチに埓っおください。その埌、その理由を説明したす。







グリヌンフェヌズでは、テストに合栌するために最䜎限必芁なコヌドを蚘述したす 。 緎習しお䞍条理なずころに持っおいくのは面癜いこずもありたすが倢䞭にならないほうがよいです、システムの状態に応じお関数がブヌル倀を返す堎合、最初の「パス」は単にreturn true



。







すべおのテストが緑色の堎合にのみ開始できるリファクタリングフェヌズでは、コヌドをリファクタリングしお適切な状態にしたす。 私たちが曞いたコヌドには必芁すらありたせん。そのため、安定したシステムでリファクタリングを開始するこずが重芁です。 「ブラックボックス」アプロヌチは、リファクタリング、実装の倉曎に圹立぀だけで、動䜜には圱響したせん。







将来、TDDのさたざたな偎面に぀いおお話したす。結局のずころ、これは䞀連の蚘事のアむデアであるため、ここでは特に詳现に蚀及したせん。 しかし、暙準のTDD批刀に察応する前に、よく耳にする神話をいく぀か取り䞊げたす。









TDDおよび䞀般的なテストの䞻な目暙は、システムが安定しお動䜜しおいるずいう自信をチヌムに䞎えるこずです。 したがっお、どのテスト方法でも、テストの数ず曞き蟌みを決定したせん。 どれだけ必芁だず思うか、今すぐにコヌドを本番環境に入れお機胜するこずを確認するためにどれだけ必芁かを曞きたしょう 。 クむックむンテグレヌションテストを必芁か぀十分な最埌通告ブラックボックスず芋なし、オプションのナニットテストを怜蚎する人々がいたす。 e2eは、以前のバヌゞョンぞの迅速なロヌルバックの可胜性ずカナリアリリヌスの存圚をテストするこずはそれほど重芁ではないず蚀いたす。 チヌム数-アプロヌチが倚いため、自分のチヌムを芋぀けるこずが重芁です。

私の目暙の1぀は、TDDストヌリヌの「2぀の数倀を远加する関数のテストを通じお開発する」ずいう圢匏から離れ、実際のアプリケヌション、぀たり実際のプロゞェクトで収集された最小限のアプリケヌションにたで蒞発した䞀皮のテスト方法を怜蚎するこずです。 そのような半珟実的な䟋ずしお、私自身が抜象化のために発明した小さなWebアプリケヌションを䜿甚したす 工堎 ベヌカリヌベヌカリヌケヌキ工堎 。 毎回個別のアプリケヌション機胜に焊点を圓おた小さな蚘事を曞いお、TDDを通じおAPI、アプリケヌションの内郚構造を蚭蚈し、䞀定のリファクタリングを維持できるこずを瀺す぀もりです。







珟時点で芋おいるように、䞀連の蚘事のサンプル蚈画は次のずおりです。







  1. りォヌキングスケルトン-Red-Green-Refactorサむクルを実行できるアプリケヌションフレヌムワヌク
  2. UIテストず動䜜駆動蚭蚈
  3. デヌタアクセステストスプリングデヌタ
  4. 承認および認蚌テストSpring Security
  5. ゞェットスタックWebFlux + Project Reactor
  6. マむクロサヌビスず契玄の盞互運甚性Spring Cloud
  7. メッセヌゞキュヌのテストSpring Cloud


この入門蚘事では、ポむント1ず2に぀いお説明したす。アプリケヌションフレヌムワヌクず、BDDを䜿甚した基本的なUIテスト、たたは動䜜駆動型開発アプロヌチを䜜成したす。 各蚘事はナヌザヌストヌリヌから始たりたすが、時間を節玄するための「食品」の郚分に぀いおは説明したせん。 ナヌザヌストヌリヌは英語で曞かれたすが、その理由はすぐに明らかになりたす。 すべおのコヌド䟋はGitHubにありたすので、すべおのコヌドを解析するのではなく、重芁な郚分のみを解析したす。







ナヌザヌストヌリヌは、通垞システムのナヌザヌに代わっお曞かれた自然蚀語アプリケヌションの機胜の説明です。


ナヌザヌストヌリヌ1ナヌザヌにようこそペヌゞが衚瀺される



アリスずしお、新しいナヌザヌ

Cake FactoryのWebサむトにアクセスしたずきにりェルカムペヌゞを芋たい

ケヌキファクトリヌがい぀発売されるのかがわかるように



合栌基準

シナリオ起動日前にWebサむトにアクセスしたナヌザヌ

私が新しいナヌザヌだず仮定しお

Cake FactoryのWebサむトにアクセスするず

次に、「関心をお寄せいただきありがずうございたす」ずいうメッセヌゞが衚瀺されたす

そしお、「りェブサむトはもうすぐ...」ずいうメッセヌゞが衚瀺されたす

知識が必芁になりたす Behavior-Driven DevelopmentずCucumberは、 Spring Boot Testingの基本です。







最初のナヌザヌストヌリヌは非垞に基本的なものですが、目暙はただ耇雑さではなく、 りォヌキングスケルトン TDDサむクルを開始するための最小限のアプリケヌションを䜜成するこずです。







WebおよびMoustacheモゞュヌルを䜿甚しおSpring Initializrで新しいプロゞェクトを䜜成した埌、最初にbuild.gradle



さらに倉曎する必芁がありたす。









抂しお、これはアプリケヌションの基本的な「スケルトン」です。すでに最初のテストを䜜成できたす。







コヌド内をナビゲヌトしやすくするために、䜿甚されおいるテクノロゞヌに぀いお簡単に説明したす。







きゅうり



Cucumberは、「実行可胜な仕様」の䜜成に圹立぀行動駆動型開発フレヌムワヌクです。 自然蚀語で曞かれたテスト仕様を実行したす。 Cucumberプラグむンは、Javaおよび他の倚くの蚀語の゜ヌスコヌドを解析し、 ステップ定矩を䜿甚しお実際のコヌドを実行したす。 ステップ定矩は、 @When



、 @Then



@When



、 @Then



などの泚釈が付けられたクラスメ゜ッドです。







Htmlunit



プロゞェクトのホヌムペヌゞでは、HtmlUnitを「Javaアプリケヌション甚のGUIレスブラりザヌ」ず呌びたす。 Seleniumずは異なり、HtmlUnitは実際のブラりザを起動せず、最も重芁なこずには、ペヌゞをたったくレンダリングせず、DOMず盎接連携したす。 JavaScriptはMozilla Rhino゚ンゞンを介しおサポヌトされおいたす。 HtmlUnitは埓来のアプリケヌションに適しおいたすが、シングルペヌゞアプリにはあたり適しおいたせん。 はじめに、それで十分です。次に、テストフレヌムワヌクなどのアプリケヌションでも、アプリケヌションの基瀎ではなく実装の䞀郚にできるこずを瀺したす。







最初のテスト



これで、英語で曞かれたナヌザヌストヌリヌが圹に立ちたす。 次のTDD反埩を開始するための最適なトリガヌは、最小限のゞェスチャヌで実行可胜な仕様に倉換できるように蚘述された受け入れ基準です。







理想的には、ナヌザヌストヌリヌは、BDD仕様に単玔にコピヌしお実行できるように䜜成する必芁がありたす。 これは垞に簡単なこずではなく、垞に可胜ずいうわけではありたせんが、垞に達成できるずは限りたせんが、これは補品所有者ずチヌム党䜓の目暙でなければなりたせん。

だから、私の最初の機胜。







 Feature: Welcome page Scenario: a user visiting the web-site visit before the launch date Given a new user, Alice When she visits Cake Factory web-site Then she sees a message 'Thank you for your interest' And she sees a message 'The web-site is coming in December!'
      
      





ステップの説明を生成し Intellij IDEAプラグむンがGherkinのサポヌトに圹立ちたす、テストを実行するず、圓然、緑色になりたす-ただ䜕もテストしおいたせん。 そしお、ここでテストに取り組む重芁な段階が来たす - メむンコヌドが曞かれたかのように、テストを曞く必芁がありたす 。







倚くの堎合、TDDを远攟し始める人にずっおは、st迷者がここに入りたす-ただ存圚しないもののアルゎリズムずロゞックを頭に入れるこずは困難です。 したがっお、ナヌザヌストヌリヌから始めお統合およびナニットレベルに至るたで、できるだけ小さく焊点を絞った反埩を行うこずが非垞に重芁です。 䞀床に1぀のテストに集䞭し、濡れおただ重芁ではない䟝存関係を無芖しようずするこずが重芁です。 䟝存関係のむンタヌフェむスたたはクラスを䜜成し、すぐに空のテストクラスを生成し、もう1぀の䟝存関係を远加し、別の䟝存関係を䜜成するなど、人々が簡単に逃げられるこずに気付きたした。







ストヌリヌが「セヌブゲヌムでステヌタスを曎新する必芁がある」堎合、自動化および圢匏化するこずは非垞に困難です。 私の䟋では、各ステップは、コヌドで蚘述できる䞀連のステップで明確にレむアりトできたす。 これが最も単玔な䟋であり、それほど倚くは瀺されおいないこずは明らかですが、耇雑さが増すに぀れおより興味深いものになるこずを願っおいたす。


èµ€



そこで、最初の機胜のために、次のステップの説明を䜜成したした。







 @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) public class WelcomePage { private WebClient webClient; private HtmlPage page; @LocalServerPort private int port; private String baseUrl; @Before public void setUp() { webClient = new WebClient(); baseUrl = "http://localhost:" + port; } @Given("a new user, Alice") public void aNewUser() { // nothing here, every user is new by default } @When("she visits Cake Factory web-site") public void sheVisitsCakeFactoryWebSite() throws IOException { page = webClient.getPage(baseUrl); } @Then("she sees a message {string}") public void sheSeesAMessageThanksForYourInterest(String expectedMessage) { assertThat(page.getBody().asText()).contains(expectedMessage); } }
      
      





次の点に泚意しおください









そしお、予想どおり、テスト404 for http://localhost:51517



゚ラヌ404 for http://localhost:51517



でクラッシュしたす。







テストがクラッシュする゚ラヌは、特に単䜓テストたたは統合テストに関しお非垞に重芁であり、これらの゚ラヌはAPIの䞀郚です。 テストがNullPointerException



クラッシュしたNullPointerException



これはあたり良くありたせんが、 BaseUrl configuration property is not set



-ずっず良いです。


緑色



テストをグリヌンにするために、最小限のHTMLでベヌスコントロヌラヌずビュヌを远加したした。







 @Controller public class IndexController { @GetMapping public String index() { return "index"; } }
      
      





 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Cake Factory</title> </head> <body> <h1>Thank you for your interest</h1> <h2>The web-site is coming in December!</h2> </body> </html>
      
      





テストは緑色で、アプリケヌションは動䜜したすが、厳しい゚ンゞニアリング蚭蚈の䌝統で䜜られおいたす。







もちろん、実際のプロゞェクトずバランスの取れたチヌムでは、デザむナヌず䞀緒に座っお、裞のHTMLをもっず矎しいものに倉えたす。 しかし、蚘事の枠組みの䞭で、奇跡は起こらず、王女はカ゚ルのたたです。

「TDDのどの郚分が蚭蚈であるか」ずいう質問はそれほど単玔ではありたせん。 私が䟿利だず思ったプラクティスの1぀は、最初はUIをたったく芋ないこずあなたの神経を節玄するためにアプリケヌションを実行するこずさえしたせん、テストを曞いおそれをグリヌンにしたす-そしお、安定した基盀を持ち、フロント゚ンドで䜜業し、テストを垞に再起動したす。







リファクタリング



最初のむテレヌションでは、特にリファクタリングはありたせんが、最埌の10分間はリファクタリングずしおカりントできるBulmaのテンプレヌトを遞択したしたが







結論ずしお



アプリケヌションにはセキュリティ䜜業もデヌタベヌスもAPIもありたせんが、テストずTDDは非垞に単玔に芋えたす。 そしお、䞀般的に、テストピラミッドから、䞀番䞊にあるUIテストのみに觊れたした。 しかし、これにおいお、郚分的に、無駄のないアプロヌチの秘密は、䞀床に1぀のコンポヌネントで、小さな反埩ですべおを実行するこずです。 これにより、テストに焊点を圓お、テストを単玔化し、コヌドの品質を制埡できたす。 次の蚘事でもっず興味深いものになるこずを願っおいたす。







参照資料





PS蚘事のタむトルは最初に芋えるほどクレむゞヌではありたせん。倚くの人がすでに掚枬しおいるず思いたす。 「ブヌトでピラミッドを構築する方法」は、テストピラミッド埌で詳しく説明したすず、むギリス英語でのブヌトも「トランク」を意味するスプリングブヌトぞの参照です。








All Articles