Apa yang dapat Anda lakukan tentang kualitas integrasi dan uji unit yang ada saat menjadi orang baru dalam sebuah tim?

21

Tema berulang yang saya temui dalam karir saya adalah menjadi pengembang baru yang tiba dalam sebuah tim, dan dengan cepat memiliki ketidakpercayaan yang melekat pada unit yang ada dan suite tes integrasi.

Selama wawancara, Anda diberitahu oleh manajemen bahwa mereka "sangat mendukung pengujian unit" dan bahwa mereka secara terbuka mendorongnya. Mereka melakukannya, tetapi segala sesuatu tentang tes itu sendiri benar-benar salah. Seperti fakta bahwa mereka mengklaim cakupan 100% ketika ada cakupan uji integrasi 100% tetapi kurang dari 10% cakupan pengujian unit yang dapat diulang. Beberapa masalah lain yang saya temukan:

  1. Tidak ada indikasi yang jelas antara apa yang merupakan tes unit dan apa yang merupakan tes integrasi. Tes unit dan integrasi dicampur bersama dalam kelas yang sama.

  2. Tes integrasi yang telah mendeklarasikan dependensi eksplisit pada data dinamis yang sangat spesifik pada basis data lingkungan tertentu.

  3. Tes integrasi non-transaksional, pada dasarnya tes yang mungkin atau tidak mengganggu untuk membersihkan setelah diri mereka sendiri, kadang-kadang membutuhkan database manual "scrubbing" untuk membuat tes berulang.

  4. Jangan mengolok-olok apa pun, dan kode aplikasi memerlukan perombakan besar hanya untuk memungkinkan pengejekan. Dengan kata lain, desain tanpa pengujian dalam pikiran.

  5. Tidak ada konvensi penamaan yang jelas untuk dengan cepat melihat nama tes dan menentukan kira-kira tes apa yang sedang dilakukan.

Ini semua bukan untuk mengatakan bahwa SEMUA dari tes tidak berguna atau buruk, banyak dari mereka cukup bagus dan layak disimpan, tetapi rasanya seperti mendulang emas kadang-kadang. Saya sengaja menghindari menjalankan tes hanya karena saya takut mengacaukan basis data untuk kotak tes kotak hitam saya.

Ini pada dasarnya memberi saya ketidakpercayaan yang melekat pada unit dan tes integrasi yang belum saya tulis atau ulas secara pribadi. Pada tingkat tertentu jika Anda tidak memiliki kepercayaan pada kualitas test suite Anda, maka itu benar-benar tidak membawa nilai bagi tim atau proyek sama sekali.

Apa yang Anda lakukan ketika Anda menemukan diri Anda dalam situasi ini? Menurut Anda apa rencana serangan terbaik untuk mengatasi sesuatu seperti ini?

Haruskah semua tes di refactored dalam upaya monumental yang mencakup seluruh rilis? Haruskah Anda mengabaikan gagasan bahwa proyek lawas ini mungkin memiliki cakupan tes unit yang solid satu hari?

maple_shaft
sumber
6
Selamat datang di dunia nyata, sobat.
tdammers
20
Senang Anda memiliki pengujian.
Joel Etherton
3
Mengapa Anda bekerja untuk perusahaan yang jelas di bawah tingkat kompetensi Anda?
TrojanName
3
@ Brian, saya menghargai pukulan ego, tetapi tanpa lebih banyak orang berpikir seperti saya maka perusahaan ini tidak akan pernah naik di atas. Ini adalah pertama kalinya saya berada dalam posisi kekuasaan yang sebenarnya, karena saya mengembangkan jumlah kepentingan politis yang sederhana untuk sekali saja. Saya memiliki peluang nyata di sini untuk mengarahkan sumber daya untuk membuat segalanya lebih baik. Saya belum menemukan perusahaan yang sempurna tanpa perlu bekerja. Ini seperti suami atau istri yang sempurna, mereka tidak hanya datang, orang yang cukup baik datang dan kemudian Anda mengubahnya menjadi seperti yang Anda inginkan;)
maple_shaft
1
Saya pikir kita mungkin bekerja untuk tim yang sama. Sekarang Anda (dan saya) tahu bagaimana cara mengajukan pertanyaan selama wawancara berikutnya. (Sebenarnya, lingkungan saya tidak memiliki 100% atau bahkan 10% cakupan tes integrasi [tes unit yang sebenarnya? Itu pembicaraan gila!], Tetapi Anda telah menemukan semua poin lain yang saya hadapi.)
Anthony Pegram

