Mengotomatiskan Pembuatan Tes Unit


11

Apa sajakah strategi yang dapat digunakan untuk mengotomatisasi pembuatan kasus uji unit? Aspek apa yang perlu Anda perhatikan di setiap kelas untuk dapat menghasilkan setidaknya kerangka kasus uji yang layak?

Saya menyadari solusi otomatis yang komprehensif tidak praktis, tetapi saya ingin mempercepat pembuatan tes setidaknya dengan membuat kerangka. Saya tidak mencari contoh kode, mungkin hanya beberapa saran untuk memulai atau contoh di mana sesuatu seperti ini telah dilakukan sehingga saya dapat melihat bagaimana mereka mendekatinya dan apa yang mungkin dilakukan.

Saya terutama tertarik pada metode untuk membuat kerangka unit test di PHP, yang tidak menyediakan semua alat yang bahasa lain mampu, seperti mengisyaratkan tipe lengkap , misalnya.


Visual Studio terbaru adalah yang Anda butuhkan ...
Pekerjaan

Jawaban:


5

Strategi dan kerangka Anda tergantung, secara non-sepele, pada jenis tes apa yang ingin Anda hasilkan, cakupan apa yang Anda cari, dan bahasa / lingkungan tempat Anda bekerja.

Cukup mudah untuk menulis generator tes yang, untuk bahasa seperti C atau Java, membaca tanda tangan kelas dan secara otomatis menghasilkan tes untuk kasus sudut standar (meneruskan 0, 2 nilai acak, MAX_INT, MIN_INT, ke argumen integer, nulls untuk nullables , dll ...). Anda kemudian dapat menjalankan tes yang dihasilkan, mencatat hasil untuk setiap tes, dan secara manual menyaringnya untuk menghapus yang tidak relevan, menyetujui hasil yang dapat diterima untuk tes yang lulus (sehingga mereka dapat secara otomatis lulus sejak saat itu), dan menandai sebagai yang tidak valid yang gagal .

Anda dapat menambah ini dengan memberi tag / komentar / refactoring kelas untuk membantu generator Anda dengan petunjuk tambahan. Anda mungkin memiliki tag yang mencantumkan semua perkecualian yang mungkin yang diajukan oleh pemanggilan metode, atau yang memberikan kisaran bilangan bulat yang valid untuk argumen bilangan bulat berkurang. Lihatlah ini sebagai tangan pendek karena harus menulis tes sendiri.

Jadi, berikut adalah beberapa komponen yang ingin Anda lihat:

  • Komponen yang secara otomatis mem-parsing kode sumber / fungsi tanda tangan / anotasi manual, menghasilkan kasus uji standar, atau menguraikan / menandatangani untuk kasus uji yang menunggu input Anda selesai.
  • Bahasa tag / anotasi / komentar yang terus tumbuh / berubah yang dapat mencapai tingkat granularitas (metode / kelas / tanda tangan / loop sementara / dll ...) mewakili petunjuk untuk pembuat tes otomatis. Idealnya Anda harus bisa bermain dengan bahasa ini tanpa harus mengubah kode kerangka kerja Anda atau potongan apa pun di dalamnya
  • Pelari uji otomatis, dengan kemampuan untuk mengidentifikasi tes baru / lama dan mencatat / menguji terhadap jawaban yang "dapat diterima" untuk setiap tes. Idealnya pelari ini akan membangun database uji coba, hasil yang diterima / ditolak, dan hasil saat ini yang dapat diterima untuk setiap tes.
  • "Pembuat objek" otomatis yang, diberi nama kelas dan peta nilai- nilai>, dapat menghasilkan objek yang meniru kelas, mengembalikan data yang dapat disesuaikan untuk panggilan fungsi, pengakses, slot data publik, dll ...

Ada banyak kerangka kerja pengujian di luar sana yang sudah menyertakan potongan fungsi ini untuk berbagai bahasa dan platform. Meskipun cukup mudah untuk mulai melakukan pekerjaan ini sendiri dan menumbuhkan kerangka kerja semacam ini secara in-house, ini juga merupakan proyek jangka panjang tanpa akhir yang mungkin akan meniru pekerjaan yang sudah ada. Saya akan merekomendasikan meluangkan waktu yang signifikan untuk melihat apa yang tersedia terlebih dahulu, dan kemudian memutuskan apakah layak untuk menyelam.


5

Saya belum memiliki kesempatan untuk menggunakannya pada aplikasi dengan ukuran atau kompleksitas yang berarti, tetapi ada alat, termasuk Google CodePro AnalytiX , yang mengotomatisasi pembuatan unit test untuk aplikasi Java . Saya juga menemukan produk komersial, Tes C ++ Parasoft , yang tampaknya memungkinkan untuk pembuatan tes unit C ++

