第一个完整的cppunit单元测试程序
在极限编程中,测试程序本应该在编写主程序之前就要写好,然后将写好的类程序放在测试程序中进行测试,但考虑到项目中需求文档等并未将接口定义好,我无从开始,而且,自己对单元测试也是刚刚熟悉,需要一边写测试程序一边解决遇到的问题,时间周期较长。在本次编程中,我是直接把github上小组的程序下载下来,看有哪些接口,再来编写的测试程序。
测试对象:robot类中的solver类(https://github.com/TeamWork-Robot/Team1/tree/master/Robot);选择solver类的理由主要原因:1.robot类中未找到易于测试的函数,返回值一般为void;2.自以为point类,frame类比较简单,没什么好测试的,而solver类本身具有一定复杂度,而且函数返回类型一般为point;
编写好solver类的测试程序后,发现错误太多,花了好长时间也没有解决(主要是发现solver类本身还有不少需要改进的地方);于是退而求其次,先写一个能测试point类的程序,解决遇到的问题。
#include <cppunit/extensions/HelperMacros.h>
#include <Point.h> class testpoint :public CppUnit::TestFixture
{
CPPUNIT_TEST_SUITE(testpoint);
CPPUNIT_TEST(testget);
//CPPUNIT_TEST(testrotate);
CPPUNIT_TEST_SUITE_END();
public:
void setUp();
void tearDown();
testpoint();
//~testsolver();
void testget();
//void testrotate();
};
test_point.h
#include "test_point.h"
#include "Point.h"
#include <string>
#include<iostream>
#include <cppunit/TestCase.h>
#include "cppunit/TestAssert.h" CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(testpoint, "alltest"); testpoint::testpoint()
{
}; void testpoint::setUp()
{
std::cout << "test begin" << std::endl;
}; void testpoint::tearDown()
{
std::cout << "test end" << std::endl;
}; void testpoint::testget()
{
Point point1(, );
int resultx = point1.getX();
int resulty = point1.getY();
CPPUNIT_ASSERT(resultx == );
CPPUNIT_ASSERT(resulty == );
}
test_point.cpp
#include <cppunit/TestResultCollector.h>
#include <cppunit/BriefTestProgressListener.h>
#include <cppunit/TextOutputter.h> int main()
{
CppUnit::TestResult r;
CppUnit::TestResultCollector rc;
r.addListener(&rc); // 准备好结果收集器 CppUnit::TestRunner runner; // 定义执行实体
runner.addTest(CppUnit::TestFactoryRegistry::getRegistry("alltest").makeTest());
runner.run(r); // 运行测试 CppUnit::TextOutputter o(&rc, std::cout);
o.write(); // 将结果输出 system("pause"); return rc.wasSuccessful() ? : -;
}
test_point_main.cpp
把point类的头文件和源程序加进去后,结果如下:(加了system("pause");)
将Point.cpp中的get函数的返回值人为的加一之后,结果如下:
下面介绍一下这其中遇到的问题及解决办法,为需要解决类似问题的同学提供参考:
1.fatal error C1083: 无法打开包括文件:“Point.h”: No such file or directory:这个问题的解决办法如下,首先找到出错文件的位置,右键项目属性 ->C/C++ ->常规->附加包含目录,将出错文件位置放进去。
2. error C2011: “Point”:“class”类型重定义;由于Point.h文件在一开始没有使用宏定义,导致运行测试类时显示Point.h重编译;解决办法将Point.h文件中加上宏定义#ifndef POINT_H #define POINT_H #endif即可。
程序相关语句解释:
1.class testpoint :public CppUnit::TestFixture 继承自TestFixture的类testpoint;
2.CPPUNIT_TEST_SUITE(testpoint);将testpoint添加到测试包
CPPUNIT_TEST(testget);testget为测试函数
3.CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(testpoint, "alltest");将测试包testpoint注册为alltest
4.main函数在测试包改变时基本不变;
CppUnit::TestResult r;
CppUnit::TestResultCollector rc;
r.addListener(&rc); // 三句共同完成结果收集器的准备工作
CppUnit::TestRunner runner; // 定义执行实体
runner.addTest(CppUnit::TestFactoryRegistry::getRegistry("alltest").makeTest());
runner.run(r); // 运行测试
CppUnit::TextOutputter o(&rc, std::cout);
o.write(); // 将结果输出
system("pause");//主要为了避免exe程序运行后立即退出;
return rc.wasSuccessful() ? 0 : -1;//若测试通过,则返回值为0;
今天主要了解测试程序编写的相关细节,明天继续测试稍复杂一些的类。
第一个完整的cppunit单元测试程序的更多相关文章
- cppunit 单元测试程序
原文:http://www.cnblogs.com/wang-kai/p/5106740.html 极限编程(XP)推崇测试优先原则,由此引发了软件开发方法从传统的瀑布模型转向以测试为驱动的敏捷开发模 ...
- Spark菜鸟学习营Day4 单元测试程序的编写
Spark菜鸟学习营Day4 单元测试程序的编写 Spark相比于传统代码是比较难以调试的,单元测试的编写是非常必要的. Step0:需求分析 在测试案例编写前,需完成需求分析工作,明确程序所有的输入 ...
- 【Python】我的第一个完整的小说爬虫
写在开头 纪念我的第一个爬虫程序,一共写了三个白天,其中有两个上午没有看,中途遇到了各种奇怪的问题,伴随着他们的解决,对于一些基本的操作也弄清楚了.果然,对于这些东西的最号的学习方式,就是在使用中学习 ...
- Flowable实战(一)启动第一个完整流程
一.前言: 发现网上关于Flowable的资料基本都是浅尝辄止,对如何构建一个企业级的流程应用说明很少,所以写个实战系列,希望对大家和自己,都有所帮助. 二.认识Flowable Flowab ...
- 2016-1-5第一个完整APP 私人通讯录的实现 1:登录界面及跳转的简单实现2
---恢复内容开始--- 实际效果如上 一:Segue的学习 1.什么是Segue: Storyboard上每一根用来界面跳转的线,都是一个UIStoryboardSegue对象(简称Segue) ...
- Python 初学——V_Rename(第一个完整的python程序)
我在大一的时候就对python非常感兴趣,就是一直没有时间和机会去学习下,只是了解些表面的东西,今天早上整理电脑的时候发现文件夹里面的文件名是这样子的,有点小不舒服,特别想去除重复的"Str ...
- cmake,gtest单元测试程序
参考:http://blog.csdn.net/stdcoutzyx/article/details/8284183 PROJECT (HELLO) SET(SRC_LIST main.c) MESS ...
- C语言学习002:第一个完整的C程序代码
#include <stdio.h>//引用相关的外部库,stdio.h包含了终端读写数据的代码 //程序入口,程序通过main函数的返回值判断程序是否运行成功,0表示成功,非0表示程序运 ...
- 2016-1-7第一个完整APP 私人通讯录的实现 6:在联系人界面增加删除联系人的功能
一:在viewDidLoad方法中代码添加一个UIBarButtonItem,并将其的类型设置成垃圾桶,代码如下: - (void)viewDidLoad { [super viewDidLoad]; ...
随机推荐
- JSF的ui标签
在使用自己的tag时,首先需要在web.xml里面进行注册,注册方式是在web.xml开头加上: <context-param> <param-name>fac ...
- Linux Direct 文件读写(文件DIO)
有时候,读写文件并不想要使用系统缓存(page cache),此时 direct 文件读写就派上了用场,使用方法: (1)打开文件时,添加O_DIRECT参数: 需要定义_GNU_SOURCE,否则找 ...
- 分享一个jquery写的类似于百度的搜索框,(可动态配置,可单列或者table格式,可填充数据)
需求:类似于百度的搜索框,可配置,可单列可table格式,可填充数据.页面可多次使用,简单,易用. 想法:使用jquery,css,ajax,前台调用,后台返回json数据. jquery代码: va ...
- SVN 管理
01. 源代码管理工具概述(PPT) ================================================================================ ...
- php无法加载Memcache缓存模块问题及Memcache的安装
今天早上去迁移网站发现打开网站报错 然后我去phpinfo.php看了一下,果然我的测试页里面有加载到Memcache这个模块,如下图: 这时候,既然发现了问题的所在我们就要去排查问题,当前这个问题呢 ...
- SQL Server 遇到 Automation服务器不能创建对象
Windows 2003 安装SQL Server出现Automation问题 如下: ######安装SQL Server 遇到 Automation服务器不能创建对象问题 解决办法: 1.1 ...
- linux下的循环命令写法
直切正题 方法一:利用while do循环,举例,while true;do ls;sleep 1;done 解释,该命令为每秒执行ls查询命令,sleep 1 为每秒循环,其他命令可直接替换 ls ...
- delphi 基础之三 文件流操作
文件流操作 Delphi操作流文件:什么是流?流,简单来说就是建立在面向对象基础上的一种抽象的处理数据的工具.在流中,定义了一些处理数据的基本操作,如读取数据,写入数据等,程序员是对流进行所有操作的, ...
- 计算系数 (codevs 1137) 题解
[问题描述] 给定一个多项式(ax + by)^k,给定a.b.k.n.m,请求出多项式展开后x^n y^m项的系数. [样例输入] 1 1 3 1 2 [样例输出] 3 [解题思路] 本题为NOIP ...
- C# 平时碰见的问题【3】
今天发现一个问题纳闷了半个小时, 需求是处理project文件里边的数据内容,其中需要判断任务名称不存在重复; 在测试的时候弄了两行一样的任务,如预想: 任务[xxx]重复 然后删掉重复的任务行,继续 ...