【问题标题】:How do I write tests for a graphics library?如何为图形库编写测试?
【发布时间】:2012-01-25 09:24:40
【问题描述】:

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

现在我想编写单元测试,这样我就不会在修复其他错误/开发新功能时意外引入新错误。但我不知道这些将如何与图形库一起使用。

我想到的一些事情:

  • 制作参考屏幕截图并将其与测试中自动生成的屏幕截图进行比较
  • 用日志语句替换 opengl 调用并比较日志

但两者似乎都是个坏主意。测试图形库的常用方法是什么?

【问题讨论】:

  • 你建议的两件事对我来说很有意义,只要你确定有真实的结果可以比较。

标签: unit-testing graphics integration-testing


【解决方案1】:

我过去用于组件级测试的方法是:

  • 使用统一的彩色背景,并带有几种不同的颜色。
  • 在测试中使用统一颜色的矩形作为图形对象(使用几种不同的颜色)。
  • 将矩形放置在您可以自行计算其在图像中的投影位置的已知位置。
  • 计算每个像素(背景、前景或混合)的每个通道的预期强度。
  • 如果您的测试场景导致位置不完整,请使用不准确的比较(例如相关性)
  • 使用计算创建预期结果图像。
  • 将输出图像与预期结果图像进行比较。
  • 如果您有模糊效果,请比较强度总和而不是离散强度。

正如 graham 所说,内部单元可以在没有图形调用的情况下进行单元测试。

【讨论】:

  • 这些是验收测试,它们很重要,但正如 Graham Reeds 在另一个答案中所说,您还需要单元测试。
  • 这些不是验收测试,这些测试测试单个组件并且是集成测试或单元测试,具体取决于被测单元的定义。如果图形算法是在着色器或 OPENGL/DirectX 代码中编写的,那么代码并不总是可独立于图形渲染过程进行测试,这是“单元”测试它的唯一方法。
  • @RadomirDopieralski 验收测试是为了确保您可以看到一些东西,并且不会考虑确切位置白盒流程,每一个像素格式的类型,滤镜效果的影响等。系统测试已经包括图形引擎之上的应用程序。
【解决方案2】:

进一步分解。

制作图形的调用将依赖于算法 - 测试算法。

【讨论】:

  • 实际上,就我而言,这只是对了一半。尽管拥有几乎所有基本功能,但我只使用一种算法(在批量渲染的精灵排序中)和一些类似单例模​​式的东西。几乎所有其他代码都可以直接让 OpenGL 调用访问。
  • 单身人士是邪恶的!我工作的一份合同使用了近十几个。使测试成为一场噩梦。在 C++ 中,我们创建了几个模板化函数,允许您引入假的或真实的记录器等,使测试成为可能。不知道你是否可以在 Python 中做到这一点。
猜你喜欢
  • 2015-09-11
  • 2019-04-21
  • 1970-01-01
  • 1970-01-01
  • 2018-05-10
  • 2021-07-28
  • 2010-11-16
  • 2021-12-18
  • 2020-12-22
相关资源
最近更新 更多