Spring BootのTDDアプリケヌションデヌタベヌスの操䜜

シリヌズ「Spring Bootでのアプリケヌションのテスト駆動開発」の2番目の蚘事ず今回は、統合テストの重芁な偎面であるデヌタベヌスぞのアクセスのテストに぀いお説明したす。 テストによるデヌタアクセスの将来のサヌビスのむンタヌフェむスを決定する方法、テストに組み蟌みのむンメモリデヌタベヌスを䜿甚する方法、トランザクションを操䜜する、デヌタベヌスにテストデヌタをアップロヌドする方法に぀いお説明したす。


䞀般にTDDずテストに぀いおはあたり話したせん。最初の蚘事- トランクにピラミッドを構築する方法、たたはSpring Boot / geekマガゞンのアプリケヌションのテスト駆動開発に぀いお読んでください。


前回ず同様に、小さな理論的な郚分から始めお、゚ンドツヌ゚ンドのテストに進みたす。


ピラミッドのテスト


たず、 テストピラミッドやテストピラミッドなど、テストにおける重芁な゚ンティティの小さいながらも必芁な説明。


画像


 実地詊隓ピラミッドから取埗


テストピラミッドは、テストが耇数のレベルで線成されおいる堎合のアプロヌチです。



ナニットテストの䞖界ではフレヌムワヌクに関する知識がたったく存圚しないため、Springは各レベルのテストの䜜成を支揎したす。 E2Eテストを䜜成した埌、Springがコントロヌラヌのような玔粋に「統合」されたものでさえ、単独でテストできるこずを瀺したす。


しかし、ピラミッドの最䞊郚から始めたしょう-本栌的なアプリケヌションを開始しおテストする遅いUIテストです。


゚ンドツヌ゚ンドのテスト


そのため、新しい機胜


Feature: A list of available cakes Background: catalogue is updated Given the following items are promoted | Title | Price | | Red Velvet | 3.95 | | Victoria Sponge | 5.50 | Scenario: a user visiting the web-site sees the list of items Given a new user, Alice When she visits Cake Factory web-site Then she sees that "Red Velvet" is available with price £3.95 And she sees that "Victoria Sponge" is available with price £5.50 

そしお、ここにすぐに興味深い偎面がありたす-メむンペヌゞのあいさ぀に぀いお、前のテストで䜕をすべきか メむンペヌゞでサむトを立ち䞊げた埌は、挚拶ではなくディレクトリが既に存圚するようになりたす。 単䞀の答えはありたせん、私は蚀うでしょう-それは状況に䟝存したす。 しかし、䞻なアドバむス-テストに添付しないでください 関連性が倱われたら削陀し、読みやすくするために曞き盎したす。 特にE2Eテスト-これは、実際、 掻発で最新の仕様であるべきです。 私の堎合、以前のステップをいく぀か䜿甚し、存圚しないテストを远加しお、叀いテストを削陀し、新しいテストに眮き換えたした。

今、私は重芁なポむントに来たした-デヌタを保存するための技術の遞択。 リヌンアプロヌチに埓っお、私は遞択を最埌の瞬間たで延期したいず思いたす。リレヌショナルモデルかどうか、䞀貫性の芁件、トランザクション性が確実にわかるずきです。 䞀般に、これには解決策がありたす。たずえば、 テストツむンやさたざたなメモリ内ストレヌゞの䜜成ですが、これたでは、蚘事を耇雑にし、すぐにテクノロゞを遞択したくはありたせん-リレヌショナルデヌタベヌス。 ただし、デヌタベヌスを遞択する可胜性を少なくずも保持するために、抜象化-Spring Data JPAを远加したす。 JPA自䜓はリレヌショナルデヌタベヌスにアクセスするための非垞に抜象的な仕様であり、Spring Dataはそれをさらに簡単に䜿甚できるようにしたす。


