Unit testing memiliki sesuatu mistik tentang hal ini hari ini. Orang-orang memperlakukannya seolah-olah cakupan pengujian 100% adalah grail suci, dan seolah-olah pengujian unit adalah Satu Cara Sejati dalam mengembangkan perangkat lunak.
Mereka kehilangan intinya.
Pengujian unit bukanlah jawabannya. Pengujian adalah.
Sekarang, setiap kali diskusi ini muncul, seseorang (seringkali bahkan saya) akan mengeluarkan kutipan Dijkstra: "Pengujian program dapat menunjukkan keberadaan bug, tetapi tidak pernah menunjukkan ketidakhadiran mereka." Dijkstra benar: pengujian tidak cukup untuk membuktikan bahwa perangkat lunak berfungsi sebagaimana dimaksud. Tetapi itu perlu : pada tingkat tertentu, harus dimungkinkan untuk menunjukkan bahwa perangkat lunak melakukan apa yang Anda inginkan.
Banyak orang menguji dengan tangan. Bahkan penggemar TDD yang setia akan melakukan pengujian manual, meskipun mereka terkadang tidak mengakuinya. Tidak dapat dihindari: tepat sebelum Anda pergi ke ruang konferensi untuk mendemokan perangkat lunak Anda kepada klien / bos / investor / dll, Anda akan menjalankannya dengan tangan untuk memastikan itu akan bekerja. Tidak ada yang salah dengan itu, dan pada kenyataannya akan gila untuk hanya mengharapkan semuanya berjalan lancar tanpa menjalankannya secara manual - yaitu, mengujinya - bahkan jika Anda memiliki cakupan pengujian unit 100% dan kepercayaan penuh dalam pengujian Anda .
Tetapi pengujian manual, meskipun diperlukan untuk membangun perangkat lunak, jarang memadai . Mengapa? Karena pengujian manual itu membosankan, dan memakan waktu, dan dilakukan oleh manusia. Dan manusia terkenal buruk dalam melakukan tugas-tugas yang membosankan dan memakan waktu: mereka menghindari melakukannya kapan pun memungkinkan, dan mereka sering tidak melakukannya dengan baik ketika mereka dipaksa.
Mesin , di sisi lain, sangat baik dalam melakukan tugas-tugas yang membosankan dan memakan waktu. Lagi pula, untuk itulah komputer diciptakan.
Jadi pengujian sangat penting, dan pengujian otomatis adalah satu-satunya cara yang masuk akal untuk memastikan bahwa pengujian Anda dilakukan secara konsisten. Dan penting untuk menguji, dan menguji ulang, saat perangkat lunak dikembangkan. Jawaban lain di sini mencatat pentingnya pengujian regresi . Karena kompleksitas sistem perangkat lunak, perubahan yang tampaknya tidak berbahaya pada satu bagian sistem menyebabkan perubahan yang tidak disengaja (yaitu bug) di bagian lain sistem. Anda tidak dapat menemukan perubahan yang tidak disengaja ini tanpa suatu bentuk pengujian. Dan jika Anda ingin memiliki data yang dapat diandalkan tentang pengujian Anda, Anda harus melakukan pengujian secara sistematis, yang berarti Anda harus memiliki semacam sistem pengujian otomatis.
Apa hubungan semua ini dengan pengujian unit? Nah, karena sifatnya, unit test dijalankan oleh mesin, bukan oleh manusia. Oleh karena itu, banyak orang mendapat kesan salah bahwa pengujian otomatis sama dengan pengujian unit . Tapi itu tidak benar: tes unit hanya tes otomatis ekstra kecil .
Sekarang, apa nilainya dalam tes otomatis ekstra kecil ? Keuntungannya adalah mereka menguji komponen sistem perangkat lunak secara terpisah , yang memungkinkan penargetan pengujian yang lebih tepat , dan membantu dalam debugging . Tetapi pengujian unit tidak secara intrinsik berarti tes kualitas yang lebih tinggi . Ini sering mengarah pada tes kualitas yang lebih tinggi, karena itu mencakup perangkat lunak pada tingkat detail yang lebih baik. Tetapi adalah mungkin untuk sepenuhnya menguji perilaku hanya sistem yang lengkap, dan bukan bagian-bagian kompositnya, dan masih mengujinya secara menyeluruh.
Tetapi bahkan dengan cakupan uji unit 100%, sistem mungkin masih belum diuji secara menyeluruh. Karena masing-masing komponen dapat bekerja dengan sempurna dalam isolasi, namun tetap gagal ketika digunakan bersama-sama. Jadi pengujian unit, walaupun sangat bermanfaat, tidak cukup untuk memastikan bahwa perangkat lunak berfungsi seperti yang diharapkan. Memang, banyak pengembang melengkapi tes unit dengan tes integrasi otomatis, tes fungsional otomatis, dan pengujian manual.
Jika Anda tidak melihat nilai dalam unit test, mungkin cara terbaik untuk memulai adalah dengan menggunakan jenis tes otomatis yang berbeda. Dalam lingkungan web, menggunakan alat pengujian otomasi browser seperti Selenium akan sering memberikan kemenangan besar untuk investasi yang relatif kecil. Setelah mencelupkan jari-jari kaki ke dalam air, Anda akan lebih mudah melihat seberapa membantu pengujian otomatis. Dan begitu Anda memiliki tes otomatis, pengujian unit jauh lebih masuk akal, karena memberikan perputaran lebih cepat daripada integrasi besar atau tes ujung ke ujung, karena Anda dapat menargetkan tes hanya pada komponen yang sedang Anda kerjakan.
TL; DR: jangan khawatir tentang unit testing dulu. Hanya khawatir tentang pengujian perangkat lunak Anda terlebih dahulu.