アプリケーションを実稼働モードで実行する前に、Dev Services for PostgreSQL を使用して JVM およびネイティブモードでアプリケーションの統合テストを完了します。
まず、テストプロジェクトに次の依存関係を追加します。
Maven を使用:
<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>rest-assured</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>rest-assured</artifactId>
<scope>test</scope>
</dependency>
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
Gradle を使用:
testImplementation("io.rest-assured:rest-assured")
testImplementation("io.rest-assured:rest-assured")
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
アプリケーションを dev モードで実行するには、以下を実行します。
Quarkus CLI を使用:
quarkus dev
quarkus dev
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
Maven を使用:
./mvnw quarkus:dev
./mvnw quarkus:dev
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
Gradle を使用:
./gradlew --console=plain quarkusDev
./gradlew --console=plain quarkusDev
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
次のプロパティー設定は、PostgreSQL テストを本番 (prod) モードでのみ実行できるようにする方法を示しています。このシナリオでは、Dev Services for PostgreSQL が PostgreSQL テストコンテナーを起動して設定します。
%prod.quarkus.datasource.db-kind=postgresql
%prod.quarkus.datasource.username=quarkus
%prod.quarkus.datasource.password=quarkus
%prod.quarkus.datasource.jdbc.url=jdbc:postgresql://localhost/quarkus
quarkus.hibernate-orm.database.generation=drop-and-create
%prod.quarkus.datasource.db-kind=postgresql
%prod.quarkus.datasource.username=quarkus
%prod.quarkus.datasource.password=quarkus
%prod.quarkus.datasource.jdbc.url=jdbc:postgresql://localhost/quarkus
quarkus.hibernate-orm.database.generation=drop-and-create
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
%prod. プロファイル接頭辞を追加すると、データソースプロパティーは Dev Services for PostgreSQL には表示されず、運用モードで実行されているアプリケーション以外には監視されません。
統合テストを記述するには、次のコードサンプルを使用します。
package org.acme.security.jpa;
import static io.restassured.RestAssured.get;
import static io.restassured.RestAssured.given;
import static org.hamcrest.core.Is.is;
import org.apache.http.HttpStatus;
import org.junit.jupiter.api.Test;
import io.quarkus.test.junit.QuarkusTest;
@QuarkusTest
public class JpaSecurityRealmTest {
@Test
void shouldAccessPublicWhenAnonymous() {
get("/api/public")
.then()
.statusCode(HttpStatus.SC_OK);
}
@Test
void shouldNotAccessAdminWhenAnonymous() {
get("/api/admin")
.then()
.statusCode(HttpStatus.SC_UNAUTHORIZED);
}
@Test
void shouldAccessAdminWhenAdminAuthenticated() {
given()
.auth().preemptive().basic("admin", "admin")
.when()
.get("/api/admin")
.then()
.statusCode(HttpStatus.SC_OK);
}
@Test
void shouldNotAccessUserWhenAdminAuthenticated() {
given()
.auth().preemptive().basic("admin", "admin")
.when()
.get("/api/users/me")
.then()
.statusCode(HttpStatus.SC_FORBIDDEN);
}
@Test
void shouldAccessUserAndGetIdentityWhenUserAuthenticated() {
given()
.auth().preemptive().basic("user", "user")
.when()
.get("/api/users/me")
.then()
.statusCode(HttpStatus.SC_OK)
.body(is("user"));
}
}
package org.acme.security.jpa;
import static io.restassured.RestAssured.get;
import static io.restassured.RestAssured.given;
import static org.hamcrest.core.Is.is;
import org.apache.http.HttpStatus;
import org.junit.jupiter.api.Test;
import io.quarkus.test.junit.QuarkusTest;
@QuarkusTest
public class JpaSecurityRealmTest {
@Test
void shouldAccessPublicWhenAnonymous() {
get("/api/public")
.then()
.statusCode(HttpStatus.SC_OK);
}
@Test
void shouldNotAccessAdminWhenAnonymous() {
get("/api/admin")
.then()
.statusCode(HttpStatus.SC_UNAUTHORIZED);
}
@Test
void shouldAccessAdminWhenAdminAuthenticated() {
given()
.auth().preemptive().basic("admin", "admin")
.when()
.get("/api/admin")
.then()
.statusCode(HttpStatus.SC_OK);
}
@Test
void shouldNotAccessUserWhenAdminAuthenticated() {
given()
.auth().preemptive().basic("admin", "admin")
.when()
.get("/api/users/me")
.then()
.statusCode(HttpStatus.SC_FORBIDDEN);
}
@Test
void shouldAccessUserAndGetIdentityWhenUserAuthenticated() {
given()
.auth().preemptive().basic("user", "user")
.when()
.get("/api/users/me")
.then()
.statusCode(HttpStatus.SC_OK)
.body(is("user"));
}
}
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
このコードサンプルからわかるように、テストコードからテストコンテナーを起動する必要はありません。
開発モードでアプリケーションを起動すると、Dev Services for PostgreSQL は PostgreSQL 開発モードコンテナーを起動して、アプリケーションの開発を開始できるようにします。アプリケーションの開発中に、継続テスト 機能を使用してテストを個別に追加および実行できます。Dev Services for PostgreSQL は、開発モードコンテナーと競合しない別の PostgreSQL テストコンテナーを提供することで、開発中のテストをサポートします。