Poco库中提供了一套小巧的单元测试框架,可以用来对C++代码进行测试。这里介绍一下Poco库中的单元测试框架的使用方法,首先在工程中引入单元测试模块CppUnit,同时包含对应的库的头文件目录。添加完成之后,我们在工程中添加主测试集,测试集是测试程序的入口类,对应的实现如下:

//MainTestSuite.h
#ifndef _MAIN_TEST_SUITE_H_
#define _MAIN_TEST_SUITE_H_
#include "CppUnit\TestSuite.h"class MainTestSuite
{public://测试集的入口static CppUnit::Test* suite();
};#endif
//MainTestSuite.cpp
#include "MainTestSuite.h"
#include "SQLiteTest.h"CppUnit::Test * MainTestSuite::suite()
{//在主测试集中可以添加别的测试集CppUnit::TestSuite* pSuite = new CppUnit::TestSuite("MainTestSuite");pSuite->addTest(SQLiteTest::suite());return pSuite;
}

测试集是可以嵌套的,我们可以在主测试集中加入子测试集,同时在子测试集中再次加入测试集。这里我们以上一遍文章中的数据库访问类为测试对象说明一下测试集的用法。数据库访问类的实现如下所示。

//SqliteDatabase.h
#ifndef _SQLITE_DATA_BASE_H_
#define _SQLITE_DATA_BASE_H_#include "Poco\Data\SQLite\SQLite.h"
#include "Poco\Data\Session.h"
#include "Poco\Mutex.h"
#include "Poco\Process.h"//添加需要的的类
using namespace Poco;
using Poco::FastMutex;
using Poco::ProcessHandle;
using Poco::Data::Session;
using Poco::Data::Keywords::now;
using Poco::Data::Keywords::use;
using Poco::Data::Keywords::bind;
using Poco::Data::Keywords::into;
using Poco::Data::Statement;//数据结构体
class Person {public:std::string mName;//姓名int mAge;         //年龄std::string mSex; //性别int mHeight;      //身高std::string mId;  //身份ID
};class SqliteDatabase
{public:static SqliteDatabase* Instance();
private:SqliteDatabase();
public:~SqliteDatabase();//增加用户bool addNewPerson(Person& info);//删除用户bool deletePersonByID(const std::string& uuid);//修改用户信息bool updatePersonByID(const std::string& uuid, Person& info);//查找用户信息bool searchPersonByID(std::string uuid, Person& info);//判断某个用户信息是否存在bool isPersonInfoExist(const std::string& uuid);
private:static SqliteDatabase* mInstance;static FastMutex mutex;
};
#endif
//SqliteDatabase.cpp
#include "SqliteDatabase.h"
#include "Poco\Data\SQLite\Connector.h"SqliteDatabase* SqliteDatabase::mInstance = nullptr;
FastMutex SqliteDatabase::mutex;//单例模式,doublecheck,线程安全
SqliteDatabase * SqliteDatabase::Instance()
{if (mInstance == nullptr){mutex.lock();if (mInstance == nullptr){mInstance = new SqliteDatabase();}mutex.unlock();}return mInstance;
}SqliteDatabase::SqliteDatabase()
{Poco::Data::SQLite::Connector::registerConnector();
}SqliteDatabase::~SqliteDatabase()
{Poco::Data::SQLite::Connector::unregisterConnector();
}bool SqliteDatabase::addNewPerson(Person & info)
{Session session(Poco::Data::SQLite::Connector::KEY, "test.db");session << "CREATE TABLE IF NOT EXISTS PERSONINFO (UUID VARCHAR(64),  NAME VARCHAR(64), AGE INTEGER(3), SEX VARCHAR(64), HEIGHT INTEGER(3))", now;if (isPersonInfoExist(info.mId)){return false;}//采用绑定的形式防止SQL注入Statement stmt = (session << "INSERT INTO PERSONINFO VALUES(:uuid, :name, :age, :sex, :height)",bind(info.mId), bind(info.mName), bind(info.mAge), bind(info.mSex), bind(info.mHeight));return (stmt.execute() > 0);
}bool SqliteDatabase::deletePersonByID(const std::string & uuid)
{Session session(Poco::Data::SQLite::Connector::KEY, "test.db");Statement stmt = (session << "DELETE FROM PERSONINFO WHERE UUID = :uuid", bind(uuid.c_str()));return (stmt.execute() == 1);
}bool SqliteDatabase::updatePersonByID(const std::string & uuid, Person & info)
{Session session(Poco::Data::SQLite::Connector::KEY, "test.db");Statement stmt = (session << "UPDATE PERSONINFO SET NAME = :name, AGE = :age, SEX = :sex, HEIGHT = :height  WHERE UUID = :uuid",bind(info.mName), bind(info.mAge), bind(info.mSex), bind(info.mHeight), bind(uuid));return (stmt.execute() == 1);
}bool SqliteDatabase::searchPersonByID(std::string uuid, Person & info)
{Session session(Poco::Data::SQLite::Connector::KEY, "test.db");int age = 0;int height = 0;std::string name;std::string sex;Statement stmt = (session << "SELECT NAME, AGE, SEX, HEIGHT FROM PERSONINFO WHERE UUID = :uuid",into(name), into(age), into(sex), into(height), bind(uuid));if (stmt.execute() == 1){info.mAge = age;info.mName = name;info.mSex = sex;info.mHeight = height;info.mId = uuid;return true;}return false;
}bool SqliteDatabase::isPersonInfoExist(const std::string & uuid)
{Session session(Poco::Data::SQLite::Connector::KEY, "test.db");Statement stmt = (session << "SELECT * from PERSONINFO WHERE UUID = :uuid", bind(uuid));if (stmt.execute() == 1){return true;}return false;
}

