Ketika properti didefinisikan dalam database produksi (atau klon untuk pengujian), ini bukan tes unit . Tes unit memeriksa unit kerja dan tidak memerlukan kondisi eksternal tertentu untuk bekerja. Ini mengasumsikan yang Offer1
didefinisikan dalam database sebagai penawaran khusus pria. Itu keadaan eksternal. Jadi ini lebih merupakan tes integrasi , khususnya tes sistem atau penerimaan . Perhatikan bahwa tes penerimaan seringkali tidak ditulis (tidak dijalankan dalam kerangka uji coba tetapi dilakukan secara manual oleh manusia).
Ketika properti didefinisikan dalam model domain dengan if
pernyataan, tes yang sama adalah tes unit. Dan itu mungkin rapuh. Tetapi masalah sebenarnya adalah bahwa kode tersebut rapuh. Sebagai aturan umum, kode Anda akan lebih tangguh jika perilaku bisnis dapat dikonfigurasi daripada kode keras. Karena penyebaran terburu-buru untuk memperbaiki kesalahan pengkodean kecil harus jarang terjadi. Tetapi persyaratan bisnis yang berubah tanpa pemberitahuan hanyalah hari Selasa (sesuatu yang terjadi setiap minggu).
Anda mungkin menggunakan kerangka kerja unit test untuk menjalankan tes. Tetapi kerangka kerja unit test tidak terbatas pada menjalankan unit test. Mereka dapat dan melakukan tes integrasi juga.
Jika Anda menulis unit test, Anda akan membuat keduanya person
dan offer1
dari bawah ke atas tanpa bergantung pada status basis data. Sesuatu seperti
[Fact]
public void ReturnsFalseWhenGivenAPersonWithAGenderOfFemale()
{
var personId = Guid.NewGuid();
var gender = "F";
var person = new Person(personId, gender);
var id = Guid.NewGuid();
var offer1 = new Offer1(id, "ReturnsFalseWhenGivenAPersonWithAGenderOfFemale");
offer1.markLimitedToGender("M");
Assert.False(offer1.IsEligible(person));
}
Perhatikan bahwa ini tidak berubah berdasarkan pada logika bisnis. Ini tidak menyatakan bahwa offer1
menolak perempuan. Itu membuat offer1
jenis penawaran yang menolak perempuan.
Anda dapat membuat dan mengkonfigurasi database sebagai bagian dari pengujian. Dalam C #, menggunakan NUnit, atau di JUnit Java, Anda akan mengatur database dalam suatu Setup
metode. Agaknya kerangka pengujian Anda memiliki gagasan serupa. Dalam metode itu, Anda bisa memasukkan catatan ke dalam database dengan SQL.
Jika sulit bagi Anda untuk menulis kode yang menggantikan database uji untuk database produksi, itu terdengar seperti kelemahan pengujian dalam aplikasi Anda. Untuk pengujian, akan lebih baik menggunakan sesuatu seperti injeksi ketergantungan yang memungkinkan untuk diganti. Kemudian Anda dapat menulis tes yang independen terhadap aturan bisnis saat ini.
Keuntungan sampingan dari hal ini adalah sering kali lebih mudah bagi pemilik bisnis (tidak harus pemilik perusahaan, lebih seperti orang yang bertanggung jawab atas produk ini dalam hierarki perusahaan) untuk mengonfigurasi aturan bisnis secara langsung. Karena jika Anda memiliki kerangka kerja teknis seperti ini, mudah bagi pemilik bisnis untuk menggunakan antarmuka pengguna (UI) untuk mengonfigurasi penawaran. Pemilik bisnis akan memilih batasan di UI, dan itu akan mengeluarkan markLimitedToGender("M")
panggilan. Kemudian ketika tawaran tersebut tetap ada di basis data, ia akan menyimpan ini. Tetapi Anda tidak perlu menyimpan penawaran untuk menggunakannya. Sehingga pengujian Anda dapat membuat dan mengonfigurasi tawaran yang tidak ada di database.
Dalam sistem Anda seperti yang dijelaskan, pemilik bisnis harus mengajukan permintaan ke grup teknis, yang akan mengeluarkan SQL yang sesuai dan memperbarui tes. Atau grup teknis harus mengedit kode dan tes Anda (atau tes kemudian kode). Itu tampaknya pendekatan yang agak berat. Kamu bisa melakukannya. Tetapi perangkat lunak Anda (bukan hanya pengujian Anda) akan kurang rapuh jika Anda tidak harus melakukannya.
TL; DR : Anda dapat menulis tes seperti ini, tetapi Anda mungkin lebih baik menulis perangkat lunak sehingga Anda tidak perlu melakukannya.