第一次使用QtTest

之前c++代码用过cppunit,然后开始用gtest,对于qt代码,第一次尝试使用QtTest框架。
要使用QtTest,首先需要在.pro文件中增加配置,让qmake知道要添加qt测试框架:
[cce]
CONFIG += qtestlib
[/cce]
然后,就可以新建一个cpp文件,编写测试代码了:
[cce lang="cpp"]
#include <QtTest/QtTest>

#include "../src/twitterapi.h"

class TwitterApiTest : public QObject
{
Q_OBJECT
private slots:
void testRequestToken();
};

void TwitterApiTest::testRequestToken()
{
Setting s;
s.twitterUrl = "https://api.twitter.com/1";

TwitterApi api(&s);
QSignalSpy spy(&api, SIGNAL(authUrlCreated(bool,QString,Token*)));
bool result = api.authUrl();

QVERIFY(result);

QTest::qWait(10000);

QVERIFY(spy.isValid());
QCOMPARE(spy.count(), 1);

QList<QVariant> arguments = spy.takeFirst();
QVERIFY(arguments.at(0).toBool() == true);
qDebug() << arguments.at(1);
}

QTEST_MAIN(TwitterApiTest)

#include "TwitterApiTest.moc"
[/cce]
QtTest相关的函数和宏都在QtTest/QtTest中,直接都include进来即可,我主要用到了里面的QSignalSpy类。
测试类和普通qt类一样,需要继承QObject,所有的测试函数,都声明为私有槽函数(private slots)。这里的测试函数,主要使用了QSignalSpy类,可以用这个类来检测对应的信号是否已经发出,还可以获取信号的参数。QtTest还提供了一些断言宏,具体可以查看assistant中QTest的文档。
每个测试类都需要使用QTEST_MAIN宏生成一个最终的main函数,make之后会生成一个对应的可执行文件。最后,如果测试类声明和实现在一个cpp文件中,需要手工include生成的moc文件。
感觉QtTest没有像cmake中的test那样好的和makefile进行结合,没有增加执行测试的阶段。需要手工运行生成的可执行程序:
[cce]
jinlingjie@babydragon ~/work/aflatoxin-build-desktop-Qt_in_PATH___ $ ./aflatoxin
********* Start testing of TwitterApiTest *********
Config: Using QTest library 4.8.1, Qt 4.8.1
PASS : TwitterApiTest::initTestCase()
QWARN : TwitterApiTest::testRequestToken() Don't know how to handle 'Token*', use qRegisterMetaType to register it.
QDEBUG : TwitterApiTest::testRequestToken() oauth head: "OAuth oauth_callback="-------",oauth_consumer_key="-----------",oauth_nonce="-----------",oauth_signature="-----------",oauth_signature_method="HMAC-SHA1",oauth_timestamp="1333445034",oauth_version="1.0""
QWARN : TwitterApiTest::testRequestToken() content-type missing in HTTP POST, defaulting to application/octet-stream
QDEBUG : TwitterApiTest::testRequestToken() request token reply: "oauth_token=---------&oauth_token_secret=-----------&oauth_callback_confirmed=true"

QDEBUG : TwitterApiTest::testRequestToken() QVariant(QString, "https://api.twitter.com/oauth/authorize?oauth_token=-------------")
PASS : TwitterApiTest::testRequestToken()
PASS : TwitterApiTest::cleanupTestCase()
Totals: 3 passed, 0 failed, 0 skipped
********* Finished testing of TwitterApiTest *********
[/cce]

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据