Rumah  >  Artikel  >  Java  >  Tingkatkan Ujian Karate anda dengan Spring Boot DI

Tingkatkan Ujian Karate anda dengan Spring Boot DI

WBOY
WBOYasal
2024-07-22 16:44:47560semak imbas

Level up your Karate Testing with Spring Boot DI

Selama beberapa tahun saya telah menggunakan Timun untuk ujian peringkat lebih tinggi, dan baru-baru ini mula menggunakan Karate. Walaupun Timun adalah alat yang hebat, saya rasa Karate benar-benar bersinar dalam mengurangkan boilerplate yang disertakan bersama definisi langkah dan memudahkan untuk menulis ujian yang bermakna dengan cepat, terutamanya apabila ia berkaitan dengan ujian API.

Untuk aplikasi mudah, menulis fail ciri anda dalam JavaScript biasa sudah memadai. Apabila aplikasi dan ujian anda berkembang, menggunakan semula beberapa kod Java boleh menjadi berharga. Spring Boot API boleh mendapat banyak manfaat daripada ujian Karate, tetapi bagaimana pula dengan memanfaatkan kuasa Spring Boot secara langsung dalam ujian Karate anda?

Sesetengah contoh kes penggunaan

  • Walaupun Karate menyokong konfigurasi melalui fail karate-config.js, sesetengah pihak mungkin suka mengkonfigurasi melalui Spring YAML/properties sebaliknya. Ini boleh membantu untuk mengkonfigurasi semula perkara di luar membina semula kod juga.
  • Untuk menyegerakkan sifat konfigurasi But Spring tertentu antara aplikasi dan ujian.
  • Untuk mengesahkan keadaan pangkalan data antara panggilan API. Kacang repositori/entiti JPA boleh digunakan dalam ujian Karate.
  • Sesetengah kacang Spring mungkin berguna untuk digunakan dalam ujian.

Cara mengintegrasikan Spring ke dalam Karate

Projek sampel penuh: https://github.com/trey-pero/karate-spring

Karate boleh dilaksanakan melalui ujian JUnit yang mudah. Untuk memulakan pendawaian Spring in, sediakan ujian JUnit sebagai @SpringBootTest.

@RequiredArgsConstructor
@SpringBootTest(classes = Main.class)
public class KarateTest {
    private final ApplicationContext applicationContext;

    @Test
    void test() {
        ApplicationContextHolder.setApplicationContext(this.applicationContext);

        // Since this one JUnit test runs all Karate tests,
        // fail the test if any underlying Karate tests fail
        assertEquals(0, Runner.path("classpath:org/tpero")
                .parallel(Optional.ofNullable(System.getProperty("karate.threads"))
                        .map(Integer::parseInt)
                        .orElse(5)
                ).getFailCount());
    }
}

Untuk mengakses konteks Spring (yang menyediakan akses kepada semua kacang dan konfigurasi), ia perlu disimpan di tempat yang Karate boleh mengaksesnya secara statik.

/**
 * Provides Karate static access to the Spring application context.
 */
@UtilityClass
public class ApplicationContextHolder {
    @Setter
    @Getter
    private ApplicationContext applicationContext;
}

Daripada konfigurasi Karate, pemegang statik boleh diakses untuk menyambung konteks aplikasi ke dalam peta konfigurasi global Karate menggunakan sampel berikut:

/**
 * Define common feature file configuration here.
 * @returns Common configuration as a JSON object.
 */
function getConfig() {
    // Global values
    const appContext = Java.type("org.tpero.ApplicationContextHolder")
        .getApplicationContext()
    const environment = appContext.getEnvironment()

    return {
        appContext: appContext,
        environment: environment,

        baseUrl: `http://localhost:${environment.getProperty('app.server.port', '8080')}`
    }
}

Dengan kod persediaan di atas, kacang dan konfigurasi boleh diakses daripada fail ciri Karate, ditunjukkan oleh sampel ini yang menguji API log masuk mudah yang mengembalikan token JWT.

Feature: Login
  Background:
    * url baseUrl
    * path '/login'
    # Load the JWT service bean from Spring DI
    * def jwtService = appContext.getBean('jwtService')

  Scenario: Login with valid credentials
    Given request { username: 'user', password: 'password' }
    When method post
    Then status 200
    * print response

    # Use the JWT service bean to decode the JWT from the response
    * def decodedJwt = jwtService.decode(response)
    * print decodedJwt
    * def decodedBody = decodedJwt.getBody()
    * print decodedBody

    And match decodedBody['sub'] == 'user'
    * def issuedAt = Number(decodedBody['iat'])
    # Ensure the issuedAt is in the past
    And assert issuedAt < Java.type('java.lang.System').currentTimeMillis()
    * def configuredExpirationInMinutes = Number(environment.getProperty('jwt.expiration.ms')) / 1000
    # Ensure the expiration is the configurable amount of minutes beyond the issuedAt
    And match Number(decodedBody['exp']) == issuedAt + configuredExpirationInMinutes

Sampel ini menunjukkan betapa mudahnya untuk menyepadukan kuasa Spring Boot ke dalam Karate untuk membina suite ujian yang lebih berkebolehan.

Atas ialah kandungan terperinci Tingkatkan Ujian Karate anda dengan Spring Boot DI. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn