我该如何为一个图形库编写测试?

13

我正在使用Python编写一个OpenGL 2D库。目前一切顺利,代码库在稳步增长。

现在我想编写单元测试,以避免在修复错误/添加新功能时不小心引入新的漏洞。但是我不知道如何在图形库中实现单元测试。

我考虑了一些事情:

  • 创建参考屏幕截图并将其与测试中自动生成的屏幕截图进行比较
  • 使用日志记录替换OpenGL调用,并进行比较

但两种方法都似乎不太好。测试图形库的通常方法是什么?


你提出的两个建议对我来说很有道理,只要你确信存在真实的结果可以进行比较。 - lhf
2个回答

6
我在过去进行组件级别测试时所使用的方法是:
  • 使用统一颜色的背景,加上几种不同的颜色。
  • 在测试中使用统一颜色的矩形作为图形对象(使用几种不同的颜色)。
  • 将矩形放置在已知位置上,通过自己计算它们在图像中的投影位置。
  • 计算每个像素的每个通道(背景、前景或混合物)的预期强度。
  • 如果您有一个导致非圆形位置的测试场景,请使用非精确比较(例如相关性)。
  • 使用计算来创建预期结果图像。
  • 将输出图像与预期结果图像进行比较。
  • 如果您有模糊效果,请比较强度总和而不是离散强度。
正如 Graham 所述,内部单元可以无需图形调用进行单元测试。

那些是验收测试,它们很重要,但正如Graham Reeds在另一个答案中所说,你还需要单元测试。 - Radomir Dopieralski
这些不是验收测试,这些测试测试单个组件,并根据被测试单元的定义是集成测试或单元测试。如果图形算法是在着色器或OPENGL / DirectX代码中编写的,则该代码无法与图形渲染过程分开测试,这是“单元”测试的唯一方法。 - Danny Varod
@RadomirDopieralski 接受测试将确保您能够看到某些内容,但不会考虑 精确位置白盒子流程、每种 像素格式 的影响以及过滤效果等。系统测试已包括图形引擎上方的应用程序。 - Danny Varod

2

更进一步细分。

生成图形的调用将依赖于算法 - 测试算法。


实际上,在我的情况下,这只有一半是真的。尽管几乎具备所有基本功能,但我只使用一个算法(在对批处理渲染中的精灵进行排序时)和一些像单例模式之类的东西。几乎所有其他代码都是直接调用OpenGL函数。 - orlp
单例模式很糟糕!我曾经工作的一个合同中使用了近十个单例。这让测试成为一场噩梦。在C++中,我们创建了几个模板函数,允许您引入虚假或真实的记录器等,以使测试成为可能。不知道在Python中是否可以这样做。 - graham.reeds

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接