API GraphQL dengan Spring Boot · Pelajaran

Pengujian Penyepaduan API GraphQL

Laksanakan ujian penyepaduan untuk keseluruhan API GraphQL anda dengan mengesahkan pertanyaan, mutasi dan langganan secara hujung ke hujung.

Pelajaran 2 daripada 411 langkah

Pengujian Penyepaduan API GraphQL ialah pelajaran API GraphQL dengan Spring Boot percuma di CoddyKit. Ini ialah pelajaran 2 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran API GraphQL dengan Spring Boot, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus API GraphQL dengan Spring Boot merangkumi sejumlah 4 pelajaran.

Mengapakah Menguji Integrasi GraphQL?

Selamat datang ke pengujian integrasi untuk API GraphQL! Walaupun pengujian unit menyemak bahagian kecil kod anda, pengujian integrasi mengesahkan bahawa komponen yang berbeza berfungsi bersama dengan betul.

  • Aliran Hujung ke Hujung: Pengujian ini mensimulasikan permintaan klien sebenar.
  • Interaksi Komponen: Pastikan skema GraphQL, resolver dan sumber data anda semuanya bersambung dengan betul.
  • Keyakinan: Memberikan jaminan bahawa API anda berfungsi seperti yang dijangka sebelum penerapan.

Pelajaran ini memfokuskan penggunaan utiliti pengujian Spring Boot.

Alat Pengujian Spring Boot yang Penting

Spring Boot menyediakan alat berkuasa untuk memudahkan pengujian integrasi:

  • @SpringBootTest: Anotasi ini memuatkan konteks aplikasi penuh anda, lalu menjadikan semua bean anda tersedia untuk pengujian.
  • WebTestClient: Klien tanpa sekatan untuk menguji titik akhir web. Klien ini mensimulasikan permintaan HTTP kepada API GraphQL anda.

Secara bersama, alat ini membolehkan anda menghantar pertanyaan/mutasi GraphQL sebenar dan memeriksa responsnya.

Menyediakan Kelas Pengujian

Untuk bermula, anda akan mencipta kelas pengujian. Anotasikannya dengan @SpringBootTest untuk memuatkan konteks aplikasi anda. Kemudian, suntik WebTestClient untuk berinteraksi dengan titik akhir GraphQL anda.

Kita biasanya menggunakan @AutoConfigureWebTestClient untuk mengkonfigurasi WebTestClient bagi pengujian, lazimnya dengan port atau laluan konteks tertentu.

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.reactive.AutoConfigureWebTestClient;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.web.reactive.server.WebTestClient;

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@AutoConfigureWebTestClient
class GraphQLIntegrationTest {

  @Autowired
  private WebTestClient webTestClient;

  // Your test methods will go here
}

Membina Pengujian Pertanyaan Mudah

Mari tulis pengujian untuk pertanyaan GraphQL asas. Kita akan mentakrifkan rentetan pertanyaan dan kemudian menggunakan WebTestClient untuk menghantarnya ke titik akhir /graphql.

Pertanyaan akan dihantar sebagai muatan JSON dalam isi permintaan, yang biasanya mengandungi medan query dan secara pilihan variables.

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.reactive.AutoConfigureWebTestClient;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.web.reactive.server.WebTestClient;
import java.util.Map;

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@AutoConfigureWebTestClient
class SampleQueryTest {

  @Autowired
  private WebTestClient webTestClient;

  @Test
  void testHelloQuery() {
    String graphQlQuery = "{ hello }";

    webTestClient.post().uri("/graphql")
        .bodyValue(Map.of("query", graphQlQuery))
        .exchange()
        .expectStatus().isOk()
        .expectBody()
        .jsonPath("$.data.hello").isEqualTo("Hello, GraphQL!");
  }
}

Boleh Dijalankan: Pertanyaan dan Tegaskan Keputusan

Berikut ialah contoh penuh yang boleh dijalankan. Kita mempunyai aplikasi Spring Boot mudah dengan pertanyaan GraphQL hello dan pengujian integrasi yang mengesahkan outputnya.

Perhatikan bahawa jsonPath digunakan untuk menavigasi struktur respons GraphQL (data.hello) dan menegaskan nilainya.

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.graphql.data.method.annotation.QueryMapping;
import org.springframework.stereotype.Controller;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.reactive.AutoConfigureWebTestClient;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.web.reactive.server.WebTestClient;
import java.util.Map;