Jawaban:

6

Pertama-tama, seperti yang sudah ditulis oleh poster lain, Anda seharusnya senang pengujian unit / integrasi dipahami (bukan dengan cara teknis, maksud saya alasan mengapa hal itu harus dilakukan dipahami) dan didorong oleh manajemen.

Sebelum Anda mulai melakukan segala sesuatu, Anda harus memaparkan masalah kepada manajemen, mengapa sesuatu harus dilakukan, dan dengan sangat diplomatis sehingga mereka tidak berpikir Anda berpikir Anda adalah programmer terbaik di dunia (bahkan jika Anda berada! :-). Mungkin mereka akan memberi tahu Anda bahwa aplikasi tersebut akan diganti oleh sesuatu yang sama sekali baru, dan jika demikian, mengapa repot-repot. Dan mungkin mereka akan menyadari bahwa itu akan menyenangkan dan mempercepat fase pengujian sebelum setiap rilis. Dan bersikap diplomatis dengan rekan satu tim Anda , mungkin ada sejuta alasan mengapa seperti itu dan tidak ada alasan untuk mencari pelakunya.

Gagasan yang lebih baik adalah mencoba berbicara dengan mereka sehingga mereka dapat berpartisipasi dalam upaya ini, dan Anda akan memiliki lebih sedikit peluang untuk tampil sebagai orang yang sok pintar, itu akan lebih "kita" daripada "aku".

Sekarang, prioritaskan apa yang ingin Anda lakukan. Prioritaskan tugas, selalu tahu bahwa prioritas pertama Anda akan selalu menjadi tugas proyek Anda saat ini ... Adapun masalah pengujian Anda, inilah yang akan saya lakukan, dalam tiga fase:

  1. Bagaimana cara membuat perbedaan antara tes unit dan integrasi? Solusi berikut ini mungkin berlaku dan tidak eksklusif:

    • Refactor nama metode kasus uji (bukan kelas karena perilaku yang benar adalah memiliki kasus uji memiliki nama yang sama dengan kelas yang diuji)
    • Buat dua anotasi, satu bernama "UnitTest", yang lain "IntegrationTest". Anotasi ini dapat digunakan pada kelas dan metode. Jika seluruh kelas terdiri dari unit atau tes integrasi, Anda dapat menandai kelas dengan anotasi yang tepat. Jika tidak, Anda dapat menandai setiap metode dengan anotasi yang tepat. Juga, anotasi ini dapat berguna untuk menyuntikkan perlengkapan secara dinamis sebelum meluncurkan tes (fase 3)
  2. Untuk setiap tes integrasi, daftarkan apa "dataset" yang diharapkan berada di database pada awal setiap tes, dan apa yang harus dihapus pada akhir tes (mis: tabel X, membutuhkan catatan dengan "id" set ke "1", dan "name" set ke "foo", dll.). Perhatikan bahwa apa yang Anda hapus mungkin lebih besar / lebih kecil dari apa yang Anda miliki di awal karena kode itu sendiri masing-masing dapat menambah / menghapus objek dari lapisan kegigihan. Anda mungkin akan segera menyadari bahwa beberapa kasus uji ini memerlukan dataset yang sama atau bagian dari dataset yang sama.

  3. Dua fase pertama dapat dilakukan relatif cepat ... dibandingkan dengan yang lain. Sekarang setelah Anda memiliki dataset, Anda menggunakan buat perlengkapan dataset untuk setiap test case yang membutuhkannya. Tetapi itu akan memakan waktu ... Jadi Anda bisa melakukan satu, lihat berapa banyak waktu yang Anda keluarkan dan perkirakan berapa banyak lagi waktu yang Anda butuhkan untuk melakukan semuanya. Juga, Anda dapat menggunakan tes itu untuk menunjukkan kepada rekan kerja Anda apa yang Anda lakukan, dan mengapa hidup jauh lebih mudah ketika Anda tidak perlu memiliki database dalam keadaan khusus untuk melakukan tes.

