单元测试大型Qt项目

时间:2015-03-23 19:48:49

标签: c++ qt unit-testing

我有一个相当大的Qt GUI项目,遗憾的是缺乏正确的单元测试。

我计划为每个班级准备一个包含测试源文件的测试项目。

我深入研究了很多Qt的官方文档,不过还有一些问题:

  • 如何创建测试套件?似乎所有文档和教程仅涵盖编写一个测试,但如何有效地捆绑我的单元测试?
  • 如何将测试执行集成到Qt中 造物主?也许在构建后步骤中运行测试会很有趣吗?
  • 我应该将所有普通源文件添加到测试项目中,还是有办法创建静态库?

非常感谢任何指向大型Qt项目提示测试的教程的指南。

2 个答案:

答案 0 :(得分:3)

我没有太多时间在Qt进行完美的单元测试。但是,我确实弄明白了如何让主管道工作。我希望这可以帮到你,虽然你可能比我研究Writing Unit Tests guide做得更好。

  

如何创建测试套件?似乎所有文档和教程仅涵盖编写一个测试,但如何有效地捆绑我的单元测试?

您可以通过将单元测试(对象上的插槽)收集到对象中并组合这些对象来组织“套件”。

<强> test_example.pro

TARGET = test_example
TEMPLATE = app
CONFIG += testcase
QT += testlib core

... INCLUDEPATH, SOURCES, HEADERS, etc...

<强>的main.cpp

#include <QtTest/QtTest>
#include "MainTest.h"

// This macro introduces an event loop
QTEST_MAIN(MainTest)

<强> MainTest.h

class MainTest : public QObject
{
  Q_OBJECT

private slots:

  // Each slot is a unit test
  void init()
  {
  }

  // Create a "test suite" by bundling tests into objects
  void runFirstSuite()
  {
    FirstSuiteUiTest first;
    first.test();  // runs 10 tests

    FirstSuiteIoTest second;
    second.test();  // runs 999 tests

    ...
  }

  void SecondSuite() 
  {
    QFAIL("This suite is not really a suite, and it always fails");
  }
};

您还可以将测试组织到物理文件结构中。我使用了一个子项目作为我的根.pro文件,所以我可以构建工件(动态和静态存档,二进制文件)并运行许多单元测试集合。

TEMPLATE = subdirs
CONFIG += ordered

SUBDIRS += src/core
SUBDIRS += src/some_dll
SUBDIRS += src/test/awesome_core_test_1 #Holds many suites
SUBDIRS += src/test/awesome_core_test_2 #Holds many other suites!

core.depends = core
awesome_core_test_1.depends = core
awesome_core_test_2.depends = core

因此,通过将单元测试组织到对象组合和物理文件中,您可以进行一些组织细化。可能有更好或不同的方式,但我不确定。

  

如何将测试执行集成到Qt Creator中?也许在构建后步骤中运行测试会很有趣吗?

CONFIG += testcase添加到.pro文件中。这会创建一个构建目标。通过运行make check

来调用构建和测试
  

我应该将所有普通源文件添加到测试项目中,还是有办法创建静态库?

你可以这样做,就像在任何其他项目中一样。

答案 1 :(得分:1)

  

如何创建测试套件?似乎所有文档和教程仅涵盖编写一个测试,但如何有效地捆绑我的单元测试?

在&#34; Qt单元测试班&#34;每个私人插槽都是一个单元测试。不存在添加新测试的其他标准方法,但存在非文档qmake功能。您可以阅读in this forum thread

  

如何将测试执行集成到Qt Creator中?也许在构建后步骤中运行测试会很有趣吗?

您可以添加CONFIG + = testcase测试项目,这将生成额外的make target - check。当然,您可以在任何地方添加此构建步骤。另外,您可以在这里阅读 - Writing_Unit_Tests

  

我应该将所有普通源文件添加到测试项目中,还是有办法创建静态库?

您可以使用源创建静态或动态库并将它们链接到测试项目,或者您可以添加源代码来测试项目,如here

顺便说一句,您可以使用Qt here

观看单元测试的示例