// --- Application Code ---
@SpringBootApplication
public class GraphQLApp {
  public static void main(String[] args) {
    SpringApplication.run(GraphQLApp.class, args);
  }
}

@Controller
class HelloResolver {
  @QueryMapping
  public String hello() {
    return "Hello, GraphQL!";
  }
}

// --- Test Code ---
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@AutoConfigureWebTestClient
class HelloQueryIntegrationTest {
  @Autowired
  private WebTestClient webTestClient;

  @Test
  void testHelloQuery() {
    String graphQlQuery = "{ hello }";

    webTestClient.post().uri("/graphql")
        .bodyValue(Map.of("query", graphQlQuery))
        .exchange()
        .expectStatus().isOk()
        .expectBody()
        .jsonPath("$.data.hello").isEqualTo("Hello, GraphQL!");
  }
}

Menguji Pertanyaan dengan Pemboleh Ubah

Banyak pertanyaan GraphQL menerima argumen. Anda boleh menghantarnya sebagai variables dalam muatan permintaan. Medan variables dalam isi permintaan JSON hendaklah berupa peta nama pemboleh ubah kepada nilainya.

Ingat untuk mentakrifkan pemboleh ubah dalam rentetan pertanyaan GraphQL anda (contohnya, query MyQuery($name: String!)).

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.reactive.AutoConfigureWebTestClient;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.web.reactive.server.WebTestClient;
import java.util.Map;

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@AutoConfigureWebTestClient
class QueryWithVarsTest {

  @Autowired
  private WebTestClient webTestClient;

  @Test
  void testGreetQueryWithName() {
    String graphQlQuery = "query Greet($name: String!) { greet(name: $name) }";
    Map<String, Object> variables = Map.of("name", "Coddy");

    webTestClient.post().uri("/graphql")
        .bodyValue(Map.of("query", graphQlQuery, "variables", variables))
        .exchange()
        .expectStatus().isOk()
        .expectBody()
        .jsonPath("$.data.greet").isEqualTo("Hello, Coddy!");
  }
}

Menguji Integrasi Mutasi

Mutasi digunakan untuk mencipta, mengemas kini atau memadam data. Pengujiannya mengikut corak yang serupa dengan pertanyaan, tetapi anda akan menggunakan kata kunci mutation dalam rentetan GraphQL anda.

Amalan yang baik ialah menegaskan nilai pulangan mutasi dan, jika berkenaan, mengesahkan perubahan keadaan (contohnya, dengan melaksanakan pertanyaan susulan).

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.reactive.AutoConfigureWebTestClient;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.web.reactive.server.WebTestClient;
import java.util.Map;

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@AutoConfigureWebTestClient
class MutationIntegrationTest {

  @Autowired
  private WebTestClient webTestClient;

  @Test
  void testCreateItemMutation() {
    String graphQlMutation = "mutation CreateItem($name: String!) { createItem(name: $name) { id name } }";
    Map<String, Object> variables = Map.of("name", "New Widget");

    webTestClient.post().uri("/graphql")
        .bodyValue(Map.of("query", graphQlMutation, "variables", variables))
        .exchange()
        .expectStatus().isOk()
        .expectBody()
        .jsonPath("$.data.createItem.name").isEqualTo("New Widget");
  }
}

Mengendalikan Ralat GraphQL dalam Pengujian

Apabila API GraphQL anda menemui ralat (contohnya, kegagalan pengesahan atau akses tanpa kebenaran), API biasanya mengembalikan tatasusunan errors dalam isi respons, bersama-sama medan data yang mungkin wujud (jika sesetengah bahagian berjaya).

Anda boleh menggunakan jsonPath untuk menyemak kewujudan dan kandungan mesej ralat ini dalam pengujian anda.

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.reactive.AutoConfigureWebTestClient;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.web.reactive.server.WebTestClient;
import java.util.Map;

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@AutoConfigureWebTestClient
class ErrorHandlingTest {

  @Autowired
  private WebTestClient webTestClient;

  @Test
  void testInvalidInputError() {
    String graphQlMutation = "mutation CreateItem($name: String!) { createItem(name: $name) { id } }";
    Map<String, Object> variables = Map.of("name", ""); // Assume empty name is invalid

    webTestClient.post().uri("/graphql")
        .bodyValue(Map.of("query", graphQlMutation, "variables", variables))
        .exchange()
        .expectStatus().isOk() // GraphQL errors usually return 200 OK
        .expectBody()
        .jsonPath("$.errors").isArray()
        .jsonPath("$.errors[0].message").isNotEmpty()
        .jsonPath("$.errors[0].message").isEqualTo("Item name cannot be empty.");
  }
}

