Saya berpikir tentang pengembangan perangkat lunak dan tes unit penulisan. Saya mendapat ide berikut:
Mari kita asumsikan kita memiliki pasangan pengembang. Setiap pasangan bertanggung jawab atas bagian dari kode. Satu dari pasangan mengimplementasikan fitur (menulis kode) dan yang kedua menulis tes unit untuk itu. Tes ditulis setelah kode. Menurut saya mereka saling membantu, tetapi bekerja agak terpisah. Idealnya mereka akan bekerja pada dua fitur berukuran serupa dan kemudian ditukar dengan persiapan tes.
Saya pikir ide ini memiliki beberapa kelebihan:
- tes ditulis oleh seseorang, yang dapat melihat lebih banyak tentang implementasinya,
- pekerjaan harus dibuat sedikit lebih cepat daripada pemrograman pasangan (dua fitur pada saat yang sama),
- baik tes dan kode memiliki orang yang bertanggung jawab untuk itu,
- kode diuji oleh setidaknya dua orang, dan
- mungkin mencari kesalahan dalam kode yang ditulis oleh orang yang menguji kode Anda akan memberikan motivasi khusus untuk menulis kode yang lebih baik dan menghindari memotong sudut.
Mungkin juga merupakan ide bagus untuk menambahkan pengembang lain untuk ulasan kode antara pengembangan kode dan tes.
Apa kelemahan ide ini? Apakah sudah digambarkan sebagai metodologi yang tidak diketahui dan digunakan dalam pengembangan perangkat lunak?
PS. Saya bukan manajer proyek profesional, tetapi saya tahu sesuatu tentang proses pengembangan proyek dan tahu beberapa metodologi paling populer - tetapi ide ini tidak terdengar asing bagi saya.
sumber
assert true
sebagai tes dan menyebutnya sehari karena setiap tes lulus. Satu langkah penting hilang: tes harus gagal dulu, dan harus dilakukan untuk lulus dengan mengubah kode, bukan tes.Jawaban:
Pendekatan umum menggunakan pasangan untuk membagi upaya menulis kode produksi dan menulis tes unit terkait tidak biasa. Saya bahkan secara pribadi berpasangan dengan cara ini sebelumnya dengan kesuksesan yang layak. Namun, garis ketat antara orang yang menulis kode produksi dan orang yang menulis kode tes mungkin tidak selalu menghasilkan hasil.
Ketika saya menggunakan pendekatan yang serupa, pasangan mulai dengan berbicara dan mendapatkan pemahaman bersama tentang masalahnya. Jika Anda menggunakan TDD, maka Anda dapat mulai dengan beberapa tes dasar terlebih dahulu. Jika Anda tidak menggunakan TDD, mungkin Anda akan mulai dengan definisi metode. Dari sini, kedua anggota pasangan bekerja pada kode produksi dan kode pengujian, dengan satu orang fokus pada setiap aspek, tetapi berbicara tentang cara untuk meningkatkan kode produksi serta kode pengujian di belakangnya.
Saya tidak melihat keuntungan dari memberikan masing-masing pasangan dua fitur. Yang akhirnya Anda dapatkan adalah sesuatu yang menyerupai TDD untuk beberapa fitur dan sesuatu yang tidak untuk fitur lainnya. Anda kehilangan fokus. Anda tidak mendapatkan manfaat dari peer review real-time. Anda tidak mendapatkan manfaat utama dari pasangan.
Praktik pemrograman pasangan bukan tentang kecepatan, tetapi kualitas. Jadi mencoba menggunakan teknik yang dimodifikasi didorong oleh lebih cepat bertentangan dengan alam. Dengan membangun perangkat lunak berkualitas lebih tinggi melalui peninjauan kode paralel dan pengembangan pengujian, Anda akhirnya menghemat waktu di hilir karena setidaknya ada dua orang dengan pengetahuan tentang setiap perubahan dan Anda menghilangkan (atau mengurangi) siklus menunggu untuk tinjauan dan pengujian rekan.
sumber
Masalah utama dengan ide Anda adalah Anda tidak bisa hanya menulis tes untuk kode apa pun. Kode harus dapat diuji.
Yaitu Anda harus dapat menyuntikkan mengejek, pisahkan sedikit yang ingin Anda uji, status akses yang diubah dan perlu konfirmasi dll.
Kecuali jika Anda beruntung atau menulis tes terlebih dahulu, kemungkinan menulis tes berarti menulis ulang kode sedikit. Yang, jika Anda bukan orang yang menulis kode di tempat pertama, akan berarti penundaan, rapat, refactoring dll
sumber
Masalah utama yang saya lihat di sini, di tingkat unit, ketika saya menulis kode, saya ingin mengkompilasinya, menjalankannya , dan segera menghapus bug yang paling jelas - bahkan ketika kode tidak lengkap dan saya tahu unit, fitur atau fungsi adalah hanya sebagian yang dilaksanakan. Dan untuk menjalankan kode unit, saya perlu beberapa program memanggil implementasi, biasanya tes unit atau setidaknya tes unit parsial. Ini belum tentu "gaya TDD oleh buku", tes seperti itu dapat ditulis setelah atau sebelum kode yang diuji.
Ketika satu versi unit saya adalah "fitur lengkap" dan bebas dari semua bug saya dapat menemukan cara ini sendiri, maka masuk akal untuk menyerahkannya kepada orang kedua dan membiarkan dia menulis tes unit tambahan , atau meninjau kode saya . Tetapi bagi saya tidak masuk akal untuk menyerahkannya segera setelah kompiler tidak menunjukkan peringatan, itu pasti terlalu dini jika saya tahu saya harus menjelaskan tester secara terperinci hal-hal yang tidak berfungsi "dulu", atau akan berfungsi berbeda dalam dua jam karena saya masih bekerja di potongan kode itu. Overhead komunikasi yang diperlukan untuk ini pada tingkat perincian itu tidak akan seimbang dengan manfaatnya.
Jadi ya, memiliki dev kedua menulis tes unit tambahan masuk akal, tetapi tidak untuk menulis tes unit secara eksklusif .
sumber
Tampaknya akan ada kemungkinan untuk terjadi situasi berikut - yang semuanya tidak diinginkan:
Kebingungan
Seperti yang diuraikan Ewan, CUT mungkin perlu diubah untuk membuatnya dapat diuji. Alasan untuk perubahan tidak selalu jelas bagi pengembang (dan dapat menyebabkan ketidaksepakatan) yang menjadi alasan mengapa tes ditulis terlebih dahulu.
Pendapat
Pengembang A mungkin telah menyelesaikan kode mereka dan ingin mengujinya. Pengembang B juga mungkin sedang berkembang dan mungkin enggan memarkir kode mereka untuk menghadiri tes unit.
Pergantian konteks
Bahkan jika pengembang B bersedia untuk menunda pengembangannya untuk menguji kode yang ditulis oleh pengembang A - perubahan dalam kegiatan akan dikenakan biaya.
Telah diterima selama beberapa dekade bahwa menggandakan kekuatan manusia tidak mengurangi separuh waktu pengembangan. Mempertimbangkan faktor-faktor yang telah saya uraikan di atas, sulit untuk melihat bagaimana pengaturan ini akan memperbaiki keadaan.
sumber
Ketika digunakan bersamaan dengan pemrograman pasangan dan TDD ini disebut Pola Ping Pong :
Tetapi Anda tampaknya mengusulkan bahwa kedua kode programmer dengan komputer yang berbeda. Melakukannya secara terpisah akan memerlukan memiliki spesifikasi tingkat yang sangat rendah. Ini bertentangan dengan metodologi lincah. Setiap perubahan perlu dikoordinasikan. Dalam TDD Anda melakukan desing rendah dengan cepat dan itu bukan masalah. Saya berasumsi bahwa pendekatan Anda harus memiliki semacam kerangka yang sudah dikodekan.
Bagaimanapun: Anda dapat belajar banyak dengan menguji cara-cara baru dalam melakukan sesuatu bahkan jika tidak ada 100% efisien. Anda dapat mengujinya dan membagikan pengalaman kehidupan nyata Anda
sumber
Saya datang terlambat ke pesta ini, tapi saya rasa saya punya sesuatu untuk ditambahkan.
Anda mendeskripsikan Pengujian Sebaya .
Ah, Program Pasangan yang baik .
Itu bukan pemrograman pasangan.
Itu pasti Pengujian Sebaya. Inilah makalah ACM tentang hal itu . Saya sudah melakukan ini. Saya telah bekerja di tempat yang merupakan bagian formal dari proses Peer Review . Ini membantu, tetapi tentu saja ini tidak dimaksudkan untuk menjadi garis pengujian pertama, dan tentu saja ini bukan Pemrograman Pair klasik.
Nama lain untuk ini adalah Pengujian Whitebox . Meskipun definisi itu tidak berkaitan dengan siapa yang melakukan pengujian sebanyak dengan fakta bahwa tester dapat melihat cara kerja dari hal yang mereka uji, yang bertentangan dengan pengujian Black Box di mana mereka hanya melihat apa yang masuk dan apa yang keluar. Kotak hitam biasanya adalah apa yang dilakukan QA.
Baris pertama pengujian terletak dengan kuat di tangan pembuat kode. Jika tidak, Anda meminta saya untuk tidak menguji kode saya sendiri yang saya tolak menolaknya. Saya telah menguji kode saya sejak saya berusia 10 tahun. Saya mungkin tidak diuji dengan tes unit mewah saat itu tetapi kode saya diuji. Itu diuji setiap kali saya menjalankannya.
Apa yang saya harapkan dari penguji sebaya adalah tes yang menambah pengujian saya. Tes yang membuat sangat jelas masalah yang ditemukan rekan dengan kode ketika mereka meninjaunya. Dengan mengungkapkan masalah-masalah ini dengan tes otomatis, membuat memahami apa artinya jauh lebih mudah. Infact, saya sudah melakukan percakapan teknis dengan rekan-rekan yang tidak bisa melihat poin yang saya buat dan kemudian menyadari cara terbaik untuk menunjukkan kepada mereka masalahnya adalah dengan menulis unit test. Itu adalah Pengujian Sebaya.
Sekarang jika Anda ingin memberi saya tes tertulis sebelum saya menulis kode saya baik-baik saja. Tidak seperti dokumen persyaratan yang begitu formal sehingga dapat dikompilasi.
sumber
Saya telah melakukan DDT (development driven testing, alias. Tes setelah kode), pair programming dan red-green-refactor TDD untuk masing-masing beberapa tahun. Untuk menanggapi pernyataan Anda poin demi poin:
Orang yang menulis tes perlu mengetahui implementasi sedekat mungkin, untuk menulis tes dengan cakupan yang baik tanpa pengujian berlebihan. Contoh klasik dari ini adalah pengujian dengan tiga input ketika dua akan membuktikan apa yang Anda coba uji. Meskipun mereka dapat mencapai keakraban permukaan dengan kode dari membacanya, mereka tidak akan dapat memahami dengan tepat apa yang pengembang asli lalui untuk sampai ke keadaan saat ini. Jadi mereka akan memiliki pemahaman kode yang kurang optimal.
Saya tidak mengerti mengapa Anda mengatakan itu. Ketika seseorang menulis tes, mereka tidak mengerjakan fitur baru. Anda tidak dapat secara ajaib menggandakan kapasitas seseorang untuk bekerja dengan memberi mereka dua jenis pekerjaan yang berbeda. Dalam pengalaman saya, menulis tes umumnya lebih sulit daripada menulis kode produksi, jadi Anda pasti tidak dapat mengerjakan tes untuk beberapa kode secara produktif dan bertanggung jawab saat menulis fitur lain.
Pertama, tes adalah kode. Untuk kode tes bisnis hampir sama pentingnya dengan kode produksi, karena memungkinkan bisnis untuk mengubah perangkat lunak tanpa rasa takut. Kedua, ini tidak berbeda dari satu orang yang menulis tes dan kode produksi, atau bahkan pasangan yang menulis keduanya.
Tidak, ini hanya diuji oleh orang yang menulis tes. Kecuali jika Anda ingin menggunakan lebih banyak waktu pada pengujian, dalam hal ini mengapa berhenti pada jam dua?
Pengembang (bahkan yang senior) memiliki gagasan yang sangat berbeda tentang apa yang merupakan kode "baik". Pemotongan sudut seseorang adalah cara lain yang sangat valid untuk mendapatkan kode kerja ASAP. Ini adalah resep untuk menyalahkan dan untuk game sistem.
Merah-hijau-refactor TDD ( benar-benar menulis satu tes sebelum menulis kode produksi, menjalankannya, melihatnya gagal, memodifikasi kode produksi saja, menjalankan tes lagi, melihatnya berhasil, dan kemudian refactoring, dan tidak melewatkan atau menukar salah satu dari langkah-langkah ini) dan ulasan kode berfungsi.
sumber
Tidak menjalankannya satu per satu.
Jadi, maksud Anda pengembang pertama telah menghabiskan waktu menulis beberapa implementasi, yang dia tidak yakin berfungsi. Kemudian, pengembang lain datang dan menulis tes, mendasarkan alasannya pada kode tidak ada yang tahu apakah itu benar, dan berharap itu membawa keuntungan taktis dibandingkan dengan menulis tes hanya berkaitan dengan apa yang seharusnya dilakukan kode. Jika implementasinya tidak benar, menurut saya itu tidak akan membantu dalam penulisan tes.
Setelah kedua pengembang menyelesaikan pengembangan awal mereka, tidak ada yang tahu apakah salah satu dari kode mereka benar. Ini masih harus diperiksa, tidak ada yang bisa menandai apa pun yang dilakukan, dan tidak ada yang bisa memprediksi kapan mereka akan selesai. Bandingkan ini dengan TDD: Anda menulis tes terlebih dahulu, kemudian membuat tes gagal, lalu lulus dengan kode. Itu kode yang mendukung semakin banyak skenario. Itu gerak maju.
Jika Anda membuatnya maju secara paralel, kode yang dapat digunakan kembali di kedua fitur akan ditulis dua kali, dan biaya dua kali lebih banyak.
Lihatlah kepemilikan kode kolektif, seperti yang diusulkan oleh XP. Anda akan memiliki lebih banyak orang yang bertanggung jawab atas kode tersebut. Jika tujuan Anda adalah berbagi pengetahuan antar pengembang, mengapa Anda mencoba memisahkan mereka?
Dengan pasangan TDD juga. Saat berpasangan, kedua orang harus setuju bahwa kode tertulis memadai atau tidak menuliskannya. Jika itu menghasilkan perkelahian, beberapa orang di tim memiliki masalah ego yang salah tempat.
Mencari kesalahan menyiratkan bahwa pada titik tertentu, Anda menoleransi mereka masuk. Jika mereka masuk, mereka tidak diperhatikan. Menolak untuk menulis tes terlebih dahulu berarti memberi izin untuk kesalahan.
Sudut pemotongan mungkin tidak disengaja. Untuk itulah pemrograman berpasangan. Setiap anggota pasangan harus diinstruksikan dengan tugas untuk tidak membiarkan yang lain memotong jalan pintas, karena, kita semua melakukan itu. Itu mengharuskan Anda meninggalkan harga diri di lemari dan mengambilnya kembali saat Anda meninggalkan kantor. Jika Anda berharap orang-orang Anda menjadi sangat tegar, Anda tidak mempertimbangkan situasi umum dan mengatur diri sendiri untuk gagal.
XP mengatakan secara eksplisit bahwa semua praktik XP dibuat untuk saling memperkuat dengan menutupi kekurangan masing-masing. Anda seharusnya tidak mendengarkan kritik terhadap praktik XP yang terpisah dari yang lain. Tidak ada satu latihan yang sempurna, TDD tidak sempurna, pemrograman pasangan tidak sempurna, kepemilikan kode kolektif tidak sempurna, tetapi semuanya mencakup satu sama lain.
sumber