JavaRush /Blog Java /Random-MS /JUnit untuk JavaRush atau sedikit tentang ujian di rumah....
Sdu
Tahap

JUnit untuk JavaRush atau sedikit tentang ujian di rumah.

Diterbitkan dalam kumpulan
Bosan menaip data ujian ke dalam konsol berpuluh-puluh kali untuk menyemak tugas anda? Selamat datang ke kucing itu, saya akan memberitahu anda apa yang boleh anda lakukan dengannya. Matlamat utama bahan ini adalah untuk mengautomasikan pelancaran tugas yang diselesaikan dengan pelbagai parameter dan menyemak keputusan tanpa membuat perubahan pada kod sumbernya. Seperti yang anda mungkin sudah faham dari tajuk, pembantu utama kami dalam perkara yang agak mudah ini ialah JUnit . Jika anda masih belum mendengar tentang ujian unit dan ujian unit , saya cadangkan anda berehat sedikit dan membiasakan diri dengan konsep ini, mujur terdapat maklumat yang mencukupi di Internet. Tidak, anda tidak mahu? Baiklah, okey, saya rasa ini tidak akan menjadi masalah besar untuk memahami apa yang berlaku. Lagipun, anda tahu apa itu ujian dan ujian secara umum? Anda melakukan ini setiap kali anda melancarkan tugas anda, masukkan data awal dan bandingkan hasil yang terhasil dengan apa yang anda harapkan untuk dilihat.
Hello, JUnit dunia !
Apa itu JUnit? Di laman web rasmi projek , kita boleh membaca penerangan berikut:
JUnit ialah rangka kerja mudah untuk menulis ujian boleh berulang. Ia adalah contoh seni bina xUnit untuk rangka kerja ujian unit.
Bagi kami, ini bermakna keupayaan untuk menulis kelas yang direka khas yang kaedahnya akan berinteraksi dengan program kami, membandingkan hasil yang terhasil dengan rujukan dan memaklumkan kami jika ia tidak sepadan. Untuk memahami prinsip, pertimbangkan contoh mudah. Katakan kita mempunyai kelas tambahan, salah satu kaedahnya mengambil dua pembolehubah jenis int dan mengembalikan jumlahnya: JUnit untuk JavaRush atau sedikit tentang ujian di rumah.  - 1 Ini ialah fungsi yang akan kita cuba uji. Nasib baik, IDEA kegemaran kami sudah mempunyai semua yang anda perlukan untuk membuat ujian dengan cepat, yang kami perlukan ialah meletakkan kursor dalam baris pengisytiharan kelas, tekan "Alt + Enter" dan pilih "Buat Ujian" dalam menu konteks: JUnit untuk JavaRush atau sedikit tentang ujian di rumah.  - 2 Selepas anda menentukan tempat anda harus membuat ujian, IDEA mencadangkan memilih perpustakaan ujian (dalam bahan ini saya menggunakan JUnit4; agar kelas perpustakaan disambungkan ke projek, anda perlu mengklik butang "Betulkan"), kaedah untuk diuji dan tambahan pilihan. JUnit untuk JavaRush atau sedikit tentang ujian di rumah.  - 3 IDE akan mencipta templat kelas ujian: ClassName = TestClassName + "Test" MethodName = "test" + TestMethodName JUnit untuk JavaRush atau sedikit tentang ujian di rumah.  - 4 Kita hanya perlu mengisi badan kaedah. Apa yang dipanggil "Penegasan" , kaedah yang disediakan oleh JUnit , akan membantu dengan ini . Dalam cara yang mudah, kerja mereka kelihatan seperti ini: hasil yang dijangkakan dan hasil panggilan kaedah yang sedang diuji dihantar ke kaedah .assert*; untuk kemudahan, anda boleh menambah mesej penjelasan sebagai parameter pertama. Jika parameter tidak sepadan semasa ujian, anda akan dimaklumkan tentang perkara ini. Anda boleh melancarkan kelas ujian untuk pelaksanaan seperti kelas biasa, saya lebih suka menggunakan kombinasi kekunci Ctrl+Shift+F10 JUnit untuk JavaRush atau sedikit tentang ujian di rumah.  - 5
Mari tentukan tugasan
Secara teori, semuanya mudah dan cantik, tetapi dalam konteks contoh yang dicadangkan, ia tidak semestinya perlu; kita boleh mempercayai komputer untuk menambah dua nombor. Kami lebih berminat tentang bagaimana keadaan akan berlaku dengan masalah sebenar yang diselesaikan oleh pelajar JavaRush; sebagai contoh, saya cadangkan mengambil level05.lesson12.bonus03 yang disayangi.
/* Masalah pada algoritma Tulis program yang: 1. masukkan nombor N > 0 dari konsol 2. kemudian masukkan N nombor dari konsol 3. memaparkan maksimum nombor N yang dimasukkan. */
Kita perlu menulis tiga ujian, untuk nombor positif, negatif dan set bercampur.
Semakin jauh ke dalam hutan...
Di sinilah beberapa kejutan menanti kita: public class UtilApp { public static void main(String[] args) throws Exception { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); //напишите здесь ваш code int n; int maximum; /* Конечно же я не буду размещать решение задачи ;) Код приведенный тут переработан для наглядности, и не в коем случае не означает что он должен присутствовать в "правильном решении" */ System.out.println(maximum); } }
  • Logik program diletakkan dalam kaedah main().
  • Data sumber tidak dihantar ke kaedah, tetapi dimasukkan dari papan kekunci.
  • Kaedah main() tidak mengembalikan hasilnya, tetapi mengeluarkannya ke konsol.
Jika titik pertama tidak terlalu bermasalah (kita boleh memanggil kaedah main() seperti biasa), maka dua seterusnya memaksa kita untuk pergi lebih mendalam ke topik dan menegangkan otak kita. Saya menemui beberapa penyelesaian kepada masalah tersebut:
  1. Menggerakkan logik untuk mencari maksimum ke dalam kaedah yang berasingan.
    • Kelebihan: Pendekatan yang betul dari segi pemfaktoran semula
    • Keburukan: Program ini menjadi ditumbuhi kod, struktur yang tidak perlu, sekurang-kurangnya array atau ArrayList ditambah (bergantung pada rasa dan warna...). Hanya mekanisme untuk mencari maksimum yang diuji; input dan output data tidak disemak.
  2. Menulis pembungkus untuk System.in/System.out.
    • Kelebihan: Kami tidak menggunakan perpustakaan pihak ketiga.
    • Keburukan: Jalan ini bukan untuk pemula. Kerumitan relatif pelaksanaan ujian; jumlah kod dalam ujian mungkin lebih besar daripada tugas yang diuji.
  3. Menggunakan perpustakaan tambahan untuk ujian.
    • Kelebihan: Kod bersih dalam ujian, relatif mudah menulis ujian. Kod sumber kelas yang diuji tidak diubah.
    • Keburukan: Perlu menyambungkan perpustakaan pihak ketiga kepada projek.
Sejujurnya, saya paling suka pilihan ketiga, jadi mari cuba laksanakannya.
Peraturan Sistem
Carian singkat membawa saya ke halaman http://stefanbirkner.github.io/system-rules/ , dan segera menjadi jelas bahawa inilah yang saya perlukan.
Koleksi peraturan JUnit untuk kod ujian yang menggunakan java.lang.System.
Jadi, mari muat turun perpustakaan . Muat turun perpustakaan IO Commons yang diperlukan untuk peraturan sistem berfungsi . Kami menyambungkan kedua-dua perpustakaan ke projek kami (Fail -> Struktur Projek -> Perpustakaan -> + -> Java) dan mula memahat: Selepas pelancaran, tugas kami meminta anda memasukkan nombor N+1 daripada konsol, di mana nombor pertama memberitahu anda berapa nombor yang akan mengikutinya. Dalam Peraturan Sistem, kelas TextFromStandardInputStream digunakan untuk tujuan ini. Pada mulanya, kita perlu menambah medan jenis ini pada kelas ujian kami dan menandakannya dengan anotasi @Rule: @Rule public final TextFromStandardInputStream systemInMock = emptyStandardInputStream(); Kemudian, secara langsung dalam kaedah ujian kami menunjukkan data yang diperlukan: systemInMock.provideText("4\n2\n6\n1\n3\n"); Seperti yang anda lihat, nombor dihantar dalam bentuk teks dan dipisahkan oleh rentetan sempang "\n". Berdasarkan ini, ternyata N akan sama dengan 4, dan kami akan mencari maksimum daripada nombor {2, 6, 1, 3}. Seterusnya, kita perlu mencipta contoh kelas yang sedang diuji dan memanggil kaedah main(). Program kami membaca data daripada systemInMock, memprosesnya dan mencetak hasilnya, dan apa yang perlu kami lakukan ialah membacanya dan membandingkannya dengan standard. Untuk melakukan ini, peraturan sistem memberikan kami kelas StandardOutputStreamLog. Kami menambah medan jenis yang ditentukan: @Rule public final StandardOutputStreamLog log = new StandardOutputStreamLog(); Anda boleh membaca data yang dicetak menggunakan kaedah .getLog(), sementara anda perlu mengambil kira kehadiran aksara baris baharu, pilihan terakhir boleh menjadi seperti ini: assertEquals("{2, 6, 1, 3}, max = 6", "6", log.getLog().trim()); // or assertEquals("{2, 6, 1, 3}, max = 6", "6\r\n", log.getLog()); Antara ujian, untuk elakkan lapisan data, anda perlu mengosongkan log log.clear(); Teks penuh kelas ujian saya: import org.junit.Rule; import org.junit.Test; import org.junit.contrib.java.lang.system.StandardOutputStreamLog; import org.junit.contrib.java.lang.system.TextFromStandardInputStream; import static org.junit.Assert.*; import static org.junit.contrib.java.lang.system.TextFromStandardInputStream.emptyStandardInputStream; public class UtilAppTest { @Rule public final TextFromStandardInputStream systemInMock = emptyStandardInputStream(); @Rule public final StandardOutputStreamLog log = new StandardOutputStreamLog(); @Test public void testAddition() throws Exception { systemInMock.provideText("4\n2\n6\n1\n3\n"); UtilApp utilApp = new UtilApp(); utilApp.main(new String[]{}); assertEquals("{2, 6, 1, 3}, max = 6", "6", log.getLog().trim()); systemInMock.provideText("5\n-100\n-6\n-15\n-183\n-1\n"); log.clear(); utilApp.main(new String[]{}); assertEquals("{-100, -6, -15, -183, -1}, max = -1", "-1", log.getLog().trim()); systemInMock.provideText("3\n2\n0\n-1\n"); log.clear(); utilApp.main(new String[]{}); assertEquals("{2, 0, -1}, max = 2", "2", log.getLog().trim()); } } Kami melancarkan dan menikmati. -=!!! PENTING!!!=- Bahan ini disediakan untuk tujuan maklumat SAHAJA; Saya tidak menjamin kejayaan ujian tugas pada pelayan jika terdapat kelas luar dalam pakej dengan tugas itu. Sebelum menghantar tugas untuk pengesahan ke pelayan, alih keluar semua yang tidak diperlukan: fail yang tidak diperlukan, kelas yang tidak perlu, kod yang dikomentari. Berjaya menyelesaikan ujian yang anda buat tidak menjamin kejayaan menyelesaikan ujian pada pelayan. Saya sengaja tidak mengunyah bahan teori: teori ujian unit, anotasi JUnit, menegaskan, dll., semua bahan ada dalam pautan yang disediakan dalam teks. Mungkin anda mempunyai cara anda sendiri untuk menguji tugasan, saya dengan senang hati akan membincangkannya dengan anda dalam ulasan.
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION