JavaRush /Java Blog /Random-ID /JUnit untuk JavaRush atau sedikit tentang pengujian di ru...
Sdu
Level 17

JUnit untuk JavaRush atau sedikit tentang pengujian di rumah.

Dipublikasikan di grup Random-ID
Bosan mengetik data pengujian ke konsol puluhan kali untuk memeriksa tugas Anda? Selamat datang di kucing, saya akan memberi tahu Anda apa yang dapat Anda lakukan dengannya. Tujuan akhir dari materi ini adalah untuk mengotomatiskan peluncuran tugas yang sedang diselesaikan dengan berbagai parameter dan memeriksa hasilnya tanpa membuat perubahan pada kode sumbernya. Seperti yang mungkin sudah Anda pahami dari judulnya, asisten utama kami dalam masalah sederhana ini adalah JUnit . Jika Anda belum pernah mendengar tentang pengujian unit dan pengujian unit , saya sarankan Anda beristirahat sejenak dan membiasakan diri dengan konsep-konsep ini, untungnya ada cukup informasi di Internet. Tidak, kamu tidak mau? Baiklah, menurut saya ini tidak akan menjadi masalah besar untuk memahami apa yang terjadi. Lagi pula, tahukah Anda apa itu ujian dan ujian secara umum? Anda melakukan ini setiap kali Anda meluncurkan tugas, memasukkan data awal dan membandingkan hasil yang dihasilkan dengan apa yang Anda harapkan.
Halo, JUnit dunia !
Apa itu JUnit? Di situs resmi proyek kita dapat membaca uraian berikut:
JUnit adalah kerangka sederhana untuk menulis tes berulang. Ini adalah contoh arsitektur xUnit untuk kerangka pengujian unit.
Bagi kami, ini berarti kemampuan untuk menulis kelas yang dirancang khusus yang metodenya akan berinteraksi dengan program kami, membandingkan hasil yang dihasilkan dengan referensi dan memberi tahu kami jika tidak cocok. Untuk memahami prinsipnya, perhatikan contoh sederhana. Misalkan kita mempunyai kelas tambahan, salah satu metodenya mengambil dua variabel bertipe int dan mengembalikan jumlahnya: JUnit untuk JavaRush atau sedikit tentang pengujian di rumah.  - 1 Ini adalah fungsionalitas yang akan kita coba uji. Untungnya, IDEA favorit kami sudah memiliki semua yang Anda perlukan untuk membuat tes dengan cepat, yang kami perlukan hanyalah menempatkan kursor di baris deklarasi kelas, tekan "Alt + Enter" dan pilih "Buat Tes" di menu konteks: Setelah Anda menentukan di JUnit untuk JavaRush atau sedikit tentang pengujian di rumah.  - 2 mana Anda harus membuat tes, IDEA menyarankan untuk memilih perpustakaan pengujian (dalam materi ini saya menggunakan JUnit4; agar kelas perpustakaan dapat terhubung ke proyek, Anda perlu mengklik tombol "Perbaiki"), metode yang akan diuji dan tambahan pilihan. JUnit untuk JavaRush atau sedikit tentang pengujian di rumah.  - 3 IDE akan membuat template kelas pengujian: ClassName = TestClassName + "Test" MethodName = "test" + TestMethodName JUnit untuk JavaRush atau sedikit tentang pengujian di rumah.  - 4 Kita hanya perlu mengisi badan metode. Apa yang disebut “Pernyataan” , metode yang disediakan oleh JUnit , akan membantu dalam hal ini . Secara sederhana, pekerjaan mereka terlihat seperti ini: hasil yang diharapkan dan hasil pemanggilan metode yang diuji diteruskan ke metode .assert*; untuk kenyamanan, Anda dapat menambahkan pesan penjelasan sebagai parameter pertama. Jika parameter tidak cocok selama pengujian, Anda akan diberitahu tentang hal ini. Anda dapat meluncurkan kelas pengujian untuk dieksekusi seperti kelas biasa, saya lebih suka menggunakan kombinasi tombol Ctrl+Shift+F10 JUnit untuk JavaRush atau sedikit tentang pengujian di rumah.  - 5
Mari tentukan tugasnya
Secara teori, semuanya sederhana dan indah, tetapi dalam konteks contoh yang diusulkan, hal ini tidak terlalu diperlukan; kita dapat mempercayai komputer untuk menjumlahkan dua angka. Kami lebih tertarik pada bagaimana masalah nyata yang dipecahkan oleh siswa JavaRush akan berjalan; misalnya, saya menyarankan untuk mengambil level05.lesson12.bonus03 yang disukai.
/* Soal pada algoritma Tulislah program yang: 1. memasukkan angka N > 0 dari konsol 2. kemudian memasukkan N angka dari konsol 3. menampilkan maksimal N angka yang dimasukkan. */
Kita perlu menulis tiga tes, untuk bilangan positif, negatif, dan himpunan campuran.
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); } }
  • Logika program ditempatkan pada metode main()
  • Data sumber tidak diteruskan ke metode, namun dimasukkan dari keyboard.
  • Metode main() tidak mengembalikan hasilnya, namun menampilkannya ke konsol.
