如何为依赖于操作系统的类编写测试

时间:2017-08-08 17:19:15

标签: c++ unit-testing testing

我编写了一个类,它枚举了操作系统的物理显示,检索了它们的信息和功能。我实际上想测试这个类是否正常工作并且通常包含(单元)测试。

但是,我不知道如何测试这个课程。抛开实现细节,基本上定义如下:

CopyTextureRegion

我将如何测试深度集成并依赖于操作系统和物理连接硬件的内容。我明白为这样的课程编写单元测试很困难,那么我有什么替代方案呢?

2 个答案:

答案 0 :(得分:1)

你应该对你的类进行单元测试,而不是os /外部库函数。

您可以添加一个允许模拟这些方法的外观图层。 (该图层不会由您的UT进行单元测试)。

类似的东西:

class IOsVideoModeRetriever
{
public:
     virtual ~IOsVideoModeRetriever() = default;
     virtual std::vector<VideoMode> RetrieveVideoModes(/*...*/) = 0;
     // ...
};

// CLass with implementation of OS specific functions
class OsVideoModeRetriever : public IOsVideoModeRetriever
{
public:
     std::vector<VideoMode> RetrieveVideoModes(/*...*/) override;
     // ...
};

// Class for UT
class OsVideoModeRetrieverMock : public IOsVideoModeRetriever
{
public:
     MOCK(RetrieveVideoModes(/*...*/)); // Mock according to your framework
     // ...
};

而你的另一课则使用类似的东西:

class Foo
{
public:
    explicit Foo(IOsVideoModeRetriever&);

private:
    IOsVideoModeRetriever& mOsVideoModeRetriever; // Or use `shared_ptr`
                                                  // depending of life time guaranty
};

现在您可以测试Foo

如果特定于操作系统的函数没有按预期运行(结果格式,处理限制,边缘情况......),那么确实会遇到问题,这应该仅限于实现部分而不是接口。 / p>

答案 1 :(得分:0)

第一步:不要单独测试与OS的接口,而不是代码的其余部分。那里有一些代码;不多,但有些。

创建一个更好的C ++接口与之对话的更低的API;它模仿了操作系统可能提供的C风格API,即使它是C ++类。

struct OSDisplayInterface {
  virtual ~OSDisplayInterface() {}
  virtual std::size_t GetDisplayName( char const* name, char const* adapter, char* name, std::size_t name_buf_len ) = 0;
  virtual bool IsDisplayPrimary( char const* name, char const* adapter ) = 0;
  virtual bool GetVideoModeCount( char const* name, char const* adapter, std::size_t* mode_count ) = 0;
  struct video_mode {
    int64 width, height, frequency;
  };
  virtual bool GetVideoMode( char const* name, char const* adapter, std::size_t n, video_mode* mode ) = 0;
};

或者直接与您的低级API匹配的内容。我们的想法是,如果操作系统的API出现故障,此代码应仅在真实情况下失败。

然后使用假的OS视频模式集测试您的C ++代码

如果你想更进一步,这基本上不在单元测试之外,但你可以测试上面的&#34; OS显示界面&#34;或直接针对操作系统测试您的课程。

但要做到这一点,您需要一堆不同的硬件配置。

从一组测试机器开始,您可以远程部署代码并获取结果。

将与代码库其余部分隔离的代码部署到这些计算机上。

每台机器上都有一个标识符。

为测试结果表构建一个机器标识符。

对此进行测试。确保在系统&#34; bob37&#34;上运行时,您可以获得正确的分辨率等。

然后,当操作系统升级命中并且不推荐使用API​​时,会立即出现红旗。 (当然,当新的驱动程序被修补以提供新的频率时,你也会得到红色标志)

单元测试工具查找机器标识符,运行代码并确认测试结果匹配。

自动将代码部署到所述计算机,以便您可以在代码更改的基础上在数十个硬件平台上运行测试。

这最好是在&#34;单元测试&#34;的边界。但是你可以想象正在将操作系统界面代码移植到新的操作系统,环境或硬件中,并遇到可能遇到的问题。