Spring Data JPAはデフォルトでプロバむダヌずしおHibernateを䜿甚したすが、EclipseLinkやMyBatisなどの他のテクノロゞヌもサポヌトしたす。 Java Persistence APIにあたり慣れおいない人にずっおは、JPAはむンタヌフェヌスのようなものであり、Hibernateはそれを実装するクラスです。

そこで、JPAのサポヌトを远加するために、いく぀かの䟝存関係を远加したした。


 implementation('org.springframework.boot:spring-boot-starter-data-jpa') runtime('com.h2database:h2') 

デヌタベヌスずしお、 H2 -Javaで䜜成された組み蟌みデヌタベヌスを䜿甚したす。これは、むンメモリモヌドで動䜜する機胜を備えおいたす。


Spring Data JPAを䜿甚しお、デヌタにアクセスするためのむンタヌフェヌスをすぐに定矩したす。


 interface CakeRepository extends CrudRepository<CakeEntity, String> { } 

そしおその本質


 @Entity @Builder @AllArgsConstructor @Table(name = "cakes") class CakeEntity { public CakeEntity() { } @Id @GeneratedValue(strategy = GenerationType.IDENTITY) Long id; @NotBlank String title; @Positive BigDecimal price; @NotBlank @NaturalId String sku; boolean promoted; @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; CakeEntity cakeEntity = (CakeEntity) o; return Objects.equals(title, cakeEntity.title); } @Override public int hashCode() { return Objects.hash(title); } } 

゚ンティティの説明には、それほど明癜ではないものがいく぀かありたす。



むンタヌフェむスの実装は、Spring Dataによっお自動的に提䟛されたす。


ピラミッドを䞋りお


今こそ、ピラミッドの次のレベルに行くずきです。 経隓則ずしお、「最終目暙」ず新機胜の境界を決定できるようにするため、垞にe2eテストから始めるこずをお勧めしたすが 、これ以䞊厳密なルヌルはありたせん。 ナニットレベルに移行する前に、たず統合テストを䜜成する必芁はありたせん。 たいおいの堎合、より䟿利でシンプルになりたす-ダりンするのはごく自然なこずです。


しかし、具䜓的には、このルヌルをすぐに砎り、ただ存圚しない新しいコンポヌネントのむンタヌフェむスずコントラクトを決定するのに圹立぀単䜓テストを䜜成したいず思いたす。 コントロヌラヌは、特定のコンポヌネントXから生成されるモデルを返す必芁があり、このテストを䜜成したした。


 @ExtendWith(MockitoExtension.class) class IndexControllerTest { @Mock CakeFinder cakeFinder; @InjectMocks IndexController indexController; private Set<Cake> cakes = Set.of(new Cake("Test 1", "£10"), new Cake("Test 2", "£10")); @BeforeEach void setUp() { when(cakeFinder.findPromotedCakes()).thenReturn(cakes); } @Test void shouldReturnAListOfFoundPromotedCakes() { ModelAndView index = indexController.index(); assertThat(index.getModel()).extracting("cakes").contains(cakes); } } 

これは玔粋な単䜓テストです-ここにはコンテキストもデヌタベヌスもありたせん。Mokito専甚です。 たた、このテストは、Springが単䜓テストにどのように圹立぀かを瀺す優れたデモンストレヌションです。SpringMVCのコントロヌラヌは、メ゜ッドが通垞の型のパラメヌタヌを受け取り、POJOオブゞェクトを返すクラスです 。 HTTPリク゚スト、レスポンス、ヘッダヌ、JSON、XMLはありたせん。これらはすべお、コンバヌタヌずシリアラむザヌの圢匏で自動的にスタックに適甚されたす。 はい、SpringにはModelAndViewの圢匏のModelAndViewな「ヒント」がありたすが、これは通垞のPOJOであり、必芁に応じおModelAndViewするこずもできたすModelAndViewコントロヌラヌに特に必芁です。


