【问题标题】:Writing unit tests with QTestLib使用 QTestLib 编写单元测试
【发布时间】:2012-08-22 00:05:33
【问题描述】:

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

【问题讨论】:

    标签: c++ unit-testing qt4 qtestlib


    【解决方案1】:

    注入一个字符串来表示文件内容似乎是测试诸如此类的最直接的方法。然而,在你的类构造函数中直接实例化一个QFile 实例使得这不可能(换句话说,不可能inject your dependency)。此外,创建QFile 的“假”或“模拟”版本(也称为Test Double 的QFile)是相当多的工作。

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

    class MyXmlParser
    {
       MyXmlParser(QIODevice* device);
    
       ...
    };
    

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

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

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

    考虑阅读 xunitpatterns.com 上的材料,尤其是 Test Smells 上的部分。

    【讨论】:

    • 使用真正的 XML 文件进行测试会不会是个坏主意?我看到一些使用单元测试的程序有一个 Fixtures 文件夹,其中还有要测试的文件,例如 symfony 和 yaml 解析器组件
    • @Stefano 我已经扩展了我的答案以解决您的评论。
    猜你喜欢
    • 2012-08-20
    • 1970-01-01
    • 2011-05-12
    • 2014-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多