Anda dapat mencatat bahwa fase 1, 2 dan 3 dapat dilakukan pada satu kelas tes, jika Anda ingin segera menunjukkan kepada kolega / manajemen bagaimana hal itu dapat dilakukan. Ini juga akan berguna, seperti yang ditulis Péter Török, untuk segera menunjukkan "cara yang baik" kepada rekan tim Anda sehingga mereka berhenti memproduksi kode yang buruk. Namun saya berpikir bahwa sisa fase 2, mengidentifikasi seluruh dataset uji, sebaiknya dilakukan dalam satu langkah besar.

Adapun API / teknologi di balik semua itu, Anda tampaknya tahu subjeknya.

Harapan itu sedikit membantu.

Catatan: untuk proposal saya, saya mengandaikan Anda kode di Java / C # di mana saya tahu anotasi dan AOP dimungkinkan. Saya yakin ini juga dimungkinkan dalam bahasa lain, tetapi saya tidak akan menulis tentang sesuatu yang tidak saya ketahui.

Jalayn
sumber
1
Terima kasih ... Saya mempertimbangkan untuk menggunakan anotasi sebagai label untuk mengidentifikasi apa itu tes integrasi dan apa itu tes unit ... Apakah Anda tahu apakah mungkin untuk mengkonfigurasi server CI seperti CruiseControl untuk mengecualikan tes tertentu berdasarkan anotasi? Mungkin itu pertanyaan terpisah.
maple_shaft
Maaf saya tidak tahu menggunakan CruiseControl jadi saya tidak tahu tentang itu. Saya mencari konfigurasi plugin Maven's Surefire hanya untuk rasa ingin tahu dan sepertinya tidak mungkin, namun sangat mungkin untuk melewati tes berdasarkan nama saja.
Jalayn
14

Anda tidak akan dapat memperbaiki semua tes secara bersamaan. Saya pikir Anda harus fokus pada peningkatan kata versus perbaikan . Baik manajemen bukan pengembang akan menyetujui perbaikan tetapi jika Anda menunjukkan bahwa ada cara untuk meningkatkan hal-hal tanpa mempengaruhi proyek secara negatif, mereka akan lebih cenderung mendengarkan.

Pertama, Anda tidak dapat 'memperbaiki' atau memperbaiki kode yang ada kecuali Anda memiliki cakupan pengujian yang berkualitas, jadi saya akan fokus pada memperbaiki infrastruktur pengujian Anda terlebih dahulu.

Buatlah daftar hal-hal yang perlu diperbaiki dan usahakan untuk memprioritaskannya. Saya pikir kemampuan untuk menjalankan tes secara mandiri dan sendiri-sendiri (sehingga tidak saling mempengaruhi) dan pemisahan tes unit dan integrasi adalah beberapa hal pertama yang harus dikerjakan. Anda perlu membuatnya mudah bagi Anda dan orang lain untuk melakukan hal yang benar.

Sejauh menyangkut kode aplikasi ... Anda tidak akan dapat melakukan perombakan lengkap arsitektur aplikasi hanya agar unit tersebut dapat diuji dengan lebih baik. Sebaliknya, ketika Anda memasukkan kode baru, cobalah untuk menerapkan prinsip-prinsip yang membuatnya lebih mudah untuk unit test (seperti injeksi ketergantungan). Anda mungkin berpikir bahwa ini tidak cukup besar untuk suatu perubahan, tetapi menakjubkan bagaimana pengembang cepat menangkap jika mereka melihat manfaatnya. Hanya perlu ada seseorang yang mulai membuat perubahan menjadi lebih baik.

Bicaralah dengan tim Anda dan buat mereka ikut serta. Salah satu hal terpenting yang dapat Anda lakukan adalah mengikuti ' Aturan Pramuka ' dan melakukan perbaikan kecil untuk meninggalkan kelas atau menguji dalam bentuk yang lebih baik daripada yang Anda temukan . Jika seluruh tim menerapkan aturan ini, segalanya menjadi lebih baik lebih cepat.

Setelah beberapa saat, Anda akan memiliki banyak kode yang mengikuti prinsip-prinsip yang baik dan area aplikasi yang dalam kondisi buruk. Pada titik ini, Anda memiliki garis dasar tentang apa yang baik dan tim dapat memutuskan apakah bermanfaat untuk melakukan refactor yang lebih besar untuk barang lawas yang lama atau hanya dapat hidup seperti apa adanya.