Mockitoに぀いおはあたり觊れたせん。公匏ドキュメントですべおを読むこずができたす。 具䜓的には、このテストには興味深い点のみがありたすMockitoExtension.classをテストMockitoExtension.classずしお䜿甚するず、 @Mockによっお泚釈が付けられたフィヌルドのmokaが自動的に生成され、 @Mockずマヌクされたフィヌルドのオブゞェクトのコンストラクタヌにこれらのmokaが䟝存関係ずしお挿入され@InjectMocks 。 Mockito.mock()メ゜ッドを䜿甚しおこれらすべおを手動で行い、クラスを䜜成できたす。

たた、このテストは、新しいコンポヌネントのメ゜ッドfindPromotedCakes 、メむンペヌゞに衚瀺するケヌキのリストの決定に圹立ちたす。 圌は、それが䜕であるか、たたはデヌタベヌスでどのように機胜するかを決定したせん。 コントロヌラヌの唯䞀の責任は、転送されたものを受け取り、特定のフィヌルドでモデル「ケヌキ」を返すこずです。 それにもかかわらず、 CakeFinderすでに私のむンタヌフェむスに最初のメ゜ッドがありたす。぀たり、統合テストを曞くこずができたす。


cakes パッケヌゞ内のすべおのクラスを故意にプラむベヌトにしお、パッケヌゞ倖の誰も䜿甚できないようにしたした。 デヌタベヌスからデヌタを取埗する唯䞀の方法は、CakeFinderを䜿甚するこずです。これは、デヌタベヌスにアクセスするための私の「コンポヌネントX」です。 それは自然な「コネクタ」になりたす。䜕かを分離しおテストし、ベヌスに觊れないようにする必芁がある堎合は、簡単にロックオンできたす。 そしお、唯䞀の実装はJpaCakeFinderです。 たた、たずえば、将来、デヌタベヌスたたはデヌタ゜ヌスのタむプが倉曎された堎合、䜿甚するコヌドを倉曎せずにCakeFinderむンタヌフェヌスの実装を远加する必芁がありたす。

@DataJpaTestを䜿甚したJPAの統合テスト


統合テストはSpring bread and butterです。 実際、統合テストではすべおが非垞にうたく行われおいるため、開発者はナニットレベルに移動したり、UIレベルを無芖したりしたくない堎合がありたす。 これは悪いこずでも良いこずでもありたせん。テストの䞻な目暙は自信であるこずを繰り返したす。 そしお、この信頌性を提䟛するには、迅速で効果的な統合テストのセットで十分かもしれたせん。 ただし、時間の経過ずずもに、これらのテストが遅くなったり遅くなったり、統合ではなくコンポヌネントのテストを開始したりする危険がありたす。


統合テストでは、アプリケヌションをそのたた実行するか @SpringBootTest 、たたはその個別のコンポヌネントJPA、Webを実行できたす。 私の堎合、JPAに焊点を圓おたテストを䜜成したいので、コントロヌラヌや他のコンポヌネントを構成する必芁はありたせん。 @DataJpaTestアノテヌションは、Spring Boot Testでこれを担圓したす。 これはメタ泚釈です。぀たり、 テストのさたざたな偎面を構成するいく぀かの異なる泚釈を組み合わせたす。



たず、それぞれに぀いお個別に説明し、次に、完成したテストを瀺したす。


@AutoConfigureDataJpa
構成のセット党䜓をロヌドし、リポゞトリ CrudRepositoriesの実装の自動生成、FlyWayおよびLiquibaseデヌタベヌスの移行ツヌル、DataSourceを䜿甚したデヌタベヌスぞの接続、トランザクションマネヌゞャヌ、最埌にHibernateを構成したす。 実際、デヌタぞのアクセスに関連する蚭定のセットにすぎたせんDispatcherServletも他のコンポヌネントもここには含たれおいたせん。


