Bagaimana tes unit Guava dibuat secara otomatis?

31

Jambu biji memiliki unit uji kasus yang dibuat secara otomatis :

Jambu biji memiliki jumlah unit tes yang mengejutkan: pada Juli 2012, paket uji jambu biji mencakup lebih dari 286.000 kasus uji individual. Sebagian besar dihasilkan secara otomatis , tidak ditulis dengan tangan, tetapi cakupan uji Guava sangat menyeluruh, terutama untuk com.google.common.collect.

Bagaimana mereka dihasilkan? Teknik dan teknologi apa yang digunakan untuk merancang dan menghasilkannya?

dzieciou
sumber
Saya ingat pernah melihat ceramah oleh beberapa teman Google yang menyentuh subjek ini. Tidak tahu apa-apa tentang namanya, pembicaraannya di beberapa konvensi java kurasa
Zavior
3
package com.google.common.collect.testing memiliki banyak kelas dengan "Generator" dalam namanya - membuatnya terlihat seperti kerangka kerja untuk pembuatan tes. Ada juga sub-paket dengan kelas yang didokumentasikan sebagai "kerangka" atau "kelas dasar" untuk tes ...
gnat
1
@gnat Ya, saya yakin saya pernah melihatnya di suatu tempat. com.google.common.collect.testing.features misalnya menunjukkan tfeatures / batasan yang harus dipenuhi oleh kelas koleksi, dan case uji merupakan kombinasi dari mereka. Dengan cara ini mereka dapat menguji parametrize
dzieciou
Anda mungkin memiliki lebih banyak keberuntungan pada Jaminan Kualitas dan Pengujian Perangkat Lunak.SX
Monica - M. Schröder
Pertanyaan itu mendapat banyak perhatian dari komunitas tetapi sejauh ini tidak ada jawaban yang masuk akal, jadi saya telah mengikuti saran Martin dan menaruhnya di sini: sqa.stackexchange.com/questions/5214/… .
dzieciou

Jawaban:

8

Sebagian besar dari tes ini adalah untuk implementasi pengumpulan Jambu. Mereka telah menulis tes generik yang secara mendalam menguji antarmuka pengumpulan, dan ini menghasilkan suite per implementasi. Lihat, misalnya, kelas yang disebut CollectionAddAllTester, ListIndexOfTester.

Ini semua didukung oleh perpustakaan yang disebut testlib, yang dikirimkan sebagai bagian dari Guava. Ini cukup umum. Ini mendukung penulisan tes generik untuk semua antarmuka (bukan hanya koleksi). Anda dapat menentukan Featureimplementasi yang mungkin dan mengujinya (mis. Jika set Anda tidak dapat dimodifikasi, Anda mengharapkan hasil yang berbeda dari set.add()), dan ketika Anda menjalankan tes, Anda menentukan fitur mana yang didukung oleh implementasi Anda.

Ini didasarkan pada JUnit 3, bukan 4. Biasanya, Anda memiliki kelas yang TestCasepenuh dengan metode bernama testSomething(), dan JUnit menjalankannya secara reflektif. Pustaka testlib menghubungkan ke dalam menjalankan tes ini sehingga siklus hidup terlihat seperti ini:

  • Untuk setiap implementasi yang ingin Anda uji
  • Untuk setiap metode pengujian (berlaku)
  • Buat TestCaseinstance
  • Inisialisasi TestSubjectGenerator- ini adalah antarmuka testlib yang Anda perluas tempat Anda benar-benar membuat subjek tes
  • Jalankan metode pengujian secara reflektif. Selama metode ini, getSubjectGenerator()berikan akses ke subjek tes

Bit kunci adalah langkah inisialisasi ekstra yang memungkinkan mereka untuk menyuntikkan subjek uji tertentu ke dalam kasus uji generik.

Saya menulis posting tentang cara menulis suite menghasilkan testlib untuk antarmuka Anda sendiri.

(Juga diposting ke pertanyaan yang sama di situs sqa .)

Joe Kearney
sumber
6

Ada generator unit test. Misalnya, di dunia .NET, sesuatu seperti Microsoft Pex dapat melakukan ini.

Sebagai contoh, Microsoft Pex mencoba berdasarkan pada analisis kode semua nilai yang mungkin sebagai argumen untuk suatu metode. Beberapa argumen diharapkan membiarkan metode ini melempar pengecualian. Hal-hal semacam itu secara otomatis dapat dibuat untuk tes. Nilai statis seperti string kosong yang dikembalikan dalam kasus tertentu juga dapat diuji secara otomatis.

Sebazzz
sumber
2
Itu adalah pengujian acak yang hanya berguna untuk pengujian jalur negatif (pengecualian, input tidak valid, crash-es, batas waktu). Saya percaya mereka menghasilkan tes juga untuk jalur bahagia, dan ini membutuhkan lebih banyak desain, tidak hanya meluncurkan alat analisis statis.
dzieciou
Dan saya tahu ada cara dan alat untuk menghasilkan tes untuk jalan bahagia (misalnya, lihat jawaban ini ), tapi saya tertarik bagaimana ini dilakukan dalam kasus khusus Guava
dzieciou