这是我进入单元测试世界的第一步,所以请耐心等待。我正在编写一个Qt 4.8.1 C++程序,并使用集成的QTestLib作为测试框架。我应该测试一个类,它从一个基类开始加载某个XML文件,然后用一个函数读取和解析它,这个函数将返回一个C++类对象,其中包含我可以通过设置/获取函数检索和设置的XML值。构造函数中的类实例化了一个QFile对象,在readXml函数中,我使用它通过QXmlStreamReader解析文件。用单元测试测试所有类的最好方法是什么?我不明白如何绕过文件读取操作来注入表示文件内容的自己的字符串。或者我应该使用不同的即席XML文件作为测试内容?
发布于 2012-08-21 03:45:28
注入一个字符串来表示文件内容似乎是测试这样一个类的最直接的方法。然而,在类构造函数中直接实例化QFile实例使得这是不可能的(换句话说,它不可能inject your dependency)。此外,创建一个“假的”或“模拟的”版本的QFile (也就是。A Test Double of a 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的部分。
https://stackoverflow.com/questions/12030534
复制相似问题