Tingkatkan Ujian Karate anda dengan Spring Boot DI
Jul 22, 2024 pm 04:44 PMSelama 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!

Artikel Panas

Alat panas Tag

Artikel Panas

Tag artikel panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Rangka Kerja 4 JavaScript teratas pada tahun 2025: React, Angular, Vue, Svelte

Bagaimanakah mekanisme kelas muatan Java berfungsi, termasuk kelas yang berbeza dan model delegasi mereka?

Bagaimanakah saya menggunakan Maven atau Gradle untuk Pengurusan Projek Java Lanjutan, Membina Automasi, dan Resolusi Ketergantungan?

Node.js 20: Peningkatan Prestasi Utama dan Ciri -ciri Baru

Iceberg: Masa Depan Jadual Data Tasik

Bagaimanakah saya boleh menggunakan JPA (Java Constence API) untuk pemetaan objek-objek dengan ciri-ciri canggih seperti caching dan malas malas?

Bagaimanakah saya melaksanakan caching pelbagai peringkat dalam aplikasi java menggunakan perpustakaan seperti kafein atau cache jambu?

Spring Boot Snakeyaml 2.0 CVE-2022-1471 Isu Tetap