对应的测试集实现如下:

//SQLiteTest.h
#ifndef _SQLTE_TEST_H_
#define _SQLTE_TEST_H_
#include "CppUnit/TestCase.h"class SQLiteTest : public  CppUnit::TestCase
{public:SQLiteTest(const std::string & name);~SQLiteTest();//测试数据插入void testInsertSingleItem();//测试数据删除void testDeleteSingleItem();//测试数据更新void testUpdateSingleItem();//测试数据查找void testSearchSingleItem();public:static CppUnit::Test* suite();
};#endif
//SQLiteTest.cpp
#include "SQLiteTest.h"
#include "CppUnit/CppUnit.h"
#include "CppUnit/TestSuite.h"
#include "CppUnit/TestCaller.h"
#include "SqliteDatabase.h"
#include <string>SQLiteTest::SQLiteTest(const std::string & name) :CppUnit::TestCase(name)
{}SQLiteTest::~SQLiteTest()
{}void SQLiteTest::testInsertSingleItem()
{Person insert_person;insert_person.mAge = 12;insert_person.mHeight = 168;insert_person.mName = "Liming";insert_person.mId = "6335626";insert_person.mSex = "female";SqliteDatabase* base = SqliteDatabase::Instance();assertTrue(base->addNewPerson(insert_person));assertTrue(base->isPersonInfoExist("6335626"));assertTrue(!base->addNewPerson(insert_person));}void SQLiteTest::testDeleteSingleItem()
{Person insert_person;insert_person.mAge = 12;insert_person.mHeight = 168;insert_person.mName = "Liming";insert_person.mId = "6335620";insert_person.mSex = "female";SqliteDatabase* base = SqliteDatabase::Instance();assertTrue(base->addNewPerson(insert_person));assertTrue(base->deletePersonByID("6335620"));assertTrue(!base->isPersonInfoExist("6335620"));
}void SQLiteTest::testUpdateSingleItem()
{Person insert_person;insert_person.mAge = 12;insert_person.mHeight = 168;insert_person.mName = "Liming";insert_person.mId = "6335920778";insert_person.mSex = "female";SqliteDatabase* base = SqliteDatabase::Instance();assertTrue(base->addNewPerson(insert_person));Person new_person;new_person.mAge = 19;new_person.mHeight = 188;new_person.mName = "Liming";new_person.mSex = "female";assertTrue(base->updatePersonByID("6335920778", new_person));Person after_update;assertTrue(base->searchPersonByID("6335920778", after_update));assertTrue(after_update.mAge == 19);assertTrue(after_update.mHeight == 188);
}void SQLiteTest::testSearchSingleItem()
{Person insert_person;insert_person.mAge = 12;insert_person.mHeight = 168;insert_person.mName = "Liming";insert_person.mId = "6339920";insert_person.mSex = "female";SqliteDatabase* base = SqliteDatabase::Instance();assertTrue(base->addNewPerson(insert_person));Person newInfo;assertTrue(base->searchPersonByID("6339920", newInfo));assertTrue(newInfo.mId == "6339920");assertTrue(newInfo.mHeight == 168);assertTrue(newInfo.mName == "Liming");assertTrue(insert_person.mSex == "female");
}//将测试用例添加到测试集中
CppUnit::Test * SQLiteTest::suite()
{CppUnit::TestSuite* pSuite = new CppUnit::TestSuite("SQLiteTest");CppUnit_addTest(pSuite, SQLiteTest, testInsertSingleItem);CppUnit_addTest(pSuite, SQLiteTest, testDeleteSingleItem);CppUnit_addTest(pSuite, SQLiteTest, testSearchSingleItem);CppUnit_addTest(pSuite, SQLiteTest, testUpdateSingleItem);//添加耗时比较长的测试//CppUnit_addLongTest(pSuite, FileChannelTest, testRotateAtTimeHourUTC); return pSuite;
}

