Java Playwright E2E テスト
E2E テストでは、ブラウザーから実際の HTTP サーバーにアクセスします。@ShadowPg が pgmem のフォークへ接続するアプリを起動し、各ブラウザーテストの前に準備済みデータを復元します。HTTP サーバーと接続プールはテストクラスの間維持されます。
Playwright Java と Spring Boot/Micronaut
Section titled “Playwright Java と Spring Boot/Micronaut”両方の例で Playwright の JUnit 連携を使います。@ShadowPg がアプリの通常の接続設定を pgmem に切り替え、各テスト前にデータを復元します。
@UsePlaywright@ShadowPg(schema = "db/schema.sql")class OrdersE2ETest { @LocalServerPort int port;
@Test void createsAnOrder(Page page) { page.navigate("http://127.0.0.1:" + port + "/orders"); page.getByText("New order").click(); assertThat(page.getByText("Order created")).isVisible(); }
@Test void startsFromPreparedDataAgain(Page page) { page.navigate("http://127.0.0.1:" + port + "/orders"); assertThat(page.getByText("No orders")).isVisible(); }}@UsePlaywright@ShadowPg(schema = "db/schema.sql")class OrdersE2ETest { @Inject EmbeddedServer app;
@Test void createsAnOrder(Page page) { page.navigate(app.getURI().resolve("/orders").toString()); page.getByText("New order").click(); assertThat(page.getByText("Order created")).isVisible(); }
@Test void startsFromPreparedDataAgain(Page page) { page.navigate(app.getURI().resolve("/orders").toString()); assertThat(page.getByText("No orders")).isVisible(); }}Spring Boot は pgmem-spring、Micronaut は pgmem-micronaut をテスト依存に追加してください。db/schema.sql は src/test/resources に置きます。アプリが起動時にマイグレーションするなら schema を省略できます。起動後の状態が復元基準になります。追加の初期データは seed = "db/seed.sql" で指定できます。テストクラスごとに独立したサーバーとフォークを作り、終了時に両方を閉じます。
PostgreSQL JDBC ドライバーとプラットフォーム用の pgmem-native も、Java の基本設定に従って追加します。
分離と並列実行
Section titled “分離と並列実行”同じクラスの JUnit メソッドはアプリとフォークを共有するため、逐次実行してください。クラス間の並列実行では、それぞれにアプリのコンテキスト、pgmem フォーク、HTTP ポート、ブラウザーの fixture を持たせます。アプリが別 JVM で動く場合も、プールの作成前に起動設定へフォークの JDBC URL を渡し、同じ reset() を使います。
ブラウザーを使わない HTTP テストは API テスト を参照してください。
安全な JUnit 設定
Section titled “安全な JUnit 設定”1 つの @ShadowPg HTTP アプリを共有する E2E メソッドは逐次実行します。独立したクラスを並列化する場合は、クラスごとに pgmem フォーク、アプリコンテキスト、ランダムな HTTP ポート、ブラウザーコンテキストを用意します。JUnit Jupiter の設定例です。
junit.jupiter.execution.parallel.enabled = truejunit.jupiter.execution.parallel.mode.default = same_threadjunit.jupiter.execution.parallel.mode.classes.default = concurrent次のメソッドがフォークを reset する前に、ブラウザーから始まったリクエストと DB のバックグラウンド処理を完了させてください。ブラウザーコンテキストを分けるだけでは共有 DB の reset 競合は防げません。並列クラス数はメモリとブラウザーの容量に合わせて制限します。