Comment feriez-vous des tests unitaires ou effectuer les tests automatisés les plus efficaces sur le code graphique pour OpenGL?

17

J'écris un jeu et le moteur graphique qui l'accompagne au-dessus d'OpenGL en C ++. Je suis également fan de bons processus de codage et de tests automatisés. Le code graphique + les tests semblent assez immiscibles, car la sortie est souvent visuelle uniquement ou très fortement orientée visuellement.

Par exemple, imaginez-vous analyser le flux d'image brut qui est rendu à l'écran octet par octet - vous avez besoin de données de test avec lesquelles comparer, ce qui est difficile à créer / obtenir, et souvent les images rendues ne sont pas identiques sur un niveau d'octet lors de l'exécution à des moments différents - de petits changements dans les algorithmes vont complètement détruire cette approche.

Je pense à créer une suite de tests unitaires visuels, dans laquelle je peux essentiellement rendre différentes scènes de test, montrant des choses comme la cartographie des ombres, l'animation, etc., etc. etc. Dans le cadre de CI, ces scènes seraient ensuite rendues en vidéo fichier (ou éventuellement le laisser comme un exécutable) avec différentes métriques. Cela nécessiterait toujours une inspection manuelle du fichier vidéo, mais au moins il serait quelque peu automatisé et normalisé.

Qu'est-ce que tu penses? J'espère qu'il y a de meilleures façons?

Max
la source
2
C'est une bonne question, je me demande si vous obtiendriez de meilleures réponses sur gamedev.stackexchange.com car il pourrait y avoir plus de gens qui ont traité cela auparavant.
FrustratedWithFormsDesigner
3
Puisque vous utilisez OpenGL, envisagez d'étudier la façon dont le groupe Khronos effectue des tests de conformité pour cette API. Des collègues de mon ancien projet qui s'en sont occupés m'ont dit que les tests graphiques de Khronos étaient aussi parfaits que possible
gnat
@FrustratedWithFormsDesigner Merci, j'ai complètement oublié gamedev.stackexchange ... J'ai cherché les programmeurs de manière assez approfondie, mais pas celle-là. Il semble que la plupart des réponses aux tests unitaires se concentrent sur les choses généralement testées, alors ce n'est peut-être pas un doublon. Je vais vérifier un peu plus, merci :)
Max

Réponses:

8

La bibliothèque de traitement d'image opencv le fait en enregistrant l'image et en la comparant à une image de référence - elle a un tas de fonctions de test c ++ et de macros pour gérer la correspondance approximative de l'image, etc.

Martin Beckett
la source
J'essaierai de le vérifier plus en profondeur moi-même, mais cette page ne dit rien sur la correspondance d'image approximative. Savez-vous si cela fonctionnerait pour les tests de régression dans le cas de la comparaison de trames? Ensuite, j'ai pu inspecter visuellement la première fois qu'une scène est rendue, notez-la comme référence, etc. OpenCV a-t-il des fonctions prêtes pour cela que je pourrais utiliser? : p
Max
@max généralement, il existe une version «or» de la fonction de test qui génère le cadre de référence et est exécutée une fois lors de la création du test. Dans la distribution, il y a quelques macros "comparer l'image de test". Je ne pense pas qu'il y ait quelque chose de spécifique pour relire les tampons openGL à une image mais c'est assez facile
Martin Beckett
4

Votre infrastructure de test peut rendre son image de test dans un tampon, récupérer l'image rendue et la comparer à une image de référence "dorée" qui a été précédemment générée à cet effet.

Cela ne fonctionnera pas aussi bien dans les cas où les résultats de votre test ne devraient pas rester exactement les mêmes. Cependant, vous pouvez calculer la différence au carré des images de test et de référence et la comparer à un seuil.

Vous pouvez également prévoir la journalisation et la vérification des données de performances, car une régression majeure des performances est un autre mode d'échec possible.

tempête à venir
la source
4

Même si vous ne pouvez pas comparer les images de sortie, au moins vous pourrez tester que vos rendus se terminent correctement (pas de plantage, de longues attentes, etc.). Bien sûr, il est préférable de trouver un moyen de vérifier les images, mais même sans cela, vous aurez tiré quelque chose des tests.

Michael Kohne
la source
2
Exactement: j'étais sur le point de répondre à quelque chose de similaire ("Même si vous avez un test unitaire qui génère aveuglément le fichier vidéo et fait des tests triviaux (par exemple, a la bonne longueur, pas complètement noir, pas complètement blanc), cela pourrait être suffisant pour attraper de nombreuses erreurs de régression. Surtout celles qui font simplement que vos fonctions lèvent une exception. ") mais il n'y a pas besoin d'une deuxième réponse similaire, donc je laisse juste un commentaire ici.
user281377