如何对渲染输出进行单元测试?


19

我最近一直在接受测试驱动开发(TDD),它对我的​​开发输出和代码库的弹性产生了出色的影响。我想将此方法扩展到我在OpenGL中所做的一些渲染工作,但是我一直找不到任何好的方法。

我将从一个具体的例子开始,以便我们知道我想测试什么类型的东西;可以说,我想创建一个绕某个轴旋转的单位立方体,并且要确保对于一定数量的帧,每个帧都可以正确渲染。

我如何为此创建一个自动化测试用例?最好,我什至能够编写一个测试用例,然后再编写任何代码以呈现多维数据集(按照常规的TDD惯例。)除其他外,我想确保多维数据集的大小,位置和方向是在每个渲染帧中正确。我什至可能要确保着色器中的光照方程在每帧中都是正确的。

我遇到的唯一对此有用的远程方法是将渲染的输出与参考输出进行比较,这通常会妨碍TDD的实践,而且非常麻烦。

我可以继续执行其他所需的要求,但恐怕我已经列出的要求已无法实现。


3
整个问题在于,您的测试用例取决于良好的输出;但是,如果该输出有错误(假阳性),会发生什么?无论哪种方式,我都将首先检查线框。然后转到前向渲染的场景,最后推迟(如果使用的话)。您可以对整个图像进行XOR运算,以进行快速比较(完全通过黑色)。GPU确实是应用TDD的一个坏地方。但是,如果您想出一些聪明的事,我很想知道。
乔纳森·迪金森

我怀疑我不会得到我希望得到的答案,但是我仍然希望有一些好的想法。黑关的好主意。测试深度缓冲区也可能会有所帮助。
notlesh 2012年


@Adam感谢您的分享。不幸的是,它的方式是遥不可及像我这样的移动游戏上的工作有一个独立的:)它也没有我的大多数基本要求。
notlesh 2012年

@Adam,您一定要“ answerize”该链接。相当新颖。
乔纳森·迪金森

Answers:


8

这似乎是批准测试框架的一个很好的应用程序或类似的东西。

如评论中所述,如果您碰巧批准了不良的输出,您仍然会遇到误报的问题,但这至少会告诉您何时输出发生了显着变化。

由于您使用的是OpenGL,因此我假设批准不会直接为您服务,但是这个想法很合理。只需检查文件哈希,如果它不同,则在适当的差异查看器(如图像差异程序)中显示失败。如果您批准新版本,请更新“已批准”文件以匹配新结果。


那是一个有趣的工具。如果您在上面的评论中使用了Adam链接中的测试场之类的东西,并且应用了这样的集成批准机制,那么您可能会开始采用开销非常低的方法。感谢分享!
notlesh 2012年

批准测试不是自动测试。
zwcloud

@zwcloud:你是什么意思?就像任何测试一样,创作后即自动完成。只是第一次批准是创作过程的一部分。
John Gietzen '18

@JohnGietzen我无法从您的回答中了解这一点。我认为您应该更明确地阐明批准测试的概念。更新答案后,我将删除下注。
zwcloud

6

我不从事游戏业务,因此请承担任何潜在的愚蠢和天真的感觉

对我来说,编写比较完全渲染图像的测试不是真正的单元测试,而是完全集成测试,因为一切都必须工作正常才能成功进行测试。

那么在中间层可以检查一切正常的中间层呢?我想到两件事:

  1. 不要直接绘制,而是发出一个命令流,该命令流会变成渲染渲染。可以检查命令流的正确性。这不是端到端测试,但是您需要单元测试,而不是完全集成测试。

  2. 这确实是1.的变体。包装OpenGL,捕获所有调用,将其剥离为您真正要测试的内容,然后检查输出是否仍然匹配。如果配置正确,则OpenGL包装器可以自行进行检查,然后变成模拟程序


3

问题在于,不需要3d引擎逐位输出精确的图像。只要观察者看不到某些回旋,就可以容忍一些回旋。比预期深1%的纹理通常不是严重的问题...通常。在某些情况下,它可能是视觉伪像。这就是问题所在:很难判断是否需要进行自动测试,人工观看者会注意到哪些伪像,而哪些不是。尽管如此,当在非常简单的几何体上使用自动测试时,仍可以将其用于简单的完整性检查。

您可以做的是渲染一些简单的场景,然后将生成的图像与参考渲染进行比较。该参考渲染可能来自另一个图形引擎,也可能是来自同一引擎的早期屏幕截图(回归测试)。

如果在更改图形引擎后某些测试失败,则人工测试人员应将输出与参考图像进行比较,并自行判断新输出是否像以前一样好(或什至更好)。在这种情况下,应更改测试以与改进后的新输出进行比较。

您可以自动检查的另一件事是性能要求。这样的要求之一可能是,在自运行演示过程中(模拟游戏中的真实序列),帧频不得在测试系统上降至40 Fps以下。您可以自动进行测试。您无法测试的是渲染效果令人满意。但是您可以使用这样的测试来防止您的开发人员开发出看起来很棒但在任何可负担得起的系统上都无法正常运行的游戏,直到发布后好几年(您好Crytek)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.