Jika poin pertama tidak terlalu bermasalah (kita bisa memanggil metode main() seperti biasa), maka dua poin berikutnya memaksa kita untuk masuk lebih dalam ke topik dan membebani otak kita. Saya menemukan beberapa solusi untuk masalah ini:
  1. Memindahkan logika untuk mencari nilai maksimum ke dalam metode tersendiri.
    • Kelebihan: Pendekatan yang benar dalam hal refactoring
    • Kekurangan: Program menjadi ditumbuhi kode, struktur yang tidak perlu, setidaknya ditambahkan array atau ArrayList (tergantung selera dan warna...). Hanya mekanisme mencari maksimum yang diuji, input dan output data tidak diperiksa.
  2. Menulis pembungkus untuk System.in/System.out.
    • Kelebihan: Kami tidak menggunakan perpustakaan pihak ketiga.
    • Kontra: Jalur ini bukan untuk pemula. Kompleksitas relatif dari implementasi pengujian; jumlah kode dalam pengujian mungkin lebih besar daripada tugas yang diuji.
  3. Menggunakan perpustakaan tambahan untuk pengujian.
    • Kelebihan: Kode bersih dalam pengujian, relatif mudah dalam menulis pengujian. Kode sumber kelas yang diuji tidak diubah.
    • Kontra: Perlu menghubungkan perpustakaan pihak ketiga ke proyek.
Sejujurnya, saya paling menyukai opsi ketiga, jadi mari kita coba menerapkannya.
Aturan Sistem
Pencarian singkat membawa saya ke halaman http://stefanbirkner.github.io/system-rules/ dan segera menjadi jelas bahwa inilah yang saya butuhkan.
Kumpulan aturan JUnit untuk menguji kode yang menggunakan java.lang.System.
Jadi, mari unduh perpustakaannya . Unduh perpustakaan Commons IO yang diperlukan agar aturan sistem dapat berfungsi . Kami menghubungkan kedua perpustakaan ke proyek kami (File -> Struktur Proyek -> Perpustakaan -> + -> Java) dan mulai membuat patung: Setelah peluncuran, tugas kami meminta Anda memasukkan nomor N+1 dari konsol, di mana angka pertama memberitahu Anda berapa banyak angka yang akan mengikutinya. Dalam Aturan Sistem, kelas TextFromStandardInputStream digunakan untuk tujuan ini. Awalnya, kita perlu menambahkan bidang jenis ini ke kelas pengujian kita dan menandainya dengan anotasi @Rule: @Rule public final TextFromStandardInputStream systemInMock = emptyStandardInputStream(); Kemudian, langsung dalam metode pengujian, kita menunjukkan data yang diperlukan: systemInMock.provideText("4\n2\n6\n1\n3\n"); Seperti yang Anda lihat, nomor-nomor tersebut dikirimkan dalam bentuk teks dan dipisahkan oleh string tanda hubung "\n". Berdasarkan hal tersebut ternyata N sama dengan 4, dan kita cari maksimum dari bilangan {2, 6, 1, 3}. Selanjutnya, kita perlu membuat instance dari kelas yang sedang diuji dan memanggil metode main(). Program kita membaca data dari systemInMock, memprosesnya dan mencetak hasilnya, dan yang harus kita lakukan hanyalah membacanya dan membandingkannya dengan standar. Untuk melakukan hal ini, aturan sistem memberi kita kelas StandardOutputStreamLog. Kami menambahkan bidang dengan tipe yang ditentukan: @Rule public final StandardOutputStreamLog log = new StandardOutputStreamLog(); Anda dapat membaca data yang dicetak menggunakan metode .getLog(), sementara Anda perlu memperhitungkan keberadaan karakter baris baru, opsi terakhirnya bisa 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()); Di ​​antara pengujian, untuk menghindari pelapisan data, Anda perlu menghapus log log.clear(); Teks lengkap kelas pengujian 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 meluncurkan dan menikmati. -=!!! PENTING!!!=- Materi ini disediakan untuk tujuan informasi HANYA; Saya tidak menjamin keberhasilan pengujian tugas di server jika ada kelas asing dalam paket dengan tugas tersebut. Sebelum mengirim tugas untuk verifikasi ke server, hapus semua yang tidak relevan: file yang tidak perlu, kelas yang tidak perlu, kode yang dikomentari. Keberhasilan menyelesaikan pengujian yang Anda buat tidak menjamin keberhasilan penyelesaian pengujian di server. Sengaja saya tidak mengunyah materi teori: teori unit test, anotasi JUnit, pernyataan, dan lain-lain, semua materi ada di link yang tersedia di teks. Mungkin Anda memiliki cara sendiri untuk menguji tugas, saya akan dengan senang hati mendiskusikannya dengan Anda di komentar.
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION