Meneruskan
Saya sudah membaca banyak hal sebelum mengajukan pertanyaan ini, termasuk banyak pertanyaan yang relevan di sini di SE:
- (Rekayasa Perangkat Lunak SE) Menulis tes untuk kode yang tujuannya tidak saya mengerti
- (Rekayasa Perangkat Lunak SE) Unit pengujian tim pemula perlu pengujian unit
- (Rekayasa Perangkat Lunak SE) Praktik terbaik untuk perkuatan kode lama dengan tes otomatis
- (Rekayasa Perangkat Lunak SE) Bagaimana cara menguji sistem warisan yang besar?
- (Posting blog) Cara meniru lingkungan Unit Test Anda
Namun, saya merasa gatal belum tergores setelah membaca untuk bantuan.
TL; DR
Bagaimana cara menulis unit test untuk kode lawas yang tidak dapat saya jalankan, simulasi, baca, atau mudah dimengerti? Tes regresi apa yang berguna untuk komponen yang mungkin berfungsi seperti yang dimaksudkan?
Keseluruhan gambar
Saya magang musim panas yang kembali lagi saat saya beralih ke sekolah pascasarjana. Penugasan saya melibatkan persyaratan ini:
- Untuk produk tertentu, evaluasi apakah tim perangkat lunak kami dapat meningkatkan versi IDE dan JUnit mereka tanpa kehilangan kompatibilitas dengan proyek yang ada.
- Kembangkan tes unit untuk beberapa komponen dalam kode Java yang ada (sebagian besar bukan Java). Kami ingin meyakinkan tim perangkat lunak bahwa pengujian unit dan TDD adalah alat yang sangat berharga yang harus mereka gunakan. (Saat ini ada cakupan kode 0%.)
- Entah bagaimana, akhiri hari-hari pengkodean koboi untuk sistem kritis.
Setelah mendapatkan salinan kode sumber, saya mencoba membangun dan menjalankannya, sehingga saya bisa mengerti apa yang dilakukan produk ini dan bagaimana cara kerjanya. Saya tidak bisa. Saya bertanya kepada penyelia saya bagaimana saya melakukannya, dan saya diberi mesin mandiri baru yang mampu membangunnya, termasuk skrip pembuatan yang sebenarnya. Itu tidak berhasil karena seperti yang seharusnya, kode produksi mereka hanya berjalan pada sistem embedded yang dirancang untuknya. Namun, mereka memiliki simulator untuk tujuan ini, jadi mereka memperoleh simulator dan menaruhnya di mesin ini untuk saya. Simulator juga tidak berfungsi. Sebagai gantinya, saya akhirnya menerima cetakan GUI untuk layar tertentu. Mereka juga tidak memiliki komentar kode di mana pun dalam 700.000+ Java LOC, membuatnya semakin sulit untuk dipahami. Selanjutnya, ada masalah yang mengevaluasi apakah proyek mereka kompatibel dengan IDE yang lebih baru atau tidak. Khususnya, kode mereka tidak dimuat dengan benar ke dalam versi IDE yang mereka gunakan.
Inventaris saya terlihat seperti ini:
- NetBeans 8, 9, 10, 11
- JUnit 4, 5
- Kode sumber mereka untuk produk tertentu (termasuk 700.000+ Java LOC)
- Hampir tidak ada komentar kode (terkadang tanda tangan)
- Tidak ada tes yang ada
- Foto fisik jendela GUI
- Dokumen desain perangkat lunak (109 hal.) Yang tidak membahas komponen dalam gambar
Saya setidaknya memiliki cukup untuk secara teoritis menulis tes yang dapat dijalankan. Jadi, saya mencoba unit test dasar pada komponen ini. Namun, saya tidak bisa menginisialisasi objek yang ia miliki sebagai dependensi, yang mencakup model, manajer, dan koneksi DB. Saya tidak memiliki banyak pengalaman JUnit di luar pengujian unit dasar, jadi ikuti saya ke bagian selanjutnya.
Apa yang Saya Pelajari dari Membaca Saya
- Mengolok-olok: Jika saya menulis unit test, kemungkinan perlu memiliki variabel tiruan untuk dependensi produksi yang saya tidak dapat dengan mudah menginisialisasi
setUp
. - Semua orang di sini dengan bebas menyarankan buku "Bekerja Efektif dengan Kode Legacy" oleh Michael Feathers.
- Tes regresi mungkin merupakan tempat yang baik untuk memulai. Saya tidak berpikir saya memiliki cukup senjata untuk mencoba pengujian integrasi, dan tes regresi akan memberikan kepuasan lebih instan kepada tim perangkat lunak kami. Namun, saya tidak memiliki akses ke bug yang dikenal; tapi, aku mungkin bisa bertanya.
Dan sekarang upaya untuk mengartikulasikan ketidakpastian yang masih saya miliki sebagai pertanyaan. Pada dasarnya, saya tidak mengerti bagaimana bagian menulis tes ini. Dengan asumsi saya tidak menerima panduan lebih lanjut dari penyelia saya (kemungkinan), ada di ballpark saya untuk tidak hanya mempelajari apa yang komponen ini lakukan tetapi untuk memutuskan tes apa yang sebenarnya berguna sebagai tes regresi.
Sebagai profesional yang telah bekerja dengan proyek seperti ini lebih lama daripada saya, dapatkah Anda menawarkan panduan tentang cara menulis tes unit dalam situasi seperti ini?
How do I write unit tests for legacy code that I can't build, run, simulate, read about, or otherwise understand?
- Kamu tidak bisa. Anda harus setidaknya tahu apa output yang diharapkan untuk input yang diberikan.