在上一篇文章,小豆君向大家介绍了一个简单的测试程序,使大家了解了测试程序的基本样子,有了初步的印象。我们的主题是Qt,所以今天来介绍下Qt的测试框架,小豆君打算分三篇文章来详细介绍Qt测试框架。
在进入主题之前,我想说的是,之所以会分享一系列的测试方法,其实是想向大家推出一种编程方法,即:先编写测试用例,再编写类实现。这有别于我们通常先编写实现,再进行测试的方式。
先编写测试用例会帮助你更加了解架构和设计意图,迫使类开发者以类使用者的角度看待和使用接口,降低代码的耦合关系,在实现被改变的时候,能够快速响应改变后的正确性。如果你向使用者提供接口,这些测试用例就是最好的文档,且永不过时(如果是word文档,那很可能版本不一)。同时,它还可以帮助你在需求或逻辑不是很明朗的时候,理清需求,整理思路,避免不必要的开发。
就从我个人体验而言,在我初出茅庐时就有前辈跟我讲先测试后编程,而那时我却固执的认为这会降低我的编程效率,浪费时间,完全没有直接实现类来的更快,更爽。直到有一天我被不断变化的需求折磨的要死,尝试着采用先测试的开发方式,从此便体会到了它的好处。人真是必须先吃点苦头,才懂得前人总结的重要性啊。
如果你掌握并熟练的运用这一套开发方式,我想这绝对会是你优于他人的一项重要技能。
关于具体的编程步骤,小豆君会在介绍完Qt的测试框架后,再给大家作详细介绍,话不多说,我们进入今天的主题,QTest。
我们计划编写一个测试用例,用来测试上一篇文章中的Commodity类(程序员晋升必备技能——单元测试框架)
1 添加testlib模块
直接打开SimpleTest工程,在pro文件中添加testlib模块
QT += core testlib
2 添加测试类CommodityTest
该类必须继承自QObject。所有的测试接口都必须声明为private slots,这样测试框架才会找到这些接口,并执行它们。我对于函数的命名为:
casen_函数名
当然,你也可以选用自己喜欢的命名方式。
头文件:
#include <QtTest/QtTest> class CommodityTest : public QObject { Q_OBJECT private slots: void case1_serialNum(); void case2_name(); void case3_consting(); void case4_price(); void case5_profit(); };
源文件:
#include "commoditytest.h" #include "commodity.h" void CommodityTest::case1_serialNum() { //测试编号 Commodity c("beer_1", "啤酒", 4, 5); QVERIFY(c.serialNum() == "beer_1"); } void CommodityTest::case2_name() { //测试商品名称 Commodity c("beer_1", "啤酒", 4, 5); QVERIFY(c.name() == "啤酒"); } void CommodityTest::case3_consting() { //测试商品成本 Commodity c("beer_1", "啤酒", 4, 5); QVERIFY(c.consting() == 4); } void CommodityTest::case4_price() { //测试商品价格 Commodity c("beer_1", "啤酒", 4, 5); QVERIFY(c.price() == 5); } void CommodityTest::case5_profit() { //测试利润 价格减去成本 Commodity c("beer_1", "啤酒", 4, 5); QVERIFY(c.profit() == 1); }
QVERIFY()宏将计算表达式的值,如果为true,则继续执行测试函数。否则,失败的消息会附加到测试日志或输出窗口中,测试函数将停止执行。
如果你想要对测试日志有更详细的输出,可使用QCOMPARE()宏来代替,用法与QVERIFY()一样。
3 修改main函数
将main函数修改为:
#include "commoditytest.h" QTEST_MAIN(CommodityTest)
其中,QTEST_MAIN是一个main函数宏。
4 运行程序
程序输出如下内容:
哈哈,全部通过。
细心的同学可能发现,最终的测试函数中多了两个函数
/*在执行所有测试用例前,系统会先执行此函数,用来做一些初始化操作, 如果你有需要初始化的东西,例如数据库连接,环境变量的配置等都可以放到这个函数中*/ initTestCase() /*在最后一个测试用例执行结束,会调用这个函数,进行扫尾工作*/ cleanupTestCase()
5 使用命令行参数运行测试程序
可直接在Creator的“项目=》run=》运行设置=》命令行参数“中添加参数。
5.1 执行指定的测试函数
直接添加函数名即可:
运行:
5.2 将测试结果输出到文件
格式:-o 文件名称 文件格式(可以 是xml,txt等格式)
例如:
好的,关于Qt测试框架第一节的内容就分享到这里,希望你能有所收获,我们下期再见,最后不要忘了点赞分享哦。
更多分享请关注微信公众号:小豆君Qt分享,只要关注,便可加入C++\Qt交流群,一起学习,更可获得所有文章源码。