better qgui tester

9 篇文章 0 订阅

之前写的qtestrunner不能测试gui程序,故应将其改进为如下:

qtestrunner.h

#ifndef TESTRUNNER_H
#define TESTRUNNER_H

#include <QTimer>

#include <QtTest>

/*
Taken from https://stackoverflow.com/questions/1524390/what-unit-testing-framework-should-i-use-for-qt
BEWARE: there are some concerns doing so, see  https://bugreports.qt.io/browse/QTBUG-23067
*/
class TestRunner : public QObject
{
    Q_OBJECT

public:
    TestRunner() : m_overallResult(0)
    {
        QDir dir;
        if (!dir.exists(mTestLogFolder))
        {
            if (!dir.mkdir(mTestLogFolder))
                qFatal("Cannot create folder %s", mTestLogFolder);
        }
    }

    void addTest(QObject * test)
    {
        test->setParent(this);
        m_tests.append(test);
    }

    bool runTests(int argc, char * argv[])
    {
        QApplication app(argc, argv);
        QTimer::singleShot(0, this, SLOT(run()));
        app.exec();

        return m_overallResult == 0;
    }

    private slots:
    void run()
    {
        doRunTests();
        QApplication::instance()->quit();
    }

private:
    void doRunTests()
    {
        // BEWARE: we assume either no command line parameters or evaluate first parameter ourselves
        // usage: 
        //    help:                                        "TestSuite.exe -help"
        //    run all test classes (with logging):         "TestSuite.exe"
        //    print all test classes:                      "TestSuite.exe -classes"
        //    run one test class with QtTest parameters:   "TestSuite.exe testClass [options] [testfunctions[:testdata]]...
        if (QApplication::arguments().size() > 1 && QApplication::arguments()[1] == "-help")
        {
            qDebug() << "Usage:";
            qDebug().noquote() << "run all test classes (with logging):\t\t" << qAppName();
            qDebug().noquote() << "print all test classes:\t\t\t\t" << qAppName() << "-classes";
            qDebug().noquote() << "run one test class with QtTest parameters:\t" << qAppName() << "testClass [options][testfunctions[:testdata]]...";
            qDebug().noquote() << "get more help for running one test class:\t" << qAppName() << "testClass -help";
            exit(0);
        }

        foreach(QObject * test, m_tests)
        {
            QStringList arguments;
            QString testName = test->metaObject()->className();

            if (QApplication::arguments().size() > 1)
            {
                if (QApplication::arguments()[1] == "-classes")
                {
                    // only print test classes
                    qDebug().noquote() << testName;
                    continue;
                }
                else
                if (QApplication::arguments()[1] != testName)
                {
                    continue;
                }
                else
                {
                    arguments = QApplication::arguments();
                    arguments.removeAt(1);
                }
            }
            else
            {
                arguments.append(QApplication::arguments()[0]);
                // log to console
                arguments.append("-o"); arguments.append("-,txt");
                // log to file as TXT
                arguments.append("-o"); arguments.append(mTestLogFolder % "/" % testName % ".log,txt");
                // log to file as XML
                arguments.append("-o"); arguments.append(mTestLogFolder % "/" % testName % ".xml,xunitxml");
            }
            m_overallResult |= QTest::qExec(test, arguments);
        }
    }

    QList<QObject *> m_tests;
    int m_overallResult;
    const QString mTestLogFolder = "testLogs";
};

#endif // TESTRUNNER_H
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值