Sebelum menjawab pertanyaan seperti itu, Anda perlu memutuskan apa yang sebenarnya ingin Anda capai.
Anda menulis kode. Anda berharap itu memenuhi kontraknya (dengan kata lain, itu melakukan apa yang seharusnya dilakukan. Menulis apa yang seharusnya dilakukan adalah langkah besar bagi sebagian orang).
Agar cukup yakin bahwa kode melakukan apa yang seharusnya dilakukan, Anda cukup menatapnya, atau menulis kode uji yang menguji cukup banyak kasus untuk meyakinkan Anda "jika kode tersebut lulus semua tes ini maka itu benar".
Seringkali Anda hanya tertarik pada antarmuka yang ditentukan untuk umum dari beberapa kode. Jika saya menggunakan perpustakaan Anda, saya tidak peduli bagaimana Anda membuatnya bekerja dengan benar, hanya itu tidak bekerja dengan benar. Saya memverifikasi bahwa perpustakaan Anda benar dengan melakukan tes unit.
Tetapi Anda sedang membuat perpustakaan. Membuatnya berfungsi dengan benar bisa jadi sulit untuk dicapai. Katakanlah saya hanya peduli dengan perpustakaan yang melakukan operasi X dengan benar, jadi saya memiliki unit test untuk X. Anda, pengembang yang bertanggung jawab untuk membuat perpustakaan, mengimplementasikan X dengan menggabungkan langkah A, B dan C, yang masing-masing sama sekali tidak berguna. Agar perpustakaan Anda berfungsi, Anda menambahkan tes untuk memverifikasi bahwa A, B, dan C masing-masing berfungsi dengan benar. Anda ingin tes ini. Mengatakan "Anda seharusnya tidak memiliki tes unit untuk metode pribadi" tidak ada gunanya. Anda ingin tes untuk metode pribadi ini. Mungkin seseorang memberi tahu Anda bahwa unit yang menguji metode pribadi salah. Tapi itu hanya berarti Anda mungkin tidak menyebutnya "unit test" tetapi "tes pribadi" atau apa pun yang Anda suka menyebutnya.
Bahasa Swift memecahkan masalah yang Anda tidak ingin mengekspos A, B, C sebagai metode publik hanya karena Anda ingin mengujinya dengan memberi fungsi atribut "dapat diuji". Kompiler memungkinkan metode yang dapat diuji secara pribadi dipanggil dari unit test, tetapi bukan dari kode non-test.