Aplikasi ini menggunakan heuristik untuk menghasilkan kasus uji. Saya tidak yakin bahwa ada satu kerangka kerja yang dapat Anda gunakan untuk menghasilkan kerangka, tetapi ada konstruksi yang dapat Anda cari. Saya cenderung fokus pada loop, pernyataan kondisional ( ifblok, switch/ casepernyataan), dan pengecualian, dan membuat kasus uji yang memaksa jalur eksekusi yang berbeda untuk dilakukan.

Saya tidak akan fokus pada mempercepat penulisan tes dengan mencoba membuat kerangka atau templat, tetapi dengan meningkatkan analisis spesifikasi dan / atau implementasi dan menulis tes berkualitas tinggi. Mampu mengidentifikasi tes apa yang menambah nilai paling awal, menulis itu, dan kemudian mengisi lubang kemudian akan berdampak lebih besar pada produktivitas dan kualitas.


Hanya untuk memberikan publisitas lagi, Falcon mencoba CodePro pada sebuah proyek dan menulis sedikit uraian tentang pengalamannya .


Google CodePro Analytix terdengar menarik. Tapi "Quis custodiet ipsos custodes?" Siapa yang menguji tes? Ini hanya dapat digunakan untuk membackup proyek yang ada dengan unit test dan mungkin tidak akan mendeteksi kegagalan, lebih baik mengasumsikan bahwa kerusakan sudah benar.
Falcon

@ Falcon Anda tidak bisa mempercayai alat apa pun secara membabi buta - melakukannya hanya akan menyebabkan lebih banyak sakit kepala. Saya pikir tip Programmer Pragmatis "peduli dengan kerajinan Anda" berlaku di sini. CodePro memang berisi editor tes untuk membuatnya sepele untuk melihat nilai-nilai apa yang diteruskan dan apa hasil yang diharapkan, dan kemudian membuat perubahan padanya (dan kemudian memperbarui kode tes yang dihasilkan untuk mencerminkan perubahan ini).
Thomas Owens

Saya hanya ingin tahu apa yang lebih dapat diandalkan dalam hal ini, manusia atau mesin. Saya pikir tes yang dihasilkan akan menyebabkan lebih banyak sakit kepala daripada tes yang ditulis secara manual. Idealnya tes harus ditulis terlebih dahulu. Tapi saya pasti akan mencobanya. Saya ingin melihat alat yang dapat menghasilkan tes berdasarkan persyaratan formal dan beberapa lem metadata untuk antarmuka sistem satu hari.
Falcon

@ Falcon Ya, idealnya beberapa tes harus ditulis terlebih dahulu, tetapi sampai Anda memiliki implementasi dan dapat melakukan pengujian kotak putih, Anda tidak perlu melihat semua kasus tepi yang berbeda yang dapat Anda lihat setelah Anda memiliki implementasi. Jika Anda mendapatkan kesempatan untuk bermain-main dengan fitur pembuatan uji CodePro, dapatkah Anda memposting pemikiran Anda di suatu tempat dan entah bagaimana mendapatkan saya tautan? Saya tertarik untuk melihat seberapa baik kerjanya dan pengalaman orang lain dengannya.
Thomas Owens

Saya akan mengujinya minggu depan dengan aplikasi J2EE berukuran sedang (120 klok) yang menggabungkan beberapa aturan bisnis yang sangat sulit dan memberi tahu Anda tentang pengalaman saya di sini.
Falcon

1

Saya menulis generator untuk mempercepat pengujian unit untuk proyek .NET beberapa tahun yang lalu. Ada basis kode besar tanpa unit test dan bertujuan untuk dengan cepat meningkatkan cakupan dasar. Berikut adalah beberapa catatan yang mungkin bisa membantu:

  • Kesempatan saya adalah bahwa kerangka inti di atas mana proyek dikembangkan menyediakan operasi standar dan penamaan kelas. Jika Anda berpikir untuk menulis sendiri, struktur standar seperti ini akan sangat membantu.
  • Menggunakan data-driven testingbanyak membantu, jika basis kode Anda mengizinkan. Kerangka uji membuat tabel database untuk setiap unit tes untuk menyimpan data uji, sehingga setiap baris dalam tabel itu adalah tes terpisah dan tidak diperlukan kode tambahan ( Aturan Representasi ). Dari titik ini, pengujian yang sebenarnya dapat dengan mudah dibuat secara otomatis atau dimasukkan secara manual.
  • Unit test yang dihasilkan adalah sederhana tetapi smoke testsetidaknya berfungsi sebagai . Untuk area dengan risiko lebih tinggi, tes manual tambahan ditulis.

Untuk meringkas, saya setuju bahwa solusi generik tidak praktis (jika memungkinkan). Saya percaya peluangnya lebih baik jika basis kode cocok untuk pembuatan uji dan kerangka uji dapat mengambil keuntungan dari strukturnya.

(Sebagai catatan tambahan, ada Pex , tetapi untuk .NET)

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.