Qt 单元测试 #

Qt Test 框架 #

基本测试类 #

cpp
#include <QtTest>

class TestMyClass : public QObject
{
    Q_OBJECT

private slots:
    void initTestCase();      // 测试开始前执行一次
    void cleanupTestCase();   // 测试结束后执行一次
    
    void init();              // 每个测试用例前执行
    void cleanup();           // 每个测试用例后执行
    
    void testFunction1();     // 测试用例
    void testFunction2();
};

void TestMyClass::initTestCase()
{
    // 初始化测试环境
}

void TestMyClass::testFunction1()
{
    QCOMPARE(1 + 1, 2);
    QVERIFY(true);
}

QTEST_MAIN(TestMyClass)
#include "test_myclass.moc"

测试宏 #

cpp
// 比较相等
QCOMPARE(actual, expected);

// 验证条件
QVERIFY(condition);

// 验证条件为真
QVERIFY2(condition, "message on failure");

// 验证抛出异常
QVERIFY_EXCEPTION_THROWN(function(), ExceptionType);

数据驱动测试 #

cpp
void TestMyClass::testAdd_data()
{
    QTest::addColumn<int>("a");
    QTest::addColumn<int>("b");
    QTest::addColumn<int>("result");
    
    QTest::newRow("positive") << 1 << 2 << 3;
    QTest::newRow("negative") << -1 << -2 << -3;
    QTest::newRow("zero") << 0 << 0 << 0;
}

void TestMyClass::testAdd()
{
    QFETCH(int, a);
    QFETCH(int, b);
    QFETCH(int, result);
    
    QCOMPARE(a + b, result);
}

GUI 测试 #

cpp
#include <QTest>

void TestMyWidget::testButtonClick()
{
    MyWidget widget;
    widget.show();
    
    QTest::qWaitForWindowExposed(&widget);
    
    QPushButton *button = widget.findChild<QPushButton*>("myButton");
    QTest::mouseClick(button, Qt::LeftButton);
    
    QCOMPARE(widget.clickCount(), 1);
}

void TestMyWidget::testKeyboardInput()
{
    QLineEdit *lineEdit = new QLineEdit;
    
    QTest::keyClicks(lineEdit, "Hello");
    QCOMPARE(lineEdit->text(), QString("Hello"));
    
    QTest::keyClick(lineEdit, Qt::Key_Enter);
}

运行测试 #

bash
# 运行所有测试
./test_myclass

# 运行指定测试用例
./test_myclass testFunction1

# 输出详细信息
./test_myclass -v1

# 输出到文件
./test_myclass -o result.txt

项目配置 #

qmake
# .pro 文件
QT += testlib

SOURCES += test_myclass.cpp

下一步 #

现在你已经掌握了单元测试,接下来学习 调试技巧,了解 Qt 应用的调试方法!

最后更新:2026-03-29