【问题标题】:OpenGL How to unit test?OpenGL 如何进行单元测试?
【发布时间】:2011-07-13 08:43:40
【问题描述】:

有没有使用 OpenGL 命令对函数或类进行单元测试的好方法?

对于 c++,我知道我可以将类设为模板并传递一个直接调用 opengl 的类:

namespace myNamespace
{
struct RealOpenglCall
{
  static inline void glVertex2fv( const GLfloat * v)
  { ::glVertex2fv( v ); }
};

template< typename T >
class SomeRendering
{
  public:
    SomeRendering() : v()
    {
      // set v
    }
    void Draw()
    {
      T::glVertex2fv(v);
    }
    GLfloat v[4];
};

}

在 C 和 c++ 中,我可以将函数指针传递给调用 opengl 函数的函数(然后用于单元测试,将指针传递给模拟函数)。

我还可以链接到不同的库(而不是 opengl),但这听起来很复杂。

那么,还有哪些其他技术可以对调用 opengl 函数的代码进行单元测试?

【问题讨论】:

    标签: c++ c unit-testing opengl


    【解决方案1】:

    这是我不久前学到的一个不错的技巧。您可以使用常规的旧#defines 来模拟各种 API 函数:

    #ifdef _test_
    #define glVertex3f(x,y,z)  (mockGlVertex3f((x),(y),(z)))
    ...
    #endif
    

    使用已配置的预处理器。根本不需要改变你的绘图功能。进一步:您可以实现mockGlVertex3f,例如检查参数或计算对其的调用次数,然后可以检查。

    【讨论】:

    • 您可以使用单元测试数据并让模拟函数转储该数据进行比较,如果它与预期输出匹配则通过单元测试。
    • @datenwolf 那么这不是单元测试,因为它需要读取磁盘并访问真实数据。这会减慢单元测试的速度
    • @VJo:您如何区分真实数据和测试数据?结果也可以转储到内存中。
    • @datenwolf: "how do you distinct between real and testing data?":调用者通过定义_test_ 来决定这一点,然后调用提供他喜欢的任何数据的函数。数据将由例如处理mockGlVertex3f() 可以随心所欲地使用它。
    • 没错。并且无需加载任何东西。您可以(例如)设置一些简单的 int 计数器来计算对该函数的调用次数并打印到 std::stringstream
    猜你喜欢
    • 1970-01-01
    • 2012-01-08
    • 2019-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-30
    • 2013-01-21
    • 2019-01-05
    相关资源
    最近更新 更多