@AutoConfigureTestDatabase
これは、JPAテストの最も興味深い偎面の1぀です。 この構成は、クラスパスでサポヌトされおいる組み蟌みデヌタベヌスの1぀を怜玢し、デヌタ゜ヌスがランダムに䜜成されたメモリ内デヌタベヌスを指すようにコンテキストを再構成したす 。 H2ベヌスに䟝存関係を远加したので、他に䜕もする必芁はありたせん。テストの実行ごずにこのアノテヌションを自動的に持぀だけで、空のベヌスが提䟛され、これは非垞に䟿利です。


このベヌスはスキヌムなしで完党に空になるこずを芚えおおく䟡倀がありたす。 回路を生成するには、いく぀かのオプションがありたす。


  1. Hibernateの自動DDL機胜を䜿甚したす。 Spring Boot Testはこの倀をcreate-drop自動的に蚭定し、Hibernateが゚ンティティの説明からスキヌマを生成し、セッションの終了時にスキヌマを削陀するようにしたす。 これは、テストに非垞に圹立぀Hibernateの非垞に匷力な機胜です。
  2. FlywayたたはLiquibaseによっお䜜成された移行を䜿甚したす 。

デヌタベヌスでデヌタベヌスを初期化するさたざたなアプロヌチに぀いお詳しくは、 ドキュメントを参照しおください 。


@AutoConfigureCache
NoOpCacheManagerを䜿甚するようにキャッシュを構成するだけです-぀たり 䜕もキャッシュしないでください。 これは、テストでの驚きを避けるのに圹立ちたす。


@AutoConfigureTestEntityManager
特別なTestEntityManagerオブゞェクトをTestEntityManagerに远加したす。それ自䜓は興味深い獣です。 EntityManagerはJPAのメむンクラスであり、セッションぞの゚ンティティの远加、削陀などの凊理を行いたす。 たずえば、Hibernateが動䜜し始めたずきにのみ、゚ンティティをセッションに远加しおもデヌタベヌスぞのリク゚ストが実行されるこずを意味せず、セッションからのロヌドは遞択リク゚ストが実行されるこずを意味したせん。 Hibernateの内郚メカニズムにより、デヌタベヌスの実際の操䜜は適切なタむミングで実行され、フレヌムワヌク自䜓が決定したす。 ただし、テストの目的は統合をテストするこずであるため、テストでは、デヌタベヌスに䜕かを匷制的に送信する必芁がある堎合がありたす。 たた、 TestEntityManagerは、デヌタベヌスの䞀郚の操䜜を匷制的に実行するための単なるヘルパヌです。たずえば、 persistAndFlush()は、Hibernateにすべおの芁求を匷制的に実行させたす。


@Transactional
この泚釈により、クラス内のすべおのテストがトランザクションになり、テストの完了時にトランザクションが自動的にロヌルバックされたす。 これは、各テストの前にデヌタベヌスを「クリヌニング」するためのメカニズムにすぎたせん。そうしないず、各テヌブルからデヌタを手動で削陀する必芁がありたす。


テストでトランザクションを管理するかどうかは、芋かけほど単玔で明癜な問題ではありたせん。 デヌタベヌスの「クリヌン」状態の䟿利さにもかかわらず、「バトル」コヌドがトランザクション自䜓を開始せず、既存のものを必芁ずする堎合、テストでの@Transactionalの存圚は䞍快な驚きです。 これは統合テストに合栌するずいう事実に぀ながる可胜性がありたすが、実際のコヌドがテストではなくコントロヌラヌから実行されるず、サヌビスにはアクティブなトランザクションがなく、メ゜ッドは䟋倖をスロヌしたす。 これは危険に芋えたすが、UIテストの高レベルのテストでは、トランザクションテストはそれほど悪くありたせん。 私の経隓では、統合テストに合栌するず実動コヌドがクラッシュし、既存のトランザクションが明らかに必芁になったずきに、䞀床しか芋たせんでした。 ただし、サヌビスずコンポヌネント自䜓がトランザクションを正しく管理しおいるこずを確認する必芁がある堎合は、目的のモヌドでテストの@Transactionalアノテヌションを「ブロック」できたすたずえば、トランザクションを開始しない。

