这是我进行单元测试的第一步,请耐心等待。我正在编写Qt 4.8.1 C ++程序,作为测试框架,我正在使用集成的QTestLib。我应该测试一个从基本类中进入的类,然后加载某个XML文件来读取并稍后使用一个函数解析它,该函数将返回一个C ++类对象,其中包含我可以通过set / get函数检索和设置的xml值。构造函数中的类实例化一个QFile对象,在readXml函数中我使用它来解析QXmlStreamReader文件。用单元测试测试所有这个类的最佳方法是什么?我不知道如何绕过文件读取操作来注入表示文件内容的自己的字符串。或者我应该使用不同的ad-hoc XML文件作为测试内容吗?
答案 0 :(得分:2)
注入一个字符串来表示文件内容似乎是测试类这种类的最直接的方法。但是,在类构造函数中直接实例化QFile
实例会使这变得不可能(换句话说,inject your dependency}是不可能的。此外,创建QFile
的“假”或“模拟”版本(a.k.a。QFile
的{{3}})是相当多的工作。
解决此问题的最简单方法是将QIODevice
传递给您的类构造函数(QFile
继承自QIODevice
)。在单元测试中,您可以通过传入包含您要测试的内容的QIODevice
来伪造文件的内容。在这种情况下,您可以使用Test Double来完成此操作,这允许您任意设置其内容。因此,您的班级会喜欢以下内容:
class MyXmlParser
{
MyXmlParser(QIODevice* device);
...
};
您的单元测试使用QBuffer
构建类;您的生产代码使用QFile
构建它。
我应该在测试中使用真正的XML文件吗?
一般来说,单元测试具有的外部依赖性越多,确保它在未来不会中断的成本就越高(它可能使您的单元测试QBuffer)。因此,建议避免使用真正的XML文件,以确保您的测试是自包含的。而且,传入一个真正的XML意味着你现在隐式地测试QFile以及你的XML解析器(换句话说,它不再是单元测试,它是一个集成测试)。您通常可以假设您传递到解析器的IO设备有效;您只需要验证解析器是否正确使用IO设备,并且它可以正确解析XML。
请仔细阅读xunitpatterns.com上的资料,特别是关于sensitive to its context的部分。