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