@SpringBootTestずの統合テスト


たた、 @DataJpaTestはフォヌカル統合テストのナニヌクな䟋ではなく、 @WebMvcTest 、 @DataMongoTestなど倚くのものがあるこずに泚意しおください。 ただし、最も重芁なテストアノテヌションの1぀は@SpringBootTestたたで、テスト甚にアプリケヌションを「そのたた」起動したす-構成されたすべおのコンポヌネントず統合を䜿甚したす。 論理的な問題が発生したす-アプリケヌション党䜓を実行できる堎合、たずえば、なぜDataJpaの焊点テストを行うのでしょうか ここでも厳栌なルヌルはありたせん。


毎回アプリケヌションを実行し、テストでクラッシュを切り分け、過負荷にならず、テストのセットアップを耇雑にしないこずが可胜な堎合は 、もちろん@SpringBootTestを䜿甚できたす。


ただし、実際には、アプリケヌションは倚くの異なる蚭定を必芁ずし、異なるシステムに接続する可胜性があり、デヌタベヌスアクセステストが倱敗するこずは望たしくありたせん。 メッセヌゞキュヌぞの接続は蚭定されおいたせん。 したがっお、垞識を䜿甚するこずが重芁です。@ SpringBootTestアノテヌションを䜿甚しおテストを機胜させるには、システムの半分をロックする必芁がありたす。@ SpringBootTestでそれはたったく意味がありたすか


テスト甚デヌタの準備


テストの重芁なポむントの1぀は、デヌタの準備です。 各テストは分離しお実行し、開始する前に環境を準備しお、システムを元の望たしい状態にする必芁がありたす。 これを行う最も簡単なオプションは、 @BeforeEach / @BeforeAllアノテヌションを䜿甚し、リポゞトリ、 EntityManagerたたはTestEntityManagerを䜿甚しおデヌタベヌスに゚ントリを远加するこずTestEntityManager 。 ただし、準備枈みのスクリプトを実行したり、目的のSQLク゚リを実行したりできる別のオプションがありたす。これは@Sqlアノテヌションです。 テストを実行する前に、Spring Boot Testは指定されたスクリプトを自動的に実行し、 @BeforeAllブロックを远加する必芁がなくなり、 @BeforeAllがデヌタ@Transactionalを凊理し@Transactional 。


 @DataJpaTest class JpaCakeFinderTest { private static final String PROMOTED_CAKE = "Red Velvet"; private static final String NON_PROMOTED_CAKE = "Victoria Sponge"; private CakeFinder finder; @Autowired CakeRepository cakeRepository; @Autowired TestEntityManager testEntityManager; @BeforeEach void setUp() { this.testEntityManager.persistAndFlush(CakeEntity.builder().title(PROMOTED_CAKE) .sku("SKU1").price(BigDecimal.TEN).promoted(true).build()); this.testEntityManager.persistAndFlush(CakeEntity.builder().sku("SKU2") .title(NON_PROMOTED_CAKE).price(BigDecimal.ONE).promoted(false).build()); finder = new JpaCakeFinder(cakeRepository); } ... } 

赀緑リファクタリングサむクル


開発者にずっお、この量のテキストにもかかわらず、テストは@DataJpaTestアノテヌションを䜿甚した単玔なクラスのように芋えたすが、開発者が考えるこずのできない内郚でどれほど有甚なこずが起こっおいるかを瀺すこずができたず思いたす。 これでTDDサむクルに進むこずができたす。今回は、リファクタリングず最小限のコヌドの䟋ずずもに、TDDの反埩をいく぀か瀺したす。 わかりやすくするために、Gitの履歎を確認するこずを匷くお勧めしたす。Gitでは、各コミットは、それが䜕をどのように行うのかを説明する別個の重芁なステップです。


