Unit Menguji Proyek Game C # / XNA

13

Saya telah menekunkan dalam pengembangan game sejak saya mulai pemrograman, tetapi tidak pernah sangat serius. Saya bekerja sebagai pengembang aplikasi bisnis, tetapi saya sedang mengerjakan beberapa game di waktu luang saya.

Dalam dunia bisnis (pada tumpukan web-dev Microsft) ASP.NET MVC menjadi sangat populer, karena kemudahan unit-testing cara antarmuka bekerja.

Saya bertanya-tanya apa pola desain (MVC, MVP, MVVM, dll) yang bisa digunakan untuk menulis game di mana semua logika game mudah diuji unit. Apakah ini mungkin atau layak? Apakah saya membuang-buang waktu, apakah lebih baik melakukan build penuh dan kemudian menjalankan tes tipe "integrasi" daripada tes unit?

Kode contoh akan bagus, tetapi penulisan juga berguna.

(Saya mencoba menambahkan tag unit-testing, tetapi tidak membutuhkan perwakilan ...)

Nate
sumber

Jawaban:

17

Berikut adalah artikel bagus yang saya temukan yang menggambarkan arsitektur untuk memisahkan fungsionalitas agar tidak hanya mudah digunakan kembali, tetapi juga berpotensi jauh lebih mudah untuk unit-test:

http://cowboyprogramming.com/2007/01/05/evolve-your-heirachy/

Beberapa game akan mendapat manfaat dari pola seperti MVC. Permainan papan seperti permainan catur dan kartu muncul di benak Anda. Dalam kebanyakan kasus, bagaimanapun, ini adalah pembunuhan besar-besaran.

Secara pribadi saya merasa cukup untuk hanya unit-test hal-hal yang bersifat algoritmik. Hal-hal yang Anda akan bergantung pada "hanya bekerja" ketika Anda sedang menulis kode gameplay, dan bisa sangat sulit untuk melacak masalah, jika tidak. Hal-hal seperti tes persimpangan atau kode jaringan.

(Hal-hal yang idealnya akan dibangun menjadi kerangka kerja pihak ke-3 sehingga Anda tidak perlu menulis atau mengujinya!)

Salah satu teknik yang saya suka gunakan untuk pengujian unit hal-hal yang berhubungan dengan permainan adalah apa yang saya sebut "uji unit visual". Konsep dasar menjadi rendering baris sederhana dari kode yang dimaksud (misalnya, misalnya fungsi persimpangan), dan beberapa tugas kunci atau mouse dasar untuk memanipulasi input. Tidak ada yang mengatakan tes unit harus otomatis - mereka hanya perlu memecah hal-hal menjadi unit individu dan mengujinya.

Andrew Russell
sumber
Jawaban yang bagus. Saya juga ingin memposting artikel itu dengan tepat. Sistem komponen Game Object adalah cara yang bagus untuk memisahkan logika dan dapat menguji unit ini secara individual. Apa yang tidak bisa dilakukan oleh pengujian unit, adalah interaksi kompleks dari beberapa jalur logika permainan yang berinteraksi secara realtime dalam urutan acak. Itu seperti mencoba menguji unit ramalan cuaca. :)
LearnCocos2D
Ya saya juga membuat penguji kecil yang mengisolasi bit fungsionalitas tertentu. Saya memastikan perubahan apa pun yang saya buat pada API dll. Saya selalu memastikan ini masih berfungsi. Jauh lebih mudah untuk menggunakan kembali fungsionalitas dalam proyek Anda berikutnya.
Iain
3
Ya, jawaban yang bagus, dan saya suka tautannya. Dan saya setuju dengan semuanya hingga baris terakhir, "Tidak ada yang mengatakan tes unit harus otomatis". :) Harus , mungkin tidak - tetapi semua yang saya baca menyiratkan (atau mengatakan langsung) bahwa tes unit harus otomatis , ke titik di mana Anda hanya menekan satu tombol untuk menjalankan semua tes Anda. Jika tidak, semakin banyak pekerjaan yang terlibat dalam menjalankan tes, semakin kecil kemungkinan Anda menjalankannya cukup sering. Memang, jika Anda berbicara tentang kode tampilan , mungkin lebih sulit untuk unit-test, jika mungkin.
Cyclops
Hampir empat tahun berlalu, dan saya merasa telah mengembangkan pemahaman yang lebih baik tentang mengapa "tes unit visual" bekerja dengan sangat baik: Tes unit adalah alat pengembangan. Tes unit otomatis yang khas dapat memberi tahu Anda bahwa ada sesuatu yang rusak. Tetapi uji unit visual dapat memungkinkan Anda menjelajahi algoritma yang sangat rumit dan membantu Anda dengan cepat mengidentifikasi mengapa ada sesuatu yang rusak (terutama bila dikombinasikan dengan pengeditan kode langsung). Seringkali tes visual dapat mengidentifikasi masalah yang Anda harus antisipasi untuk menguji dengan kode, atau masalah di mana tidak ada jawaban "benar" (misalnya: penyetelan).
Andrew Russell
Dan gagasan bahwa tes unit perlu dijalankan "cukup sering" (seperti dalam: selalu, dengan cara otomatis) adalah palsu. Kode yang tidak berubah jelas tidak perlu diuji ulang. Dan ketika kode yang dimodifikasi, pengembang melakukan modifikasi harus melakukannya sambil memanfaatkan tes yang tersedia yang sesuai (visual, kode-based atau sebaliknya). Jelas ada kode dengan profil risiko tertentu di mana tes otomatis adalah investasi waktu yang berharga. Tapi skenario seperti itu sangat jarang dalam pengembangan game.
Andrew Russell