コンテンツにスキップ

Java Playwright E2E テスト

E2E テストでは、ブラウザーから実際の HTTP サーバーにアクセスします。@ShadowPg が pgmem のフォークへ接続するアプリを起動し、各ブラウザーテストの前に準備済みデータを復元します。HTTP サーバーと接続プールはテストクラスの間維持されます。

Playwright Java と Spring Boot/Micronaut

Section titled “Playwright Java と Spring Boot/Micronaut”

両方の例で Playwright の JUnit 連携を使います。@ShadowPg がアプリの通常の接続設定を pgmem に切り替え、各テスト前にデータを復元します。

OrdersE2ETest.java
@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();
}
}

Spring Boot は pgmem-spring、Micronaut は pgmem-micronaut をテスト依存に追加してください。db/schema.sql は src/test/resources に置きます。アプリが起動時にマイグレーションするなら schema を省略できます。起動後の状態が復元基準になります。追加の初期データは seed = "db/seed.sql" で指定できます。テストクラスごとに独立したサーバーとフォークを作り、終了時に両方を閉じます。

PostgreSQL JDBC ドライバーとプラットフォーム用の pgmem-native も、Java の基本設定に従って追加します。

同じクラスの JUnit メソッドはアプリとフォークを共有するため、逐次実行してください。クラス間の並列実行では、それぞれにアプリのコンテキスト、pgmem フォーク、HTTP ポート、ブラウザーの fixture を持たせます。アプリが別 JVM で動く場合も、プールの作成前に起動設定へフォークの JDBC URL を渡し、同じ reset() を使います。

ブラウザーを使わない HTTP テストは API テスト を参照してください。

1 つの @ShadowPg HTTP アプリを共有する E2E メソッドは逐次実行します。独立したクラスを並列化する場合は、クラスごとに pgmem フォーク、アプリコンテキスト、ランダムな HTTP ポート、ブラウザーコンテキストを用意します。JUnit Jupiter の設定例です。

junit.jupiter.execution.parallel.enabled = true
junit.jupiter.execution.parallel.mode.default = same_thread
junit.jupiter.execution.parallel.mode.classes.default = concurrent

次のメソッドがフォークを reset する前に、ブラウザーから始まったリクエストと DB のバックグラウンド処理を完了させてください。ブラウザーコンテキストを分けるだけでは共有 DB の reset 競合は防げません。並列クラス数はメモリとブラウザーの容量に合わせて制限します。