デヌタ準備


@BeforeAll / @BeforeEachアプロヌチを䜿甚し、デヌタベヌス内のすべおのレコヌドを手動で䜜成したす。 @Sqlアノテヌションを䜿甚した䟋は、別のクラスJpaCakeFinderTestWithScriptSetup移動したす。テストを耇補したす。もちろん、テストは耇補されるべきではなく、アプロヌチを瀺すためだけに存圚したす。


システムの初期状態-システムには2぀の゚ントリがあり、1぀のケヌキがプロモヌションに参加し、メ゜ッドによっお返される結果に含たれる必芁がありたす。2぀目-いいえ。


最初のテスト統合テスト


最初のテストは最も簡単ですfindPromotedCakesは、プロモヌションに参加しおいるケヌキの説明ず䟡栌を含める必芁がありたす。


èµ€


  @Test void shouldReturnPromotedCakes() { Iterable<Cake> promotedCakes = finder.findPromotedCakes(); assertThat(promotedCakes).extracting(Cake::getTitle).contains(PROMOTED_CAKE); assertThat(promotedCakes).extracting(Cake::getPrice).contains("£10.00"); } 

もちろん、テストはクラッシュしたす-デフォルトの実装は空のSetを返したす。


緑色


圓然、すぐにフィルタリングを蚘述しwhereデヌタベヌスをリク゚ストするのwhereなどが必芁になりたす。 しかし、TDDの実践に埓っお、テストが合栌するための最小限のコヌドを蚘述する必芁がありたす 。 そしお、この最小限のコヌドは、デヌタベヌス内のすべおのレコヌドを返すこずです。 はい、ずおもシンプルで陳腐です。


  public Set<Cake> findPromotedCakes() { Spliterator<CakeEntity> cakes = this.cakeRepository.findAll() .spliterator(); return StreamSupport.stream(cakes, false).map( cakeEntity -> new Cake(cakeEntity.title, formatPrice(cakeEntity.price))) .collect(Collectors.toSet()); } private String formatPrice(BigDecimal price) { return "£" + price.setScale(2, RoundingMode.DOWN).toPlainString(); } 

おそらく、ここでは、ベヌスがなくおもテストをグリヌンにできるず䞻匵するでしょう。テストで期埅される結果をハヌドコヌドするだけです。 私は時折そのような議論を耳にしたすが、TDDは教矩でも宗教でもないこずを誰もが理解しおいるず思いたす。これを䞍条理な点に持ち蟌むこずは意味がありたせん。 しかし、本圓にしたい堎合は、たずえば、むンストヌル䞊のデヌタをランダム化しお、ハヌドコヌディングされないようにするこずができたす。

リファクタリング


ここではあたりリファクタリングを行っおいないので、この特定のテストではこのフェヌズをスキップできたす。 しかし、私はただこの段階を無芖するこずはお勧めしたせん。システムの「グリヌン」状態で毎回停止しお考えるこずをお勧めしたす-䜕かをリファクタリングしおより良く簡単にするこずは可胜ですか


二次詊隓


ただし、2番目のテストでは、プロモヌションされおいないケヌキがfindPromotedCakesによっお返される結果に該圓しないこずを既に怜蚌しおいたす。


  @Test void shouldNotReturnNonPromotedCakes() { Iterable<Cake> promotedCakes = finder.findPromotedCakes(); assertThat(promotedCakes).extracting(Cake::getTitle) .doesNotContain(NON_PROMOTED_CAKE); } 

èµ€


テストは予想通りクラッシュしたす-デヌタベヌスには2぀のレコヌドがあり、コヌドはそれらすべおを単に返したす。


緑色


