在极限编程中,测试程序本应该在编写主程序之前就要写好,然后将写好的类程序放在测试程序中进行测试,但考虑到项目中需求文档等并未将接口定义好,我无从开始,而且,自己对单元测试也是刚刚熟悉,需要一边写测试程序一边解决遇到的问题,时间周期较长。在本次编程中,我是直接把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单元测试程序的更多相关文章

  1. cppunit 单元测试程序

    原文:http://www.cnblogs.com/wang-kai/p/5106740.html 极限编程(XP)推崇测试优先原则,由此引发了软件开发方法从传统的瀑布模型转向以测试为驱动的敏捷开发模 ...

  2. Spark菜鸟学习营Day4 单元测试程序的编写

    Spark菜鸟学习营Day4 单元测试程序的编写 Spark相比于传统代码是比较难以调试的,单元测试的编写是非常必要的. Step0:需求分析 在测试案例编写前,需完成需求分析工作,明确程序所有的输入 ...

  3. 【Python】我的第一个完整的小说爬虫

    写在开头 纪念我的第一个爬虫程序,一共写了三个白天,其中有两个上午没有看,中途遇到了各种奇怪的问题,伴随着他们的解决,对于一些基本的操作也弄清楚了.果然,对于这些东西的最号的学习方式,就是在使用中学习 ...

  4. Flowable实战(一)启动第一个完整流程

    一.前言:   发现网上关于Flowable的资料基本都是浅尝辄止,对如何构建一个企业级的流程应用说明很少,所以写个实战系列,希望对大家和自己,都有所帮助. 二.认识Flowable   Flowab ...

  5. 2016-1-5第一个完整APP 私人通讯录的实现 1:登录界面及跳转的简单实现2

    ---恢复内容开始--- 实际效果如上 一:Segue的学习 1.什么是Segue: Storyboard上每一根用来界面跳转的线,都是一个UIStoryboardSegue对象(简称Segue)   ...

  6. Python 初学——V_Rename(第一个完整的python程序)

    我在大一的时候就对python非常感兴趣,就是一直没有时间和机会去学习下,只是了解些表面的东西,今天早上整理电脑的时候发现文件夹里面的文件名是这样子的,有点小不舒服,特别想去除重复的"Str ...

  7. cmake,gtest单元测试程序

    参考:http://blog.csdn.net/stdcoutzyx/article/details/8284183 PROJECT (HELLO) SET(SRC_LIST main.c) MESS ...

  8. C语言学习002:第一个完整的C程序代码

    #include <stdio.h>//引用相关的外部库,stdio.h包含了终端读写数据的代码 //程序入口,程序通过main函数的返回值判断程序是否运行成功,0表示成功,非0表示程序运 ...

  9. 2016-1-7第一个完整APP 私人通讯录的实现 6:在联系人界面增加删除联系人的功能

    一:在viewDidLoad方法中代码添加一个UIBarButtonItem,并将其的类型设置成垃圾桶,代码如下: - (void)viewDidLoad { [super viewDidLoad]; ...

随机推荐

  1. div紧靠浏览器底部

    <body> <div class='bottom'> 这个div紧贴浏览器底部,且居中显示 </div> </body> css代码: .bottom ...

  2. Promise机制

    Promise的诞生与Javascript中异步编程息息相关,js中异步编程主要指的是setTimout/setInterval.DOM事件机制.ajax,通过传入回调函数实现控制反转.异步编程为js ...

  3. linq to xml 基本操作

    使用XDocument类来进行简单的xml操作,用于软件参数的设置保存. using System; using System.Collections.Generic; using System.Li ...

  4. CentOS6.5安装readline时报错:/usr/bin/ld : cannot find -lncurses

    CentOS6.5安装readline时报错:/usr/bin/ld : cannot find -lncurses 解决方法: 安装ncurses-devel,输入命令: #yum install ...

  5. 必须会的SQL语句(六)查询

    1.基础的查询     1)重命名列     select name as '姓名' from 表名       2)定义常量列     select 是否 ='是' from 表名       3) ...

  6. Jquery设置select控件指定text的值为选中项

    <select name="streetid" id="streetid"> <option value="4">北 ...

  7. nodejs前端自动化构建

    http://99jty.com/?p=1257 http://www.jankerli.com/?p=1628 http://www.cnblogs.com/zhepama/archive/2013 ...

  8. Date and Time in PeopleCode

    Setting a Date to Null in PeopleCode To set a date to null in PeopleCode either use the SetDefault() ...

  9. Asp.NET MVC 中使用 SignalR 实现推送功能

    一,简介Signal 是微软支持的一个运行在 Dot NET 平台上的 html websocket 框架.它出现的主要目的是实现服务器主动推送(Push)消息到客户端页面,这样客户端就不必重新发送请 ...

  10. C# 鼠标悬停在datagridview的某单元格,显示悬浮框效果

    今天在做项目时,看到一软件做的悬浮框效果不错,从网上搜罗了一些资料,未见到有十分好的解决办法,只能自已动手,利用datagridview 的ToolTipText 来达到此效果. 以下是我简单实现的代 ...