c_maker
sumber
8
+1, dan saya akan menambahkan "mulai dengan memimpin dengan contoh." Tidak ada yang menghargai pria yang masuk dan mengatakan "Anda melakukan kesalahan," tetapi jika Anda menunjukkan peningkatan, mereka cenderung akan mengikuti.
StevenV
2
+1 untuk Aturan Pramuka , jauh lebih mudah digunakan dan dijual daripada pendekatan perbaikan apa pun.
Matthieu M.
10

Saya harus mengakui bahwa saya akan menganggapnya sebagai hadiah langka untuk sampai pada proyek di mana mereka sudah memiliki sejumlah besar unit / tes integrasi - saya belum pernah memiliki keberuntungan dalam hidup saya sejauh ini. Bahkan jika tidak semua dari mereka bekerja sebagaimana mestinya, sudah ada banyak upaya yang dilakukan untuk itu, dan bahkan jika tim dan manajemen tidak selalu mengikuti praktik terbaik, tetap saja mereka sudah berkomitmen pada penyebabnya, jadi Anda tidak perlu menghabiskan waktu untuk berdebat tentang mengapa tes unit layak ditulis.

Namun, tes seperti yang Anda gambarkan memang dapat mengambil beberapa perbaikan. Tetapi Anda harus berhati-hati dengan nada bicara Anda saat mendiskusikan masalah dengan rekan setim Anda . Jika Anda mulai dengan menyatakan "segala sesuatu tentang tes itu sendiri salah , " Anda mungkin akan dengan cepat mengasingkan anggota tim lainnya. Sebaliknya, Anda harus fokus pada bagaimana meningkatkan keadaan saat ini, yang - saya harus ulangi - masih jauh lebih baik daripada rata-rata menurut pengalaman saya sejauh ini.

IMO target pertama Anda adalah menghentikan tim dari membuat lebih banyak tes buruk . Jadi mulailah dengan mendemonstrasikan manfaat dari setiap peningkatan spesifik pada rekan satu tim Anda. Jika mereka melihat manfaat dari teknik tertentu - baik itu memotong dependensi eksternal, mengembalikan keadaan semula setelah setiap tes, atau memisahkan unit dan tes integrasi - mereka akan mulai menerapkannya. Ini dengan sendirinya akan perlahan tapi pasti meningkatkan kualitas keseluruhan basis tes dalam jangka panjang (jika Anda memiliki 1000 kasus tes buruk sekarang, dan tim menghasilkan 1000 tes yang baik pada tahun depan, Anda akan menurunkan rasio tes buruk dari 100% hingga 50%). Setelah itu diamankan, Anda dapat memutuskan tentang refactoring tes yang ada berdasarkan kasus per kasus. Sekali lagi, perbaikan kecil akan menambah perubahan besar seiring waktu.

Sebagai catatan tambahan, dari nada tulisan Anda, saya merasa Anda mungkin berada di tempat saya dulu: tidak percaya pada pekerjaan yang dilakukan oleh orang lain, tidak dapat mendelegasikan tugas kepada siapa pun karena takut pekerjaan mereka tidak sesuai dengan keinginan Anda standar kualitas sendiri. Menurut pengalaman saya, ini bukan tempat yang baik, karena dalam jangka panjang, ini dapat dengan mudah menyebabkan konflik pribadi dan kelelahan. Anda tidak dapat melakukan semuanya sendirian, Anda harus bekerja bersama dengan anggota tim lainnya. Anda hanya bisa sukses bersama.

Péter Török
sumber
6

Berusahalah untuk menguji independensi. Jika uji X memodifikasi database uji sedemikian rupa sehingga uji Y gagal, maka ubah uji Y. Dalam skenario kecil ini, hal yang menjadi fokus adalah bukan bahwa X telah mengacaukan basis data, melainkan bahwa Y memiliki dependensi yang tidak sesuai. Hapus dependensi tersebut (dengan mematikan database, dengan merestrukturisasi tes, atau dengan menginisialisasi database ke keadaan di mana Y akan lulus) dan sekarang Anda memiliki satu lagi, tes kerja yang independen. Itu kemajuan (bisa dibilang, "memperbaiki" X untuk tidak mengacaukan basis data tidak akan).

Sabar dan hormat, sebaik mungkin, dari orang-orang yang bekerja dengan Anda, terlepas dari kekacauan yang telah mereka ciptakan. Mereka berusaha melakukan hal yang benar, dalam semua kemungkinan; ingatlah itu dan bantu mereka melakukannya.

