Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenGL如何进行单元测试?_C++_C_Unit Testing_Opengl - Fatal编程技术网

C++ OpenGL如何进行单元测试?

C++ OpenGL如何进行单元测试?,c++,c,unit-testing,opengl,C++,C,Unit Testing,Opengl,有没有一种使用OpenGL命令对函数或类进行单元测试的好方法 对于C++,我知道我可以让类成为模板,并通过一个类进行直接OpenGL调用: namespace myNamespace { struct RealOpenglCall { static inline void glVertex2fv( const GLfloat * v) { ::glVertex2fv( v ); } }; template< typename T > class SomeRendering

有没有一种使用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];
};

}
名称空间myNamespace
{
结构RealOpenglCall
{
静态内嵌无效glVertex2fv(常量GLfloat*v)
{::glVertex2fv(v);}
};
模板
类渲染
{
公众:
SomeRendering():v()
{
//第五组
}
作废提款()
{
T::glVertex2fv(v);
}
glv[4];
};
}
在C和C++中,我可以将函数指针传递给调用OpenGL函数的函数(然后通过单元测试,将指针传递给模拟函数)。 我也可以链接不同的库(而不是opengl),但这听起来像是一个很大的复杂问题


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

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

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

使用已配置的预处理器。根本不需要更改绘图功能。进一步:您可以通过如下方式实现
mockGlVertex3f
,例如检查参数或统计调用它的次数,然后再进行检查。

您可以使用单元测试数据,并让模拟函数转储该数据进行比较,如果单元测试与预期输出匹配,则通过单元测试。@datenwolf则它不是单元测试,因为它需要读取磁盘和访问实际数据。这会减慢单位的速度testing@VJo:如何区分真实数据和测试数据?结果也可以转储到内存中。@datenwolf:
“如何区分真实数据和测试数据?”
:调用者通过定义
\u test\u
来决定这一点,然后调用提供他喜欢的任何数据的函数。数据将由例如
mockGlVertex3f()
处理,它可以处理您希望它做的任何事情。不需要加载任何东西。您可以(例如)设置一些简单的int计数器来计算对该函数的调用次数,并打印到std::stringstream