Ada, di suatu tempat di basis kode Anda, satu baris kode yang melakukan tindakan aktual untuk menghubungkan ke DB jarak jauh. Baris kode ini, 9 kali dalam 10, panggilan ke metode "bawaan" yang disediakan oleh pustaka runtime yang spesifik untuk bahasa dan lingkungan Anda. Karena itu, ini bukan kode "Anda" dan karenanya Anda tidak perlu mengujinya; untuk keperluan pengujian unit, Anda dapat percaya bahwa panggilan metode ini akan bekerja dengan benar. Apa yang Anda bisa, dan harus, masih uji di unit test unit Anda adalah hal-hal seperti memastikan parameter yang akan digunakan untuk panggilan ini adalah apa yang Anda harapkan, seperti memastikan string koneksi sudah benar, atau pernyataan SQL atau nama prosedur tersimpan.
Ini adalah salah satu tujuan di balik pembatasan bahwa tes unit tidak boleh meninggalkan "kotak pasir" runtime dan bergantung pada keadaan eksternal. Ini sebenarnya cukup praktis; tujuan dari tes unit adalah untuk memverifikasi bahwa kode yang Anda tulis (atau akan menulis, dalam TDD) berperilaku seperti yang Anda pikir akan. Kode yang tidak Anda tulis, seperti perpustakaan yang Anda gunakan untuk melakukan operasi basis data Anda, tidak boleh menjadi bagian dari cakupan setiap unit test, karena alasan yang sangat sederhana bahwa Anda tidak menulisnya.
Di suite tes integrasi Anda , pembatasan ini santai. Sekarang kamu bisates desain yang menyentuh database, untuk memastikan bahwa kode yang Anda tulis bermain dengan baik dengan kode yang tidak Anda tulis. Namun, dua suite pengujian ini harus tetap dipisahkan, karena unit test suite Anda lebih efektif semakin cepat dijalankan (sehingga Anda dapat dengan cepat memverifikasi bahwa semua pernyataan yang dibuat oleh pengembang tentang kode mereka masih berlaku), dan hampir secara definisi, tes integrasi lebih lambat oleh urutan besarnya karena ketergantungan ditambahkan pada sumber daya eksternal. Biarkan build-bot menangani menjalankan paket integrasi penuh Anda setiap beberapa jam, menjalankan tes yang mengunci sumber daya eksternal, sehingga pengembang tidak saling menginjak jari kaki dengan menjalankan tes yang sama ini secara lokal. Dan jika bangunannya rusak, lalu apa? Jauh lebih penting ditempatkan pada memastikan build-bot tidak pernah gagal membangun daripada yang seharusnya.
Sekarang, seberapa ketat Anda dapat mematuhinya tergantung pada strategi pasti Anda untuk menghubungkan dan menanyakan database. Dalam banyak kasus di mana Anda harus menggunakan kerangka akses data "tulang kosong", seperti objek SqlConnection dan SqlStatement ADO.NET, seluruh metode yang dikembangkan oleh Anda dapat terdiri dari pemanggilan metode bawaan dan kode lain yang bergantung pada memiliki koneksi basis data, dan yang terbaik yang dapat Anda lakukan dalam situasi ini adalah mengejek seluruh fungsi dan mempercayai suite pengujian integrasi Anda. Ini juga tergantung pada seberapa bersedia Anda merancang kelas Anda untuk memungkinkan baris kode tertentu diganti untuk tujuan pengujian (seperti saran Tobi tentang pola Metode Templat, yang bagus karena memungkinkan "tiruan sebagian")
Jika model ketekunan data Anda bergantung pada kode di lapisan data Anda (seperti pemicu, procs tersimpan, dll) maka tidak ada cara lain untuk menjalankan kode yang Anda sendiri tulis selain mengembangkan tes yang hidup di dalam lapisan data atau melintasi batas antara runtime aplikasi Anda dan DBMS. Seorang purist akan mengatakan pola ini, karena alasan ini, harus dihindari demi sesuatu seperti ORM. Saya tidak berpikir saya akan melangkah sejauh itu; bahkan di zaman query yang terintegrasi dengan bahasa dan operasi ketekunan yang diperiksa oleh kompiler lainnya, saya melihat nilai dalam mengunci basis data hingga hanya operasi yang diekspos melalui prosedur tersimpan, dan tentu saja prosedur tersimpan tersebut harus diverifikasi menggunakan otomatis tes. Tapi, tes semacam itu bukan tes unit . Mereka adalah integrasi tes.
Jika Anda memiliki masalah dengan perbedaan ini, biasanya didasarkan pada kepentingan yang tinggi ditempatkan pada "cakupan kode" lengkap alias "cakupan unit test". Anda ingin memastikan setiap baris kode Anda dicakup oleh tes unit. Sebuah tujuan mulia di wajahnya, tetapi saya katakan omong kosong; bahwa mentalitas cocok untuk anti-pola yang jauh melampaui kasus khusus ini, seperti menulis tes tegas yang mengeksekusi tetapi tidak berolahragakode Anda. Jenis end-run ini semata-mata demi nomor pertanggungan lebih berbahaya daripada melonggarkan cakupan minimum Anda. Jika Anda ingin memastikan bahwa setiap baris basis kode Anda dieksekusi oleh beberapa tes otomatis, maka itu mudah; saat menghitung metrik cakupan kode, sertakan tes integrasi. Anda bahkan dapat melangkah lebih jauh dan mengisolasi tes "Itino" yang disengketakan ini ("Integrasi nama saja"), dan antara unit uji unit Anda dan sub-kategori tes integrasi ini (yang seharusnya masih berjalan cukup cepat) Anda harus mendapatkan darn dekat dengan cakupan penuh.