基于 Qt 的应用程序中使用的某些语义约定规定了单元测试应当遵循和不应遵循的的特定构造方式。具体包括:

  1. 许多 Qt 类都将父指针作为构造函数参数。并非所有为该参数指定的基类的子类在语义上对于任何给定的 Qt 类都有效。
  2. Qt 父对象拥有其子级,包括内存管理。这意味着当父对象自身被删除时,子对象也会被删除。

对于自动生成的测试用例:

  • 自动生成的测试会在堆栈上创建主要和次要测试对象。在大多数情况下,这将与上面的约定 #2 冲突,导致在测试用例执行期间出现内存错误,堆栈跟踪很可能指向析构函数的右括号。 
  • 在自动生成的测试中,C++test 会尝试将任何可用的子类类型用于基类类型的参数。在许多情况下,这将与上面的 #1 冲突。
  • 如果测试需要定义 QApplication 变量,则应将 - DCPPTEST_INIT_QT=1 宏定义添加到编译器选项中。要使用 Qt 控制台应用程序,则需同时添加 -DCPPTEST_INIT_QT_CONSOLE=1 宏。

我们建议采用以下步骤对基于 Qt 的类进行单元测试:

  1. 自动生成单元测试;这将为您提供一个模板。
  2. 将生成的其中一个测试作为模板,最好是运行通过(不抛出异常)的模板。
  3. 使用该测试作为模板,将测试对象的分配方式从声明替换为在堆上分配(使用 new)。
  4. 在测试结束时,如果使用了父对象,则仅删除该对象(无论是主要测试对象还是次要测试对象)。
  5. 使用调试器观察最终测试对象的状态,插入适当的断言宏,从而验证该测试。
  6. 添加更多测试用例(使用 GUI 对话框选项,并使用第一个经过验证的测试用例作为模板)。

  • No labels