我编写了一个类,它枚举了操作系统的物理显示,检索了它们的信息和功能。我实际上想测试这个类是否正常工作并且通常包含(单元)测试。
但是,我不知道如何测试这个课程。抛开实现细节,基本上定义如下:
CopyTextureRegion
我将如何测试深度集成并依赖于操作系统和物理连接硬件的内容。我明白为这样的课程编写单元测试很困难,那么我有什么替代方案呢?
答案 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;的边界。但是你可以想象正在将操作系统界面代码移植到新的操作系统,环境或硬件中,并遇到可能遇到的问题。