ふくしま

ソフトウェアエンジニア

SpringGraphQL のテストで Tesetcontainers を使った話

モチベーション

Sprig GraphQL はサーバに対して、ドキュメントを実行するテストを書ける。

公式ドキュメントのコード例。

WebTestClient client =
        WebTestClient.bindToServer()
                .baseUrl("http://localhost:8080/graphql")
                .build();

HttpGraphQlTester tester = HttpGraphQlTester.create(client);

しかし、テストのためにサーバを立てるのめんどくさい。 例えば、CI 内でテストをするために、PR ごとにサーバを立てるというのはやりたくない。 できれば、簡単にライフサイクルを管理できるコンテナでやってほしい。

それをやってくれる OSS として Testcontaines というのがある。

実装

以下のように実装したらできた。

@SpringBootTest()
@AutoConfigureGraphQlTester
@Testcontainers
public class GraphqlNativeHintsTest {

    private HttpGraphQlTester graphQlTester;

    @Container
    private final GenericContainer<?> container =
            new GenericContainer<>(
                            DockerImageName.parse(
                                    "sample-image-name:latest"))
                    .withExposedPorts(8080);

    @BeforeEach
    void setup() { // endpoint などは各自の設定による
        String address = container.getHost() + ":" + container.getMappedPort(8080);
        String endpoint = "/graphql";
        WebTestClient client = WebTestClient.bindToServer().baseUrl(address + endpoint).build();

        this.graphQlTester = HttpGraphQlTester.create(client);
    }

    @Test // テストの中身は適当
    void introspectionQueryTest() {
        this.graphQlTester.documentName("sampleQuery").executeAndVerify();
    }
}

参考文献