Dalam karir saya di masa lalu, saya sering menemukan bahwa beberapa orang tidak menulis kode tes, dan alasan mereka mengklaim tidak menulis adalah bahwa mereka tidak dapat dengan mudah menulis kasus tes yang mencakup beberapa modul berbeda. Yah, saya percaya sebagian besar dari mereka tidak memiliki cara teknis yang lebih mudah-untuk-master atau tidak punya waktu untuk mengetahuinya. Lagi pula, akan selalu ada berbagai tekanan seperti kemajuan di tempat kerja. Karena saya tidak tahu cara menguji, saya sering mengabaikan pengujian integrasi, dan masalah yang terjadi adalah mendapatkan perangkat lunak yang lebih buruk, semakin banyak bug dan lebih banyak pelanggan yang kecewa. Jadi saya ingin berbagi beberapa pengalaman pribadi untuk mengungkap misteri pengujian integrasi.
Cara mengintegrasikan pengujian proyek berbasis musim semi dengan lebih baik menggunakan alat: musim semi, junit, mockito
Bayangkan ada proyek musim semi yang mengintegrasikan beberapa layanan eksternal, seperti beberapa layanan web perbankan. Kemudian, masalah yang dihadapi ketika menulis kasus tes untuk proyek ini dan menyelesaikan tes ini dalam sistem integrasi kontinu pada dasarnya sama:
1. Akan ada transaksi dalam setiap tes, dan setiap transaksi membutuhkan biaya moneter, yang pada akhirnya akan ditanggung oleh pelanggan;
2. Permintaan berlebihan yang dikeluarkan selama pengujian dapat dianggap sebagai permintaan jahat, yang dapat menyebabkan rekening di bank diblokir, dengan konsekuensi dari kegagalan tes;
3. Ketika pengujian dilakukan dengan menggunakan lingkungan non-produksi, hasil tes tidak terlalu dapat diandalkan. Demikian pula, konsekuensinya adalah bahwa tes gagal.
Biasanya, ketika Anda menguji satu kelas, masalahnya mudah dipecahkan karena Anda dapat virtualisasi beberapa layanan eksternal untuk panggilan. Tetapi ketika menguji seluruh proses bisnis yang sangat besar, itu berarti Anda perlu menguji banyak komponen, dan saat ini, Anda perlu memasukkan komponen -komponen ini ke dalam wadah musim semi untuk manajemen. Untungnya, Spring mencakup kerangka pengujian yang sangat baik yang memungkinkan Anda untuk menyuntikkan kacang dari file konfigurasi lingkungan produksi ke lingkungan pengujian, tetapi bagi mereka yang disebut layanan eksternal, kami perlu menulis implementasi tiruan sendiri. Reaksi pertama dari orang biasa mungkin adalah untuk meminta kembali (memodifikasi) kacang yang disuntikkan oleh pegas selama tahap pengaturan tes, tetapi metode ini perlu dipertimbangkan dengan cermat.
PERINGATAN: Dengan cara ini, kode pengujian Anda melanggar perilaku wadah sendiri, jadi tidak ada jaminan bahwa itu akan sama dengan hasil tes Anda di lingkungan nyata.
Bahkan, alih -alih menerapkan kelas tiruan terlebih dahulu dan kemudian memulihkannya ke dalam kacang yang diperlukan, kita dapat membiarkan Spring membantu kita menyuntikkan kelas tiruan dari awal. Mari kita tunjukkan dengan kode.
Proyek sampel berisi kelas yang disebut BankService, mewakili panggilan ke Layanan Eksternal, dan kelas yang disebut UserBalanceService, yang memanggil BankService. UserBalanceService diimplementasikan sangat sederhana, hanya untuk menyelesaikan konversi keseimbangan dari string ke tipe ganda.
Kode Sumber Bankservice.java:
Antarmuka Publik BankService {String GetBalanceByemail (String Email);} Kode Sumber BankServiceImpl.java:
Public Class BankServiceImpl mengimplementasikan BankService {@Override Public String getBalanceByemail (String Email) {Throw New UnsupportedOperationException ("Operasi Gagal Karena Pengecualian Eksternal"); }} Kode Sumber UserBalanceService.java:
Antarmuka UserAncalanceservice {Double GetAccountBalance (String Email);} Kode Sumber UserAncalanceserviceImpl.java:
kelas publik UserAncalanceserviceImpl mengimplementasikan UserAncalanceservice {@Autowired Private BankService BankService; @Override public double getAccountAnce (email string) {return double.valueof (BankService.getBalanceByemail (email)); }} Lalu ada file konfigurasi XML Spring, menambahkan deklarasi kacang yang diperlukan.
Kode Sumber ApplicationContext.xml:
<? XML Versi = "1.0" encoding = "utf-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/xmls XSI: schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-eans.xsd"> <bean id = "Bankservice"/<bean id = "
Berikut adalah kode sumber dari kelas tes UserAncalanceserviceImpltest.java:
@Runwith (springjunit4classrunner.class) @contextConfiguration (locations = "classpath: /springtest/springockito/applicationcontext.xml") UserBalanceServiceIverService kelas publik @Autowired Private BankService Bankservice; @Test void public harus retRetMockEdbalance () {double balance = UsusBalangeservice.getAccountAncalance ("[email protected]"); assertequals (balance, double.valueof (123.45d)); }} Seperti yang kami harapkan, metode pengujian melaporkan pengecualian Exception yang tidak didukung. Tujuan kami saat ini adalah untuk menggantikan layanan bank dengan implementasi simulasi kami. Tidak apa -apa menggunakan mockito secara langsung untuk menghasilkan kacang pabrik, tetapi ada pilihan yang lebih baik, gunakan kerangka kerja Springockito. Anda dapat memiliki ide kasar sebelum melanjutkan.
Pertanyaan yang tersisa sederhana: bagaimana menyuntikkan pegas ke dalam kacang yang disimulasikan, bukan kacang asli, tidak ada jalan lain sebelum Spring 3.1 kecuali untuk membuat file konfigurasi XML baru. Tetapi karena Spring memperkenalkan definisi profil kacang, kami memiliki solusi yang lebih elegan, meskipun pendekatan ini juga membutuhkan file konfigurasi XML tambahan khusus untuk pengujian. Berikut adalah kode untuk file konfigurasi testApplicationContext.xml yang digunakan untuk menguji:
<? XML Versi = "1.0" encoding = "utf-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/xmls xmlns: mockito = "http://www.mockito.org/spring/mockito" xsi: schemalocation = "http://www.springframework.org/schema/beans http:/wwww.spramework.org http://www.mockito.org/spring/mockito https://bitbucket.org/kubek2k/springockito/raw/tip/springockito/src/main/resources/spring/mockito.xsd "> <main resource = "classpath: /springtest/springockito/applicationcontext.xml"/> <beans profile = "springtest"> <mockito: mock id = "BankService"/> </tean> </tobel>
Kode Sumber dari kelas tes UserAncalanceserviceImplprofiletest.java setelah membuat modifikasi yang sesuai:
@Runwith (springjunit4classrunner.class) @contextConfiguration (locations = "classpath: /springtest/springockito/testapplicationcontext.xml")@ActiveProfiles (Profiles = "SpringTest"}) UserbalancessbalancesserviceImply; @Autowired Private BankService Bankservice; @Before public void setup () melempar Exception {mockito.when (BankService.GetBalanceByemail ("[email protected]")). ThenReturn (String.ValueOf (123.45d)); } @Test public void seharusnya harus returnmockedbalance () {double balance = UsusBalangeservice.getAccountAncalance ("[email protected]"); assertequals (balance, double.valueof (123.45d)); }} Anda mungkin telah memperhatikan bahwa dalam metode pengaturan, kami menentukan perilaku simulasi dan menambahkan anotasi @Profile ke kelas. Anotasi ini mengaktifkan profil yang disebut springtest, sehingga kacang yang disimulasikan menggunakan springockito dapat secara otomatis disuntikkan di mana saja yang diperlukan. Hasil yang dijalankan dari tes ini akan berhasil karena Spring menyuntikkan versi yang disimulasikan oleh Springockito, bukan versi yang dinyatakan dalam ApplicationContext.xml.
Terus mengoptimalkan tes kami
Jika kita dapat mengambil solusi lebih lanjut untuk masalah ini, artikel ini tampaknya tidak akan cacat. Springockito menawarkan nama lain yang disebut
Kerangka anotasi Springockito , yang memungkinkan kita menggunakan anotasi di kelas tes untuk menyuntikkan kelas tiruan. Sebelum Anda terus membaca, lebih baik pergi ke situs web untuk melihatnya. Oke, ini kode uji yang dimodifikasi.
Kode Sumber UserAncalCerServiceImplannotationTest.java: @runwith (springjunit4classrunner.class) @contextConfiguration (loader = claskanContextLoader.class, locations = "classpath: /springtest/springockito/applicationcontext.xmlicext.xmlicext.xmlicext.xmlicext.xmlicex UserBalanceService UserAncalService pribadi; @Autowired @replacewithmock Private Bankservice Bankservice; @Before public void setup () melempar Exception {mockito.when (BankService.GetalanceByemail ("[email protected]")). ThenReturn (String.ValueOf (valueOf (123.45d))); } @Test public void seharusnya harus returnmockedbalance () {double balance = UsusBalangeservice.getAccountAncalance ("[email protected]"); assertequals (saldo, nilai (123.45d)); }} Harap dicatat bahwa tidak ada file konfigurasi XML yang baru diperkenalkan di sini, tetapi ApplicationContext.xml dari lingkungan formal digunakan secara langsung. Kami menggunakan anotasi @ReplaceWithMock untuk menandai kacang jenis bank, dan kemudian mendefinisikan perilaku kelas tiruan dalam metode pengaturan.
nota bene
Proyek Annotasi Springockito memiliki keuntungan besar, yaitu membangun kode uji kami pada cakupan ketergantungan, sehingga kami tidak perlu mendefinisikan file konfigurasi XML tambahan atau memodifikasi file konfigurasi lingkungan produksi untuk pengujian. Jika Annotasi Springockito tidak digunakan, kami tidak punya pilihan selain mendefinisikan file konfigurasi XML tambahan. Oleh karena itu, saya sangat menyarankan agar Anda menggunakan anotasi springockito dalam tes integrasi Anda sehingga Anda dapat meminimalkan dampak kasus pengujian Anda pada kode produksi Anda, dan juga menghapus beban mempertahankan file konfigurasi XML tambahan.
Nota bene
Menulis tes integrasi untuk proyek musim semi benar -benar lebih mudah. Kode dalam artikel mengacu pada github saya sendiri.
Tautan Terjemahan: http://www.codeceo.com/article/spring-test-is-easy.html
Bahasa Inggris Asli: Uji Saya Jika Anda Dapat #1 (Kerangka Musim Semi)
Penerjemah: Sandbox Wang, jaringan pengkodean
Di atas adalah semua konten artikel ini. Saya harap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.