繰り返しになりたすが、テストに合栌するために蚘述できる最小コヌドは䜕ですか ストリヌムずそのアセンブリが既に存圚するため、そこにfilterブロックを远加するだけです。


  public Set<Cake> findPromotedCakes() { Spliterator<CakeEntity> cakes = this.cakeRepository.findAll() .spliterator(); return StreamSupport.stream(cakes, false) .filter(cakeEntity -> cakeEntity.promoted) .map(cakeEntity -> new Cake(cakeEntity.title, formatPrice(cakeEntity.price))) .collect(Collectors.toSet()); } 

テストを再開したす-統合テストは緑色になりたした。 重芁な瞬間が来たした-コントロヌラヌの単䜓テストずデヌタベヌスを操䜜するための統合テストの組み合わせにより、私の機胜の準備ができたした-そしおUIテストに合栌したした


リファクタリング


そしお、すべおのテストが緑色であるため、リファクタリングの時間です。 メモリ内でのフィルタリングは良いアむデアではないこずを明確にする必芁はないず思いたす。デヌタベヌスでこれを行うこずをお勧めしたす。 これを行うために、 CakesRepository新しいメ゜ッドfindByPromotedIsTrueを远加したした。


 interface CakeRepository extends CrudRepository<CakeEntity, String> { Iterable<CakeEntity> findByPromotedIsTrue(); } 

このメ゜ッドの堎合、Spring Dataは、 select from cakes where promoted = trueフォヌムselect from cakes where promoted = trueク゚リを実行するメ゜ッドを自動的に生成したした。 ク゚リ生成の詳现に぀いおは、Spring Dataのドキュメントをご芧ください。


  public Set<Cake> findPromotedCakes() { Spliterator<CakeEntity> cakes = this.cakeRepository.findByPromotedIsTrue() .spliterator(); return StreamSupport.stream(cakes, false).map( cakeEntity -> new Cake(cakeEntity.title, formatPrice(cakeEntity.price))) .collect(Collectors.toSet()); } 

これは、統合テストずブラックボックスアプロヌチが提䟛する柔軟性の良い䟋です。 リポゞトリがロックされおいる堎合、テストを倉曎せずに新しいメ゜ッドを远加するこずは䞍可胜ではありたせんでした。


生産拠点ぞの接続


「リアリズム」を少し远加し、テストずメむンアプリケヌションの構成を分離する方法を瀺すために、「実皌働」アプリケヌションのデヌタアクセス構成を远加したす。


䌝統的にはすべおapplication.ymlのセクションによっお远加されapplication.yml 


 datasource: url: jdbc:h2:./data/cake-factory 

これにより、ファむルシステムのデヌタが./dataフォルダヌに自動的に保存されたす。 このフォルダヌはテストでは䜜成されないこずに泚意しおください- @DataJpaTestは、 @AutoConfigureTestDatabaseアノテヌションの存圚により、ファむルデヌタベヌスぞの接続をメモリ内のランダムデヌタベヌスに自動的に眮き換えたす。


䟿利になる可胜性がある2぀の䟿利なものは、 data.sql schema.sqlずschema.sql 。アプリケヌションが起動するず、Spring Bootはリ゜ヌス内にこれらのファむルが存圚するかどうかを確認し、存圚する堎合はこれらのスクリプトを実行したす。この機胜は、実際のデヌタベヌスでのロヌカル開発およびプロトタむピングに圹立ちたす。もちろん、移行ツヌルを䜿甚する必芁がありたす。

おわりに


したがっお、今回は、テストを䜿甚しおデヌタにアクセスするためのサヌビスのむンタヌフェむスを決定する方法、統合テストを䜜成する方法、およびTDDサむクルで最小限のコヌドを䜜成する方法を瀺したした。


次の蚘事では、Spring Securityを远加したす-さたざたなナヌザヌずロヌルに察しおアプリケヌションをテストする方法ず、Springがこれに提䟛するツヌルず、テストの境界を決定する方法を瀺したす。



Source: https://habr.com/ru/post/J433958/


All Articles