Bagaimana Anda menguji unit atau melakukan pengujian otomatis paling efektif pada kode grafis untuk OpenGL?

17

Saya sedang menulis game dan mesin grafis yang menyertainya di atas OpenGL di C ++. Saya juga penggemar proses pengkodean yang baik dan pengujian otomatis. Pengujian kode grafis + kelihatannya tidak dapat ditawar-tawar lagi, karena output seringkali hanya berupa visual, atau sangat berorientasi visual.

Misalnya, bayangkan menganalisis aliran gambar mentah yang dirender ke layar byte-by-byte - Anda perlu data uji untuk dibandingkan, yang sulit dibuat / diperoleh, dan seringkali gambar yang diberikan tidak identik pada suatu tingkat byte saat dijalankan pada waktu yang berbeda - perubahan kecil dalam algoritma akan merusak pendekatan ini sepenuhnya.

Saya sedang berpikir untuk membuat unit-test suite visual, di mana saya pada dasarnya dapat membuat adegan tes yang berbeda, menunjukkan hal-hal seperti pemetaan bayangan, animasi, dll. Dll. Sebagai bagian dari CI, adegan ini kemudian akan dirender menjadi video file (atau mungkin membiarkannya sebagai executable) dengan berbagai metrik. Ini masih membutuhkan pemeriksaan manual dari file video, tetapi setidaknya itu akan menjadi agak otomatis dan standar.

Bagaimana menurut anda? Saya berharap ada cara yang lebih baik?

Maks
sumber
2
Ini adalah pertanyaan yang bagus, saya ingin tahu apakah Anda akan mendapatkan jawaban yang lebih baik di gamedev.stackexchange.com karena mungkin ada lebih banyak orang di sana yang pernah berurusan dengan ini sebelumnya.
FrustratedWithFormsDesigner
3
Karena Anda menggunakan OpenGL, pertimbangkan mempelajari cara grup Khronos melakukan pengujian kesesuaian untuk API ini. Rekan kerja di mantan proyek saya yang menanganinya memberi tahu saya bahwa pengujian grafis Khronos sudah mendekati sempurna
agas
@FrustratedWithFormsDesigner Terima kasih, saya benar-benar lupa tentang gamedev.stackexchange ... Saya mencari programmer dengan sangat teliti, tapi tidak yang itu. Tampaknya sebagian besar jawaban pada pengujian unit di sana berfokus pada hal-hal yang biasanya diuji, jadi mungkin ini bukan duplikat. Akan memeriksa lebih banyak, terima kasih :)
Max

Jawaban:

8

Pustaka pemrosesan gambar terbuka melakukannya dengan menyimpan gambar dan membandingkannya dengan gambar referensi - ia memiliki banyak fungsi uji c ++ dan makro untuk menangani perkiraan pencocokan gambar dll.

Martin Beckett
sumber
Saya akan mencoba memeriksanya lebih dalam lagi, tetapi halaman itu tidak mengatakan apa-apa tentang perkiraan pencocokan gambar. Apakah Anda tahu apakah itu akan berhasil untuk pengujian regresi dalam hal membandingkan frame? Lalu saya bisa secara visual memeriksa saat adegan pertama kali dibuat, perhatikan sebagai referensi seterusnya. Apakah OpenCV memiliki fungsi siap untuk ini yang dapat saya gunakan? : p
Max
@ Max umumnya ada versi 'emas' dari fungsi tes yang menghasilkan bingkai referensi dan dijalankan sekali saat membuat tes. Dalam distribusi ada beberapa makro "uji perbandingan gambar". Saya tidak berpikir ada sesuatu yang spesifik untuk membaca kembali buffer OpenGL ke gambar tapi itu cukup mudah
Martin Beckett
4

Kerangka uji Anda dapat merender gambar uji ke dalam buffer, mengambil gambar yang diberikan, dan membandingkannya dengan gambar referensi "emas" yang sebelumnya telah dibuat untuk tujuan itu.

Ini tidak akan bekerja dengan baik untuk kasus-kasus di mana hasil tes Anda tidak diharapkan tetap sama persis . Namun, Anda dapat menghitung perbedaan kuadrat dari gambar tes dan referensi, dan membandingkannya dengan ambang batas.

Anda mungkin juga ingin menyediakan untuk logging dan memeriksa data kinerja, karena regresi utama dalam kinerja adalah mode kegagalan lain yang mungkin.

datang badai
sumber
4

Bahkan jika Anda tidak dapat membandingkan gambar output, setidaknya Anda akan dapat menguji apakah render Anda lengkap dengan benar (tidak ada crash, menunggu lama, dll, dll). Menemukan cara untuk memeriksa gambar lebih baik, tentu saja, tetapi bahkan tanpa itu Anda akan mendapatkan sesuatu dari tes.

Michael Kohne
sumber
2
Tepat: Saya akan menjawab sesuatu yang serupa ("Bahkan jika Anda memiliki unit test yang secara membabi buta menghasilkan file video dan melakukan beberapa tes sepele (mis. Memiliki panjang yang tepat, tidak sepenuhnya hitam, tidak sepenuhnya putih), mungkin sudah cukup untuk menangkap banyak kesalahan regresi. Terutama yang hanya menyebabkan fungsi Anda melempar pengecualian. ") tetapi tidak perlu untuk jawaban serupa yang kedua, jadi saya meninggalkannya hanya sebagai komentar di sini.
user281377