c++ - 使用 QTestLib 编写单元测试

标签 c++ unit-testing qt4 qtestlib

这是我进入单元测试世界的第一步,所以请耐心等待。我正在编写一个 Qt 4.8.1 C++ 程序,作为测试框架,我正在使用集成的 QTestLib。我应该测试一个从基础类继承而来的类,它加载某个 XML 文件以便稍后使用一个函数读取和解析它,该函数将返回一个 C++ 类对象,其中包含我可以通过 set/get 函数检索和设置的 xml 值。构造函数中的类实例化一个 QFile 对象,在 readXml 函数中我用它来解析 QXmlStreamReader 文件。使用单元测试测试所有此类的最佳方法是什么?我不知道如何绕过文件读取操作来注入(inject)代表文件内容的自己的字符串。或者我应该使用不同的临时 XML 文件作为测试内容吗?

最佳答案

注入(inject)一个字符串来表示文件内容似乎是测试此类的最直接方法。但是,在类构造函数中直接实例化 QFile 实例会使这成为不可能(换句话说,不可能 inject your dependency )。此外,创建 QFile 的“假”或“模拟”版本(又名 QFileTest Double)需要大量工作。

解决此问题的最简单方法是将QIODevice 传递给您的类构造函数(QFile 继承自QIODevice)。在您的单元测试中,您可以通过传入一个包含您要测试的内容的 QIODevice 来伪造文件的内容。在这种情况下,您可以使用 QBuffer 来完成此操作,它允许您任意设置其内容。因此,您的类(class)需要如下内容:

class MyXmlParser
{
   MyXmlParser(QIODevice* device);

   ...
};

您的单元测试使用 QBuffer 构建类;您的生产代码使用 QFile 构造它。

我应该在测试中使用真实的 XML 文件吗?

一般来说,您的单元测试具有的外部依赖项越多,确保它在未来不会中断的成本就越高(它可能使您的单元测试成为 sensitive to its context )。因此,建议避免使用真实的 XML 文件以确保您的测试是独立的。此外,传入真实的 XML 意味着您现在正在隐式测试 QFile 以及您的 XML 解析器(换句话说,它不再是单元测试,而是集成测试)。您通常可以假设传递给解析器的 IO 设备可以正常工作;您只需要验证您的解析器是否正确使用了 IO 设备并且它可以正确解析 XML。

考虑通读 xunitpatterns.com 上的 Material ,尤其是关于 Test Smells 的部分.

关于c++ - 使用 QTestLib 编写单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12030534/

相关文章:

javascript - 使用 passport.js 和 express.js 进行单元测试登录

javascript - 使用 callFake() 测试 HttpClient 调用

qt4 - 如何从Qt4的QMenu中删除菜单项?

c++ - "this"指针在堆栈跟踪中损坏

c++ - 在其实例类方法中调用 QMainWindow 方法

c++ - 2 组独立的单选按钮,采用相同的 WINAPI 形式(无 MFC)

c++ - 将 char 缓冲区安全(独立于平台)到 std::string

c++ - 如何预先计算值数组?

django - 如何使用外键在 Django 中测试模型

c++ - c++ 17中现有类型的过度对齐