Carl Manaster
sumber
2
Saya seharusnya menyebutkan bahwa tidak ada pembuat kekacauan asli di sini lagi. Mereka merasa tidak ingin berurusan dengan hutang teknis yang mereka ciptakan dan pindahkan.
maple_shaft
4
@maple_shaft: Ada baiknya mereka hilang ... Anda bisa memperbaiki keadaan tanpa ada yang kehilangan muka.
kevin cline
2

Hal yang baik tentang menjadi baru dalam tim adalah Anda memiliki pendekatan "segar" terhadap berbagai hal. Bagian yang buruk adalah bahwa orang lain mungkin kesulitan mempercayai Anda.

Jangan membuat daftar laundry tentang hal-hal yang harus dilakukan. Tetapi pilih SATU hal yang tampaknya mendesak, dan yang lain cenderung merespons, dan sarankan solusinya. Jika berhasil, bagus, maka sarankan solusi lain untuk masalah lain, pada kekuatan kesuksesan pertama Anda.

Tapi tenanglah, satu demi satu, dan harap ide Anda perlahan-lahan "menangkap" di antara kelompok baru.

Tom Au
sumber
2

berikan contoh yang ingin Anda lihat, tetapi hargailah perspektif pengembang lain dalam sebuah tes: satu pengembang dapat menguji kesuksesan, sementara yang lain mungkin menguji kegagalan, satu pengembang menulis kelas sementara yang lain mungkin menggunakannya pertama kali saat menulis tes.

tes yang ada (erm, sebagian besar) masih memiliki tujuan, meskipun mungkin tidak segera terbukti. saya tidak merekomendasikan perbaikan dan refactoring semuanya sekaligus (itu membosankan dan rentan kesalahan). tes buruk pada akhirnya perlu diperbarui, ditulis ulang, atau mereka mungkin menjadi usang saat perangkat lunak berkembang.

jika pendekatan Anda dalam pengujian lebih unggul dalam beberapa hal, orang akan belajar dari model itu atau meminta bantuan Anda. akan ada keseimbangan sumber daya, tetapi Anda dapat memperluas sesuai kebutuhan untuk mendukung tes Anda.

pada akhirnya, Anda ingin meningkatkan kualitas program melalui tes dan meningkatkan cakupan. Anda dapat melakukan ini dengan lebih menekankan pada pengujian dan memberikan contoh yang baik - tetapi menghargai sudut pandang orang lain.

ketika menekankan pentingnya, Anda dapat membuat lingkungan operasional tes Anda berbeda - satu contoh nyata adalah menjalankan tes secara paralel; jika itu bukan reentrant, Anda telah menemukan bug di program atau pengujian Anda (menang / menang). lingkungan pengujian yang lebih ketat akan memaksa tes yang buruk diperbaiki dan / atau ditulis ulang (mudah-mudahan dengan cara yang benar untuk kedua kalinya). Perlahan-lahan perkenalkan perubahan tersebut (jangan hancurkan setengah dari tes sekaligus - itu masalah nyata), memaksa mereka untuk belajar apa yang membuat tes yang baik, dan pada akhirnya program yang bagus. kemudian ketika Anda dan orang lain masuk dan memodifikasi / memperbaiki / memperpanjang tes, terapkan apa yang telah Anda pelajari - itu tambahan dan Anda memiliki pemahaman yang lebih baik tentang konteks / program pada saat itu.

justin
sumber
2

Perbaiki mereka seiring waktu

Saya sudah dalam situasi yang sama. Saya hanya menghabiskan satu jam setiap pagi untuk menjalani tes dan memperbaikinya sampai semuanya diperbaiki. Itu basis kode berukuran sedang dan saya pikir saya selesai dalam 1,5 bulan. Saya juga menjadi jauh lebih percaya diri dalam pengujian kami.

Saya pribadi tidak peduli jika tes itu adalah tes unit atau tes integrasi selama itu tes yang bagus. Dengan tes yang baik saya maksudkan itu:

  • membersihkan setelah itu sendiri
  • dapat diulang
  • meminimalkan interaksi lingkungan
  • konsisten

Sepanjang jalan saya menginjili konstruksi tes yang lebih baik (artinya saya menyadap orang banyak).

dietbuddha
sumber