第一个完整的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类的程序,解决遇到的问题。

  

 1 #include <cppunit/extensions/HelperMacros.h>
 2 #include <Point.h>
 3
 4 class testpoint :public CppUnit::TestFixture
 5 {
 6     CPPUNIT_TEST_SUITE(testpoint);
 7     CPPUNIT_TEST(testget);
 8     //CPPUNIT_TEST(testrotate);
 9     CPPUNIT_TEST_SUITE_END();
10 public:
11     void setUp();
12     void tearDown();
13     testpoint();
14     //~testsolver();
15     void testget();
16     //void testrotate();
17 };

test_point.h

 1 #include "test_point.h"
 2 #include "Point.h"
 3 #include <string>
 4 #include<iostream>
 5 #include <cppunit/TestCase.h>
 6 #include "cppunit/TestAssert.h"
 7
 8 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(testpoint, "alltest");
 9
10 testpoint::testpoint()
11 {
12 };
13
14 void testpoint::setUp()
15 {
16     std::cout << "test begin" << std::endl;
17 };
18
19 void testpoint::tearDown()
20 {
21     std::cout << "test end" << std::endl;
22 };
23
24 void testpoint::testget()
25 {
26     Point point1(3, 4);
27     int resultx = point1.getX();
28     int resulty = point1.getY();
29     CPPUNIT_ASSERT(resultx == 3);
30     CPPUNIT_ASSERT(resulty == 4);
31 }

test_point.cpp

 1 #include <cppunit/TestResultCollector.h>
 2 #include <cppunit/BriefTestProgressListener.h>
 3 #include <cppunit/TextOutputter.h>
 4
 5 int main()
 6 {
 7     CppUnit::TestResult r;
 8     CppUnit::TestResultCollector rc;
 9     r.addListener(&rc); // 准备好结果收集器
10
11     CppUnit::TestRunner runner; // 定义执行实体
12     runner.addTest(CppUnit::TestFactoryRegistry::getRegistry("alltest").makeTest());
13     runner.run(r); // 运行测试
14
15     CppUnit::TextOutputter o(&rc, std::cout);
16     o.write(); // 将结果输出
17
18     system("pause");
19
20     return rc.wasSuccessful() ? 0 : -1;
21 }

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;

今天主要了解测试程序编写的相关细节,明天继续测试稍复杂一些的类。

时间: 2024-08-24 13:19:23

第一个完整的cppunit单元测试程序的相关文章

记自己的第一个完整的java web项目

我是从asp.net平台转到java平台的.基于asp.net平台开发网站的快速便捷性,工作几年来大小网站多少也写了6.7个.但是转到java后,因为是在一家大公司,而且做的功能也比较单一,局限于此,一直未能使用java来写一个web站点.后来正好大学同学从事淘宝电商,让我帮他弄一个网站,所以我就想到了使用java来开发这个站点,正好练手一下java顺便也是使用一下bae,因为很早之前就接触到了BAE,但是问题在于无法部署asp.net的网站,所以只好作罢,这次正好是一个难得的机会.     考

第一个完整的iOS小demo:引导

断断续续地熟悉了一些常用的控件的动态创建方式,也就是用纯代码创建,不用Interface Builder来拖放控件,也动手一一去实现了.基础的东西熟悉之后还是觉得很迷惘,不知道可以做些啥,领导建议让我直接查看公司现有的App源码,让我把那个引导功能给仿出来~ 有了目标,接下来就要分析怎么去实现了,不用第三方库,最简单的大概就是用UIScrollView来实现了,主要有这么几点: 4个页 每页上面都有一张大图 每页上面都有显示当前页的标识(页码) 最后一页应该有个跳过的按钮 先放上成品图,然后再放

第一个完整一点的项目记录下自己的坎坷之路

这是一个管理系统  今天实现了注册和登陆的功能以及过滤器判断是否登录访问 这是一个注册和登录的界面 用到了前端页面中自带的一点H5的标签和属性---巩固下 邮箱格式 :type="email"  不能为空:  required="required" js 添加提示语句 : document.getElementById("agree").setCustomValidity("需同意协议"); 这是一个判断是否有重复用户的js

写了人生中第一个完整模块的用例

我好激动,因为这次机会终于争取来了 以前都是做项目测试,单个网站的测试,1个小时以内结束 经过不断的努力争取,领导终于分给我了一个完整的功能模块 其实我自己完全可以利用业余时间写用例,但是没人反馈,没有与开发和策划的互动 这样的努力是低效的 我更喜欢在工作中进行更多的交流与学习,因为有反馈 咳咳,回到正题 这次我和同事的任务是通测xx小程序,我先写"捐赠"模块的用例,同事评估后再说后续工作 经过几经折腾,终于写出了有正确前置条件的"捐赠"模块的用例,共计115条,减

“洋垃圾”复活记:夏普shl25刷机救砖实战指南(也许是网上第一篇完整的SHL25的刷机教程)

废话: 两个月前在网上发现一篇二手手机购买使用评测,手机外观漂亮,机器参数牛逼,价格白菜价. 很久没折腾了,瞬间手痒想买来做备用机,立马某宝下单.快递很快,第二天就到了.开箱很新, 不仔细看看不出是二手机,九成新的,赚大了,接下来就看人品能用多久了. 声明:这不是广告,某宝没卖下架啦o(∩_∩)o 哈哈,教程仅供参考,刷机有风险的哟 日媒解析: AQUOS SERIE SHL25拥有最先进的CPU.高画质的照相机.低耗能的IGZO液晶屏,同时具有防水.防尘.full segment等功能,最大传

2016-1-5第一个完整APP 私人通讯录的实现 4:编辑联系人

一:建立编辑联系人的controller,并使其拥有模型contact,且有协议.代码如下 #import <UIKit/UIKit.h> #import "contact.h" @class EditContactViewController ; @protocol EditContactViewControllerDelegate<NSObject> - (void) editContactViewController:(EditContactViewCon

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

#include <stdio.h>//引用相关的外部库,stdio.h包含了终端读写数据的代码 //程序入口,程序通过main函数的返回值判断程序是否运行成功,0表示成功,非0表示程序运行时除了问题 //早期的ANSI C标准中main的返回值可以是void类型,但是C99中必须是int int main(){ int decks; puts("输入有几副牌");//在终端打印数据 scanf("%i",&decks);//%i 接收一个整数

2016-1-5第一个完整APP 私人通讯录的实现 3:添加联系人

一:创建模型对象:contact用于存放数据,也便于读取加载 #import <Foundation/Foundation.h> @interface contact : NSObject @property (strong, nonatomic) NSString *name; @property (strong, nonatomic) NSString *tel; @end 二:在addContackViewController中设置代理协议,并监听输入栏 #import <UIKi

2016-1-7第一个完整APP 私人通讯录的实现 5:保存数据

一:登陆界面 1):用户点击登陆按钮并成功登陆后,根据此时的开关情况选择是否保存数据,代码如下: if ([acount isEqualToString:@"zhangsan"]&&[password isEqualToString:@"123"]) { [self performSegueWithIdentifier:@"ContactsViewController" sender:nil]; [MBProgressHUD sh