Menguji Titik Akhir yang Dilindungi

Jika API GraphQL anda menggunakan Spring Security, anda perlu menguji cara API tersebut memberikan respons kepada permintaan yang disahkan dan tidak disahkan. WebTestClient membolehkan anda menambah pengepala dengan mudah, termasuk token kebenaran.

Hal ini memastikan konfigurasi keselamatan anda melindungi medan dan operasi GraphQL dengan betul.

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.reactive.AutoConfigureWebTestClient;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.web.reactive.server.WebTestClient;
import java.util.Map;

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@AutoConfigureWebTestClient
class ProtectedEndpointTest {

  @Autowired
  private WebTestClient webTestClient;

  @Test
  void testProtectedQuery_unauthorized() {
    String graphQlQuery = "{ protectedData }";

    webTestClient.post().uri("/graphql")
        .bodyValue(Map.of("query", graphQlQuery))
        .exchange()
        .expectStatus().isOk() // GraphQL often returns 200 with errors for auth issues
        .expectBody()
        .jsonPath("$.errors").isArray()
        .jsonPath("$.errors[0].message").isEqualTo("Unauthorized access");
  }

  @Test
  void testProtectedQuery_authorized() {
    String graphQlQuery = "{ protectedData }";
    String validToken = "mock-jwt-token"; // In a real app, generate a valid test token

    webTestClient.post().uri("/graphql")
        .header("Authorization", "Bearer " + validToken)
        .bodyValue(Map.of("query", graphQlQuery))
        .exchange()
        .expectStatus().isOk()
        .expectBody()
        .jsonPath("$.data.protectedData").isEqualTo("Secret Info");
  }
}

Semakan Pantas: Pengujian Integrasi

Pertimbangkan pertanyaan GraphQL berikut dan aplikasi Spring Boot yang mendedahkan pertanyaan product(id: ID!). Pernyataan WebTestClient manakah yang mengesahkan dengan betul bahawa produk dengan ID '123' dan nama 'Laptop' dikembalikan?

Imbas Kembali: Pengujian Integrasi GraphQL

Dalam pelajaran ini, anda telah mempelajari cara menjalankan pengujian integrasi untuk API GraphQL anda menggunakan Spring Boot.

  • Anda telah mempelajari cara menyediakan persekitaran pengujian dengan @SpringBootTest dan WebTestClient.
  • Anda telah melihat cara membina dan melaksanakan pertanyaan serta mutasi GraphQL, termasuk menghantar pemboleh ubah.
  • Anda telah meneroka cara mengesahkan data yang dijangka dalam respons menggunakan jsonPath.
  • Akhir sekali, anda telah mempelajari cara mengendalikan respons ralat dan menguji titik akhir yang dilindungi.

Pengujian integrasi amat penting untuk memastikan keteguhan dan ketepatan API GraphQL anda!

Percuma untuk bermula

Pelajari API GraphQL dengan Spring Boot dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
12
Pelajaran
48

Soalan Lazim

Adakah pelajaran “Pengujian Penyepaduan API GraphQL” percuma?

Ya — teks penuh “Pengujian Penyepaduan API GraphQL” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus API GraphQL dengan Spring Boot, tingkat taraf kepada CoddyKit PRO. Kursus API GraphQL dengan Spring Boot merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Pengujian Penyepaduan API GraphQL”?

Laksanakan ujian penyepaduan untuk keseluruhan API GraphQL anda dengan mengesahkan pertanyaan, mutasi dan langganan secara hujung ke hujung. Anda berlatih API GraphQL dengan Spring Boot menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan API GraphQL dengan Spring Boot?

Tiada pengalaman terdahulu diperlukan. Pembelajaran API GraphQL dengan Spring Boot di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 2 daripada 4.

Berapa lamakah pelajaran “Pengujian Penyepaduan API GraphQL” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran API GraphQL dengan Spring Boot ini?

Ya. Setiap pelajaran API GraphQL dengan Spring Boot menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Pengujian Unit Penyelesai GraphQL
  2. Pengujian Penyepaduan API GraphQL
  3. Melancarkan Spring Boot GraphQL
  4. Integrasi Berterusan untuk API GraphQL
← Kembali ke API GraphQL dengan Spring Boot