Mengenai pola pengujian klasik Arrange-Act-Assert , saya sering menemukan diri saya menambahkan pernyataan balasan yang mendahului Act. Dengan cara ini saya tahu bahwa pernyataan kelulusan benar-benar lulus sebagai hasil dari tindakan tersebut.
Saya menganggapnya sebagai analogi dengan merah dalam merah-hijau-refactor, di mana hanya jika saya telah melihat bilah merah selama pengujian saya, saya tahu bahwa bilah hijau berarti saya telah menulis kode yang membuat perbedaan. Jika saya menulis tes lulus, maka kode apa pun akan memuaskannya; demikian pula, sehubungan dengan Arrange-Assert-Act-Assert, jika pernyataan pertama saya gagal, saya tahu bahwa Undang-undang apa pun akan lolos Assert akhir - sehingga tidak benar-benar memverifikasi apa pun tentang Undang-undang tersebut.
Apakah tes Anda mengikuti pola ini? Mengapa atau mengapa tidak?
Klarifikasi Pembaruan : pernyataan awal pada dasarnya adalah kebalikan dari pernyataan akhir. Ini bukan pernyataan bahwa Atur berhasil; itu adalah pernyataan bahwa Undang-undang belum berhasil.
sumber
Hal ini juga bisa ditetapkan sebagai Arrange- Asumsikan -Act-Tegaskan.
Ada pegangan teknis untuk ini di NUnit, seperti pada contoh di sini: http://nunit.org/index.php?p=theory&r=2.5.7
sumber
Berikut contohnya.
Bisa jadi saya menulis
Range.includes()
untuk sekadar membalas dengan benar. Saya tidak melakukannya, tetapi saya dapat membayangkan bahwa saya mungkin akan melakukannya. Atau saya bisa saja salah menuliskannya dengan berbagai cara lain. Saya berharap dan berharap bahwa dengan TDD saya benar-benar melakukannya dengan benar - ituincludes()
hanya berfungsi - tetapi mungkin saya tidak. Jadi pernyataan pertama adalah pemeriksaan kewarasan, untuk memastikan bahwa pernyataan kedua benar-benar bermakna.Membaca dengan sendirinya,
assertTrue(range.includes(7));
mengatakan: "menegaskan bahwa rentang yang dimodifikasi mencakup 7". Baca dalam konteks pernyataan pertama, itu mengatakan: "menegaskan bahwa memanggil encompass () menyebabkannya menyertakan 7. Dan karena mencakup adalah unit yang kita uji, saya pikir itu dari beberapa nilai (kecil).Saya menerima jawaban saya sendiri; banyak yang lain salah menafsirkan pertanyaan saya tentang pengujian pengaturan. Saya rasa ini sedikit berbeda.
sumber
Sebuah
Arrange-Assert-Act-Assert
tes selalu bisa refactored menjadi dua tes:dan
Tes pertama hanya akan menegaskan apa yang telah diatur di fase Atur, dan tes kedua hanya akan menegaskan apa yang terjadi di fase Act.
Ini memiliki keuntungan memberikan umpan balik yang lebih tepat tentang apakah itu fase Atur atau Tindakan yang gagal, sementara dalam aslinya
Arrange-Assert-Act-Assert
ini digabungkan dan Anda harus menggali lebih dalam dan memeriksa dengan tepat pernyataan apa yang gagal dan mengapa itu gagal untuk mengetahui apakah itu adalah Arrange atau Act yang gagal.Ini juga memenuhi maksud pengujian unit dengan lebih baik, karena Anda memisahkan pengujian Anda menjadi unit independen yang lebih kecil.
Terakhir, perlu diingat bahwa setiap kali Anda melihat bagian Atur yang serupa dalam pengujian yang berbeda, Anda harus mencoba menarik ini ke dalam metode pembantu bersama, sehingga pengujian Anda lebih KERING dan lebih dapat dipelihara di masa mendatang.
sumber
Saya sekarang melakukan ini. AAAA dari jenis yang berbeda
Contoh tes pembaruan:
Alasan agar ACT tidak memuat pembacaan ReadUpdated adalah karena bukan bagian dari undang-undang tersebut. Tindakan itu hanya mengubah dan menyelamatkan. Jadi sungguh, ARRANGE ReadUpdated untuk penegasan, saya menelepon ASSEMBLE untuk pernyataan. Ini untuk mencegah kebingungan bagian ARRANGE
ASSERT hanya boleh berisi pernyataan. Itu meninggalkan ASSEMBLE antara ACT dan ASSERT yang menyiapkan assert.
Terakhir, jika Anda gagal dalam Atur, tes Anda tidak benar karena Anda harus memiliki tes lain untuk mencegah / menemukan bug sepele ini . Karena untuk skenario yang saya sajikan, seharusnya sudah ada tes lain yang menguji READ dan CREATE. Jika Anda membuat "Penjaga Pernyataan", Anda mungkin melanggar KERING dan membuat pemeliharaan.
sumber
Melempar pernyataan "pemeriksaan kewarasan" untuk memverifikasi status sebelum Anda melakukan tindakan yang Anda uji adalah teknik lama. Saya biasanya menulisnya sebagai perancah uji untuk membuktikan kepada diri saya sendiri bahwa tes tersebut melakukan apa yang saya harapkan, dan menghapusnya nanti untuk menghindari tes yang berantakan dengan perancah uji. Terkadang, membiarkan perancah membantu ujian berfungsi sebagai naratif.
sumber
Saya sudah membaca tentang teknik ini - mungkin dari Anda btw - tapi saya tidak menggunakannya; terutama karena saya terbiasa dengan bentuk triple A untuk pengujian unit saya.
Sekarang, saya menjadi penasaran, dan memiliki beberapa pertanyaan: bagaimana Anda menulis tes Anda, apakah Anda menyebabkan pernyataan ini gagal, mengikuti siklus refactor merah-hijau-merah-hijau, atau apakah Anda menambahkannya setelah itu?
Apakah Anda terkadang gagal, mungkin setelah Anda melakukan refaktorisasi kode? Apa artinya ini untuk Anda? Mungkin Anda dapat membagikan contoh di mana itu membantu. Terima kasih.
sumber
Saya telah melakukan ini sebelumnya ketika menyelidiki tes yang gagal.
Setelah banyak garukan kepala, saya memutuskan bahwa penyebabnya adalah metode yang disebut selama "Atur" tidak berfungsi dengan benar. Kegagalan pengujian menyesatkan. Saya menambahkan Assert setelah mengatur. Ini membuat pengujian gagal di tempat yang menyoroti masalah sebenarnya.
Saya rasa ada juga code bau di sini jika bagian Atur tes terlalu panjang dan rumit.
sumber
Secara umum, saya sangat menyukai "Atur, Bertindak, Tegaskan" dan menggunakannya sebagai standar pribadi saya. Namun, satu hal yang tidak dapat saya ingatkan untuk saya lakukan adalah mengacaukan apa yang telah saya atur ketika penegasan selesai. Dalam kebanyakan kasus, ini tidak menyebabkan banyak gangguan, karena sebagian besar hal secara otomatis menghilang melalui pengumpulan sampah, dll. Jika Anda telah membuat koneksi ke sumber daya eksternal, Anda mungkin ingin menutup koneksi tersebut setelah selesai. dengan pernyataan Anda atau Anda banyak yang memiliki server atau sumber daya mahal di luar sana yang berpegang pada koneksi atau sumber daya penting yang seharusnya dapat diberikan kepada orang lain. Ini sangat penting jika Anda adalah salah satu pengembang yang tidak menggunakan TearDown atau TestFixtureTearDownuntuk membersihkan setelah satu atau lebih tes. Tentu saja, "Atur, Bertindak, Tegaskan" tidak bertanggung jawab atas kegagalan saya untuk menutup apa yang saya buka; Saya hanya menyebutkan "gotcha" ini karena saya belum menemukan sinonim "A-word" yang baik untuk "dispose" untuk direkomendasikan! Ada saran?
sumber
Lihat entri Wikipedia di Design by Contract . Holy Trinity Arrange-Act-Assert adalah upaya untuk menyandikan beberapa konsep yang sama dan tentang membuktikan kebenaran program. Dari artikel:
Ada pertukaran antara jumlah upaya yang dihabiskan untuk menyiapkan ini dan nilai yang ditambahkannya. AAA adalah pengingat yang berguna untuk langkah-langkah minimum yang diperlukan, tetapi tidak boleh menghalangi siapa pun untuk membuat langkah tambahan.
sumber
Bergantung pada lingkungan / bahasa pengujian Anda, tetapi biasanya jika sesuatu di bagian Atur gagal, pengecualian dilemparkan dan pengujian gagal menampilkannya alih-alih memulai bagian Undang-undang. Jadi tidak, saya biasanya tidak menggunakan bagian Assert kedua.
Juga, jika bagian Atur Anda cukup kompleks dan tidak selalu mengeluarkan pengecualian, Anda mungkin mempertimbangkan untuk membungkusnya di dalam beberapa metode dan menulis tes sendiri untuk itu, sehingga Anda dapat yakin itu tidak akan gagal (tanpa melempar pengecualian).
sumber
Saya tidak menggunakan pola itu, karena menurut saya melakukan sesuatu seperti:
Mungkin tidak ada gunanya, karena seharusnya Anda tahu bagian Atur Anda berfungsi dengan benar, yang berarti bahwa apa pun yang ada di bagian Atur harus diuji juga atau cukup sederhana sehingga tidak memerlukan pengujian.
Menggunakan contoh jawaban Anda:
sumber
Jika Anda benar-benar ingin menguji semuanya dalam contoh, coba tes lainnya ... seperti:
Karena jika tidak, Anda kehilangan begitu banyak kemungkinan kesalahan ... misalnya setelah mencakup, kisaran hanya mencakup 7, dll ... Ada juga tes untuk jarak jangkauan (untuk memastikan itu tidak juga mencakup nilai acak), dan serangkaian pengujian lainnya sepenuhnya untuk mencoba mencakup 5 dalam rentang ... apa yang akan kami harapkan - pengecualian dalam cakupan, atau rentang tidak diubah?
Pokoknya, intinya adalah jika ada asumsi dalam tindakan yang ingin Anda uji, uji sendiri, ya?
sumber
Saya menggunakan:
Karena penyiapan yang bersih sangat penting.
sumber