这是我进入单元测试世界的第一步,所以请耐心等待。我正在编写一个 Qt 4.8.1 C++ 程序,作为测试框架,我正在使用集成的 QTestLib。我应该测试一个从基础类继承而来的类,它加载某个 XML 文件以便稍后使用一个函数读取和解析它,该函数将返回一个 C++ 类对象,其中包含我可以通过 set/get 函数检索和设置的 xml 值。构造函数中的类实例化一个 QFile 对象,在 readXml 函数中我用它来解析 QXmlStreamReader 文件。使用单元测试测试所有此类的最佳方法是什么?我不知道如何绕过文件读取操作来注入(inject)代表文件内容的自己的字符串。或者我应该使用不同的临时 XML 文件作为测试内容吗?
最佳答案
注入(inject)一个字符串来表示文件内容似乎是测试此类的最直接方法。但是,在类构造函数中直接实例化 QFile
实例会使这成为不可能(换句话说,不可能 inject your dependency )。此外,创建 QFile
的“假”或“模拟”版本(又名 QFile
的 Test 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/