测试集添加完成之后我们就可以定义程序的入口了,这里我们采用单元测试的宏来定义程序的入口。对应的实现如下:

//Driver.cpp
#include "CppUnit/TestRunner.h"
#include "MainTestSuite.h"
#include "CppUnit\TestRunner.h"
//定义了主测试集
CppUnitMain(MainTestSuite)

这时候运行测试程序会发现程序闪退。这是因为我们没有指定测试的输出模式,Poco的测试框架支持多种输出形式,都是通过命令行参数来进行配置的。常用的参数如下所示:

-all 执行所有的测试
-wait 执行完毕之后进行等待
-ignore *** 忽略哪些测试
-setup  *** 执行哪些测试
-print 打印测试用例的详细信息
-long 执行耗时比较长的测试用例

测试输出结果如下图所示:

Poco库使用:单元测试相关推荐

  1. react项目中使用mocha结合chai断言库进行单元测试

    react项目中使用mocha结合chai断言库进行单元测试 git地址:https://github.com/yancekang/... 如果对你有所帮助,感谢start 项目搭建 create-r ...

  2. 如何对 Jenkins 共享库进行单元测试

    2019独角兽企业重金招聘Python工程师标准>>> 本文首发于:Jenkins 中文社区 Jenkins 共享库是除了 Jenkins 插件外,另一种扩展 Jenkins 流水线 ...

  3. 基于 C++ POCO 库封装的异步多线程的 CHttpClient 类

    用惯了 Jetty 的 基于事件的 HttpClient 类,在C++平台上也没找到这样调用方式的类库,只好自己写一个了. 目前版本 1.0,朋友们看了给点建议.(注:Kylindai原创,转载请注明 ...

  4. POCO库中文编程参考指南(11)如何使用Reactor框架?

    1 Reactor 框架概述 POCO 中的 Reactor 框架是基于 Reactor 设计模式进行设计的.其中由 Handler 将某 Socket 产生的事件,发送到指定的对象的方法上,作为回调 ...

  5. Poco库使用:操作Json格式数据

    文章目录 1.解析json字符串数据 2.生成Json格式的数据 3.操作Json数组 4.使用字符串流转换Json格式数据 5.使用键值检索Json结构中的数据 6.使用原始字符串避免字符转义 7. ...

  6. Poco库使用:任务管理器TaskManager

    文章目录 1.定义独立任务 2.使用TaskManager启动多个任务 3.TaskManager使用自定义线程池 4.添加任务观察者 5.使用自定义的任务观察者和任务通知 Poco库的任务管理器Ta ...

  7. C++ 使用Poco库实现日志操作

    C++ 使用Poco库实现日志操作 flyfish 文章目录 C++ 使用Poco库实现日志操作 日志输出到文件 日志输出到控制台 日志同时输出到文件和控制台 示例:将异常输出到日志 日志输出到文件 ...

  8. C++ 使用Poco库操作SQLite数据库

    C++ 使用Poco库操作SQLite数据库 flyfish 文章目录 C++ 使用Poco库操作SQLite数据库 数据库插入记录 数据库插入记录方式2 数据库插入记录方式3 更方便的数据库插入记录 ...

  9. Poco库使用:文件目录操作

    文章目录 获取各种标准目录 获取和应用相关的信息 目录操作 文件操作 在工程项目开发中,文件目录操作应该是最常见的操作之一了吧.这里就介绍一下如何通过Poco库实现各种文件目录操作. 获取各种标准目录 ...

  10. C++ 使用Poco库操作 json 文件

    C++ 使用Poco库操作 json 文件 flyfish #include <string> #include <iostream> #include <sstream ...

最新文章

  1. 如何从0到1打造一款AI产品?
  2. java websocket修改为同步_初级Java程序员需要掌握哪些主流技术才能拿25K?
  3. 隐马尔科夫模型(Hidden Markov Models) 系列之五
  4. 通向架构师的道路(第四天)之Tomcat性能调优-让小猫飞奔
  5. [LG P2519][BZOJ2298][HAOI2011]problem a
  6. 程序员如何让自己 Be Cloud Native - 配置篇
  7. Netty的并发编程实践4:线程安全类的应用
  8. 深度学习:卷积神经网络CNN
  9. 51单片机的家居空气质量监测系统proteus仿真设计
  10. Java理解mian方法
  11. YTU_3313: Barnicle(模拟)
  12. stm32h7内存分配_【STM32H7教程】第9章 STM32H7重要知识点数据类型,变量和堆栈...
  13. android dialog隐藏虚拟按键,Android应用开发之Android dialog 去除虚拟按键的解决方法...
  14. GO项目打包部署操作
  15. linux xxd命令
  16. ARM学习知识整理day1
  17. 墨者学院PHP,墨者学院SQL注入解题
  18. JAVA租房网站计算机毕业设计Mybatis+系统+数据库+调试部署
  19. 【C++】数组和指针的爱恨情仇。。。
  20. 弗吉尼亚理工计算机科学排名,弗吉尼亚理工大学Virginia Tech计算机科学Computer Science专业排名第74位(2021年THE世界大学商科排名)...

热门文章

  1. Fork/Join 型线程池与 Work-Stealing 算法
  2. 空格、NBSP 造成的 JSON 解析失败问题
  3. 程序员版本的八荣八耻,爱了
  4. 服务器运行时间设置,服务器的时间同步设置方法
  5. Android7.1.1新增Shortcuts快捷方式,让App更加快捷方便
  6. 心情随笔(一):五月随笔满满的正能量
  7. 1、电脑鼠标右键反应慢,解决办法
  8. win7右键反应特别慢的问题
  9. XCode7报 App Transport Security has blocked a cleartext HTTP (http://) resource load since it is inse
  10. 【离散数学】 MIT 6.042J 笔记 - Lecture 1 Introductions and Proofs