Apakah praktis menggunakan kerangka pengujian seperti JUnit dalam situasi pengembangan game? Pertimbangan desain seperti apa yang bisa Anda ikuti untuk membuat game Anda lebih teruji? Bagian mana dari sebuah game yang dapat / harus diuji dan bagian mana yang harus / harus diserahkan kepada pengujian manusia?
Misalnya, jika loop game diringkas dalam satu fungsi, sepertinya akan sangat sulit untuk menguji. Saya suka menolak fungsi "pembaruan" yang membutuhkan waktu dan mengubah logika permainan; ini memungkinkan beberapa trik menarik seperti kemampuan untuk memperlambat gim dengan memberi makan delta palsu, waktu yang lebih lambat.
architecture
unit-testing
Ricket
sumber
sumber
Jawaban:
Salah satu prinsip TDD adalah Anda membiarkan TDD dalam beberapa kasus memengaruhi desain Anda. Anda menulis tes untuk sistem, kemudian menulis kode untuk membuat lulus tes itu, menjaga dependensi sedangkal mungkin.
Bagi saya, hanya ada dua hal yang tidak saya uji sebagai bagian dari pengujian unit:
Pertama, saya tidak menguji elemen visual dan bagaimana tampilannya. Saya mengujinya dan objek akan berada di tempat yang tepat setelah pembaruan, bahwa kamera akan menyisihkan objek di luar batasnya, bahwa transformasi (setidaknya yang dilakukan di luar shaders) dilakukan dengan benar sebelum diserahkan ke mesin grafis , tetapi begitu menyentuh sistem grafis saya menarik garis. Saya tidak suka mencoba mengejek hal-hal seperti DirectX.
Kedua, saya tidak benar-benar menguji fungsi loop game utama. Saya menguji bahwa setiap sistem akan bekerja ketika melewati delta yang masuk akal, dan bahwa sistem bekerja bersama dengan benar ketika mereka perlu. Lalu saya baru saja memperbarui setiap sistem dengan delta yang benar di loop game. Saya benar-benar dapat memiliki tes untuk menunjukkan bahwa setiap sistem dipanggil dengan delta yang benar, tetapi dalam banyak kasus saya menemukan bahwa pembunuhan berlebihan (kecuali jika Anda melakukan logika kompleks untuk mendapatkan delta Anda, maka itu tidak berlebihan).
sumber
Noel Llopis telah membahas pengujian unit sampai tingkat yang saya yakin Anda cari:
Sehubungan dengan pengujian seluruh loop game, ada teknik lain untuk mencegah regresi fungsional dalam kode Anda. Idenya adalah membuat gim Anda bermain sendiri melalui sistem replay (mis. Pertama-tama merekam input pemain, dan kemudian memutar ulangnya dalam jangka yang berbeda). Selama pemutaran ulang, Anda menghasilkan potret keadaan setiap objek untuk setiap bingkai. Koleksi negara ini kemudian dapat disebut "gambar emas". Saat refactoring kode Anda, Anda menjalankan replay lagi dan membandingkan masing-masing keadaan frame dengan keadaan gambar emas. Jika berbeda, tes gagal.
Meskipun manfaat dari teknik ini jelas, ada beberapa hal yang perlu Anda perhatikan:
sumber
Saya setuju dengan komentar Jeff dan jpaver. Saya juga ingin menambahkan bahwa mengadopsi model komponen untuk arsitektur Anda sangat meningkatkan testabilitasnya. Dengan model komponen, setiap komponen harus melakukan satu unit kerja dan harus dapat diuji secara terpisah (atau dengan benda tiruan terbatas).
Demikian juga, bagian lain dari gim yang mengandalkan entitas seharusnya hanya mengandalkan subset komponen yang berfungsi. Dalam praktiknya ini berarti Anda biasanya dapat mengejek beberapa komponen palsu untuk memfasilitasi pengujian area ini atau Anda dapat dengan mudah membuat entitas parsial untuk tujuan pengujian. misalnya Anda meninggalkan komponen rendering dan input karena komponen tersebut tidak diperlukan untuk menguji fisika.
Akhirnya, saya akan mengabaikan saran seputar kinerja yang Anda dapatkan dari beberapa orang di komunitas game tentang antarmuka. Tulis kode dengan baik dengan antarmuka dan jika Anda mengalami masalah kinerja di jalan Anda dapat dengan mudah profil, mengidentifikasi, dan refactor untuk menyelesaikan masalah. Saya tidak dibujuk oleh kekhawatiran Noel tentang dampak kinerja antarmuka atau overhead kompleksitas yang mereka tambahkan.
Yang mengatakan, jangan berlebihan mencoba untuk menguji setiap hal kecil secara mandiri. Seperti kebanyakan hal pengujian dan desain adalah tentang keseimbangan yang tepat.
sumber
Saya pikir saya akan menambahkan jawaban kedua menanggapi komentar OP bahwa pengguna dapat mengganti tes unit. Saya percaya itu sepenuhnya salah karena tujuan unit test bukan untuk menjamin kualitas. Jika Anda ingin tes tersedia untuk memastikan kualitas program Anda, Anda harus menyelidiki tes skenario atau berinvestasi dalam pemantauan yang baik.
(Dengan pemantauan dan produk yang berjalan sebagai layanan, memang mungkin untuk mendorong "pengujian" ke pelanggan tetapi Anda harus memiliki sistem canggih yang mendeteksi kesalahan dengan cepat dan mengembalikan perubahan yang bertanggung jawab. Kemungkinan besar ini terlalu banyak untuk tim pengembangan kecil.)
Manfaat utama pengujian unit adalah bahwa mereka memaksa pengembang untuk menulis kode yang dirancang lebih baik. Tindakan pengujian menantang pengembang untuk memisahkan masalah dan merangkum data. Ini juga mendorong pengembang untuk menggunakan antarmuka dan abstraksi lain sehingga ia hanya menguji satu hal.
sumber