基于 Qt 的应用程序中使用的某些语义约定规定了应该并且不应构建单元测试的特定方式。尤其是:
- 许多 Qt 类都将父指针作为构造函数参数。并非为该参数指定的所有基本类型的子类对于任何给定的 Qt 类在语义上都是有效的。
- Qt 父对象拥有其子级的所有权,包括内存管理。这意味着父对象在子对象删除的同时也将其从自身删除了。
自动生成的测试用例的含义如下:
- 自动生成的测试会在堆栈上创建主要和次要测试对象。在大多数情况下,这将与上面的约定 #2 冲突,导致在测试用例执行期间出现内存错误,堆栈跟踪很可能指向析构函数的右括号。
- 在自动生成的测试中,C++test 将尝试将任何可用的子类类型用于基本类型的参数。在许多情况下,这将与上面的 #1 冲突。
- 如果测试需要定义 Qapplication 变量,则应将宏定义
- DCPPTEST_INIT_QT=1
添加到编译器选项中。要使用 Qt 控制台应用程序,请同时添加宏-DCPPTEST_INIT_QT_CONSOLE=1
。
我们建议采用以下步骤对基于 Qt 的类进行单元测试:
- 自动生成单元测试;这将为您提供一个模板。
- 将其中一个生成的测试作为模板,最好在运行时通过(不抛出异常)。
- 使用一个测试作为模板,通过声明将测试对象分配替换为堆上的分配(使用 new)。
- 在测试结束时,如果使用父对象,则仅删除该对象(无论是主要测试对象还是次要测试对象)。
- 通过使用调试器观察最终测试对象的状态并插入适当的断言宏,来验证一个测试。
- 添加更多测试用例(使用图形用户界面对话框选项,并使用第一个经过验证的测试用例作为模板)。