Dimulai dengan konsep ini:
1) Mulailah dengan perilaku yang Anda inginkan. Tulis tes untuk itu. Lihat tes gagal.
2) Tulis kode yang cukup untuk lulus tes. Lihat semua tes lulus.
3) Cari kode redundan / ceroboh -> refactor. Lihat tes masih lulus. Kebagian 1
Jadi pada # 1, katakanlah Anda ingin membuat perintah baru (saya ingin tahu bagaimana perintah akan bekerja, jadi bersabarlah dengan saya). (Juga, saya akan sedikit pragmatis daripada TDD ekstrim)
Perintah baru disebut MakeMyLunch, jadi Anda pertama kali membuat tes untuk membuat instance dan mendapatkan nama perintah:
@Test
public void instantiateMakeMyLunch() {
ICommand command = new MakeMyLunchCommand();
assertEquals("makeMyLunch",command.getCommandName());
}
Ini gagal, memaksa Anda untuk membuat kelas perintah baru dan mengembalikannya (Purist akan mengatakan ini adalah dua putaran TDD, bukan 1). Jadi Anda membuat kelas dan menerapkannya antarmuka ICommand, termasuk mengembalikan nama perintah. Menjalankan semua tes sekarang menunjukkan semua lulus, jadi Anda melanjutkan untuk mencari peluang refactoring. Mungkin tidak ada.
Jadi selanjutnya Anda ingin mengimplementasikannya mengeksekusi. Jadi, Anda harus bertanya: bagaimana saya tahu bahwa "MakeMyLunch" berhasil "membuat makan siang saya". Apa perubahan dalam sistem karena operasi ini? Bisakah saya menguji ini?
Misalkan mudah untuk menguji:
@Test
public void checkThatMakeMyLunchIsSuccessful() {
ICommand command = new MakeMyLunchCommand();
command.execute();
assertTrue( Lunch.isReady() );
}
Di lain waktu, ini lebih sulit, dan apa yang benar-benar ingin Anda lakukan adalah menguji tanggung jawab subjek-under-test (MakeMyLunchCommand). Mungkin tanggung jawab MakeMyLunchCommand adalah berinteraksi dengan Kulkas dan Microwave. Jadi untuk mengujinya Anda bisa menggunakan Kulkas tiruan dan tiruan Microwave. [dua kerangka contoh mock adalah Mockito dan nMock atau lihat di sini .]
Dalam hal ini Anda akan melakukan sesuatu seperti kode pseudo berikut:
@Test
public void checkThatMakeMyLunchIsSuccessful() {
Fridge mockFridge = mock(Fridge);
Microwave mockMicrowave = mock(Microwave);
ICommand command = new MakeMyLunchCommand( mockFridge, mockMicrowave );
command.execute();
mockFramework.assertCalled( mockFridge.removeFood );
mockFramework.assertCalled( microwave.turnon );
}
Purist mengatakan uji tanggung jawab kelas Anda - interaksinya dengan kelas lain (apakah perintah membuka kulkas dan menyalakan microwave?).
Pragmatis itu mengatakan tes untuk sekelompok kelas dan tes untuk hasilnya (apakah makan siang Anda siap?).
Temukan keseimbangan yang tepat yang berfungsi untuk sistem Anda.
(Catatan: pertimbangkan bahwa mungkin Anda tiba di struktur antarmuka terlalu dini. Mungkin Anda dapat membiarkan ini berkembang saat Anda menulis pengujian dan implementasi unit Anda, dan pada langkah # 3 Anda "memperhatikan" peluang antarmuka umum).