Jika Anda ingin menjadi sangat nyaman untuk pengujian terhadap API dan mengintegrasikannya ke dalam CI untuk memverifikasi setiap komit, maka itu disertakan dengan Spring Boot jelas merupakan pilihan terbaik.
Tulis test case dengan cepat
@Runwith (springrunner.class) @springboottest (webenvironment = springboottest.webenvironment.random_port) @ActiveProfiles ({profiles.env_it}) DemointegrationTest {@Autowired pribadi fooservice fooservice; @Test public void test () {System.out.println ("Tested"); }}Di antara mereka, Springboottest mendefinisikan beberapa konfigurasi saat menjalankannya. Kode di atas menggunakan port acak, dan tentu saja itu juga bisa port yang telah ditentukan, seperti ini
@Springboottest (webeNvironment = springboottest.webenvironment.defined_port, properties = {"server.port = 9990"})ActiveProfiles memaksa penggunaan profil TI. Dari praktik terbaik, alamat basis data atau komponen sumber daya lainnya yang dikonfigurasi oleh profil TI harus diisolasi dari lingkungan pengembangan atau pementasan. Karena ketika itu berjalan melalui banyak situasi, kita perlu menghapus data uji.
Anda dapat menemukan bahwa kasus seperti itu dapat disuntikkan dengan otomatis ke layanan yang diinginkan. Ini karena pegas memuat seluruh konteks, yang sama dengan lingkungan berjalan yang sebenarnya, termasuk basis data, cache dan komponen lainnya. Jika Anda merasa tidak memerlukan semua sumber daya selama pengujian, maka Anda dapat menghapus konfigurasi yang sesuai di profil. Ini adalah lingkungan operasi yang lengkap, satu -satunya perbedaan adalah bahwa ia akan secara otomatis mematikan setelah kasus penggunaan selesai.
Uji API REST
Sangat merekomendasikan perpustakaan untuk ditambahkan ke lulusan
TestCompile 'io.rest-Icure: Istirahat-ISECURE: 3.0.3'
Dukung JsonPath, yang sangat berguna. Klik di sini untuk dokumen tertentu
@Sql (skrip = "/testdata/users.sql")@testpublic void test001login () {string username =" [email protected] "; String password = "demo"; JwtAuthenticationRequest request = jwtauthenticationRequest baru (nama pengguna, kata sandi); Respons respons = diberikan (). ContentType (contentType.json) .body (request) .when (). Post ("/auth/login"). Kemudian () .statusCode (httpstatus.ok.value ()) .extract () .response (); assertThat (response.path ("token"), is (isnull.notnullValue ()))); AssertThat (response.path ("Expiration"), is (isNull.notnullValue ()));} @SQL digunakan untuk melakukan data uji penyisipan SQL sebelum pengujian. Perhatikan bahwa given().body() dilewatkan dalam objek Java JWTAuthenticationRequest, karena REST-ISURECE akan secara otomatis membantu Anda menggunakan Jackson untuk membuat serial objek menjadi string JSON. Tentu saja, Anda juga dapat memasukkan JSON yang dikonversi ke dalam tubuh, efeknya sama.
Hasil pengembalian ditangkap oleh respons, dan kemudian data dapat diperoleh dengan menggunakan JSONPATH untuk verifikasi. Tentu saja ada cara lain yang lebih intuitif, yang dapat memperoleh respons lengkap melalui respons.asstring () dan kemudian deserialisasi menjadi objek Java untuk verifikasi.
Pada titik ini, yang paling mendasar selesai. Menambahkan tes Langkah Langkah ke Jenkins dapat mencapai pengujian setiap kali kode dikirimkan.
Beberapa situasi yang rumit
Data campuran
Ini adalah yang termudah terjadi. Sebuah proyek memiliki banyak devs, dan setiap dev akan menulis kasusnya sendiri, jadi bagaimana jika ada dampak antara data. Mudah dimengerti. Misalnya, dalam skenario di mana kumpulan uji ditulis, metode verifikasi akhir adalah untuk melihat apakah jumlah data yang ditulis adalah 10.000 baris. Kemudian Dev lain menulis kasus lain dan kebetulan menambahkan data baru ke tabel ini, yang berubah menjadi 10W+1 baris, sehingga kasus yang ditulis dalam batch tidak akan dapat melarikan diri.
Untuk mencegah situasi ini, kami menggunakan setiap kelas tes untuk menghapus data. Karena ini adalah operasi berbasis kelas, Anda dapat menulis kelas dasar untuk menyelesaikannya.
@Runwith (springrunner.class) @springboottest (WebEnvironment = springboottest.webenvironment.random_port) @ActiveProfiles ({profiles.env_it}) public abstrak baseintegrationTest {private static jdctemplate jdbctemplate; @Autowired public void setDataSource (DataSource DataSource) {jdbctemplate = new jdbctemplate (DataSource); } @Value ("$ {local.server.port}") port int yang dilindungi; @Before public void setupenv () {restersured.port = port; Restersured.basepath = "/API"; Restersured.baseuri = "http: // localhost"; Restersured.config = restersured.config (). HttpClient (httpclientConfig.httpClientConfig (). Httpmultipartmode (httpmultipartmode.browser_compatible))); } public void teardownenv () {diberikan (). ContentType (contentType.json) .when (). POST ("/auth/logout"); } @AfterClass public static void cleanDB () melempar sqlexception {resource resource = new classpathResource ("/testData/cleandb.sql"); Koneksi koneksi = jdbctemplate.getDataSource (). GetConnection (); Scriptutils.executesqlscript (koneksi, sumber daya); koneksi.close (); }}@AfterClass menggunakan jdbctemplate untuk menjalankan cleandb.sql, yang menghapus semua data uji dengan cara ini.
@ Value("${local.server.port}") juga perlu disebutkan, karena portnya acak, Istirahat-Diasur tidak tahu port mana permintaan dikirim. Di sini, gunakan @Value untuk mendapatkan nomor port saat ini dan atur ke restassured.port untuk menyelesaikan masalah ini.
Cara memproses data yang dibagikan
Menjalankan lengkapnya mungkin membutuhkan lusinan kelas dan ratusan metode. Jadi bagaimana jika beberapa data diperlukan untuk semua kasus dan perlu dihapus hanya setelah semua kasus dijalankan? Dengan kata lain, pembersihan data semacam ini tidak didasarkan pada kelas, tetapi saat dijalankan sekaligus. Misalnya, data pengguna awal, perpustakaan kota, dll.
Kami memainkan trik pintar dan menggunakan jalan terbang
@Configuration@conditionAnclass ({Datasource.class}) kelas publik upgradeAutoconfiguration {public static final string flyway = "flyway"; @Bean (name = flyway) @profile ({env_it}) upgradeService cleanAndupGradeservice (DataSource DataSource) {upgradeService upgradeService = FlywayUpgradeservice baru (DataSource); coba {upgradeService.cleanandupgrade (); } catch (Exception ex) {logger.error ("Flyway gagal!", Ex); } return upgradeService; }} Anda dapat melihat bahwa ketika profilnya, Flyway akan menjatuhkan semua tabel dan menjalankan skrip upgrade secara bergantian, sehingga membuat tabel data lengkap, yang tentu saja kosong. Di jalur uji proyek, tambahkan versi besar SQL, sehingga jalan terbang dapat memasukkan data uji umum di akhir, seperti src/test/resources/db/migration/V999.0.1__Insert_Users.sql , menyelesaikan berbagai masalah data dengan sempurna.
ringkasan
Menggunakan layanan uji bawaan di Spring Boot dapat dengan cepat memverifikasi API. Saya tidak perlu memulai layanan dan kemudian mengklik halaman manual untuk menguji API saya. Saya secara langsung berkomunikasi dengan rekan front-end saya format permintaan dan menulis kasus untuk memverifikasi.
Tentu saja, ada juga kerugian dari metode ini, yaitu tidak nyaman untuk menekankan uji sistem. Sebelumnya, kasus uji API perusahaan ditulis oleh JMeter, yang akan jauh lebih nyaman ketika melakukan tes kinerja.