`
CharlesCui
  • 浏览: 427413 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

[分享我的经验]Cpp项目测试方案设计及实现

阅读更多

##第一次做Cpp项目的测试设计,代码的语法还不熟悉就要操刀设计了,
##我觉得基本功扎实就不用担心用什么工具或者语言,小说中少林寺厉害就厉害在基本功了.

代码结构:



 
bin:
该目录存放的文件是httpd,
这份可执行文件是集成测试的web服务.

build:



 
该目录分两级,
分别存放debug版本和release版本测试代码的编译结果.
测试期间,我们只需要用到debug版本,该版本的代码都是可以通过gdb进行调试的.

data:


 
该目录中各子目录以模块区分,
分别存放各个模块的测试数据,
其余顶层目录中的文件为本测试项目共享测试数据.

include:


 
该目录分两级,

第一级为各个模块编译成可执行文件时所需要的头文件,
此时的编译结果为每个模块一个编译结果,结果中包含该模块的全部测试集.

第二集为bvt测试头文件,
bvt测试头文件和上一层头文件的区别是,bvt的头文件中会注释掉某些测试集或测试用例,
并且会把各个模块的测试代码编译到一个输出文件中去,当执行bvt编译后的文件时,
那些在bvt头文件目录下的各个头文件中没有注释的测试用例就会执行.
这样做最大的好处是,测试代码不需要维护两份,只需要多维护一份头文件即可.

lib:
存放的是测试工程所依赖的第三方库文件

logs:
该目录存放的是集成测试web服务的日志文件

report:


 
该目录存放的是测试报告数据文件,
其中report.xsl是用于渲染测试报告xml文件的样式文件.

source:


 
该目录存放的是各个模块的测试代码,以模块名区分,
以及bvt的入口函数文件,还有utils工具类文件,

以sorce中的webserver测试代码为例:
source/webserver:


 
该模块的类实现必须放到:
<模块名>_test.cpp文件中,
该模块的测试代码放到test_开头的cpp文件中,
该模块编译可执行程序是所需的入口函数必须单独放到main.cpp文件中,绝不可和其它文件混淆.

这样的设计保证了:
1.测试类的实现与测试用例分开.各测试用例所用到测试模块的公共部分可以放到类实现中去,比如setup和teardown函数.
2.做bvt编译的时候,如果多个模块都具有main函数,由于main方法重复定义,编译会无法通过,
3.做bvt编译的时候,负责编译的Makefile可以通过排除式查找,将文件名不为main.cpp代码文件统一编译,

比如可以通过如下简洁的命令实现多个CPP文件的编译:
BVT_CPP=$(shell find $(HOME)/source -name '*.cpp' -type f|grep -v 'main.cpp'|grep -v 'performance.cpp')
这条命令说明:
查找HOME下source目录下名为cpp后缀的非main.cpp文件,并且拍出performance.cpp文件,将剩下的文件作为bvt所需的cpp文件来编译.

views:
该目录存放了集成测试web服务所需要的视图文件.

Makefile:


 
该文件实现各个模块的编译与清理,
共用的部分都定义为一个变量,
需要集成编译的cpp比如bvt的cpp,通过制定上面source目录的规则,让find命令可以将cpp搜索出来,
这样就不需要把很多的cpp文件写死到Makefile中了.

其它依赖:
1.Cppunit1.12.1:本次测试采用Cppunit作为基础框架
2.libcurl:该库实现了http请求的发送以及实现urlencode
3.syslog:测试过程中的详细都输出到同一日志中,由syslog负责收集.
其它

 

集成测试平台:

TestFixure:

左边是测试用例集,每个用例集包含了不同数量的 TestCase ,分别对应被测试的各个模块,

         performance_test 是性能测试用例集,不单独对应某个模块)

 

ExecStdout:

         右边是每个测试用例集的执行结果,可以通过点击每个用例集右边的超链接 Run 来执行某个用例集。

         (需要注意 的是, webserver_test 用例最多,并且包含很多大文本测试,执行起来速度很慢,要耐心等待)

 


 

Run:

测试执行,当点击每个测试集后面的 Run 时,页面会弹出提示,告诉你耐心等待。

(大家可以拿 translation_engine_test 来试用下,该用例执行速度很快)

 

测试执行结束后,系统会跳出提示框通知执行者 Case 执行完毕,并且可以在 ExecStdout 中看到执行的结果。

执行结果的最后,目前有如下重要的信息:

 

0.01user 0.00system 0:04.08elapsed 0%CPU (0avgtext+0avgdata 0maxresident)k

 

0inputs+0outputs (0major+1649minor)pagefaults 0swaps

 

这两行信息包含了该测试集的 CPU 执行时间,用户态时间和内核态时间,还可以检测该程序所用的私有数据区大小,私有堆栈大小, Socket 输入输出字节数,文件读写 IO 情况等。

 



 

 

 

 

 

Report:

该区域展示的是某个模块的CppUnit测试执行报告。

 


  • 大小: 25.6 KB
  • 大小: 10.6 KB
  • 大小: 20.1 KB
  • 大小: 51.9 KB
  • 大小: 20.9 KB
  • 大小: 20.5 KB
  • 大小: 46.3 KB
  • 大小: 13.4 KB
  • 大小: 44.1 KB
  • 大小: 24.9 KB
  • 大小: 37 KB
  • 大小: 81.8 KB
  • 大小: 30.8 KB
  • 大小: 34.4 KB
  • 大小: 25 KB
  • 大小: 121.7 KB
  • 大小: 63.1 KB
  • 大小: 63.7 KB
  • 大小: 68.3 KB
  • 大小: 71.2 KB
  • 大小: 100.9 KB
分享到:
评论
4 楼 ludatong110 2011-01-28  
太厉害了,我以前是搞Java的,C学过一点,C++正在入门。。
3 楼 piao_bo_yi 2010-12-24  
跑题了吧?测试方案在哪里?
2 楼 CharlesCui 2010-12-24  
vim,一般远程登录到linux主机上操作的话,那个机器肯定装了vim,
而且我们的机器太多了,不能每个都装自己喜欢的ide,所以就用通用的vim了。
1 楼 hellojinjie 2010-12-23  
你用的是什么 IDE? 写代码的时候只用 VIM ?

VIM 感觉有点繁琐,

相关推荐

    cpp-C编译器测试用例最小测试运行器和公共测试结果的公共数据库

    总之,“cpp-C编译器测试用例最小测试运行器和公共测试结果的公共数据库”为C语言编译器的测试提供了一整套完善的解决方案,不仅有助于提升编译器的质量,也有助于提高整体的编程环境和代码质量。通过深入研究和应用...

    cpp-ncnn实现yolov2lenet等测试用

    首先,ncnn的设计理念在于提供一个轻量级、高效的解决方案,适用于资源有限的移动设备。它摒弃了对第三方库的依赖,如CUDA、OpenCV等,以减少编译复杂性和运行时的内存占用。这一特性使得ncnn在集成到移动应用中时...

    cpp-CPPJWT实现JSONWebTokensJWT的C14库

    在C++项目中,通过`arun11299-cpp-jwt-1cbc5eb`这个库版本,开发者可以方便地集成JWT功能,提高应用的安全性。该库可能包含了头文件、源代码、示例代码以及构建脚本,使得在各种C++环境中集成和测试变得简单。为了...

    CPP工具大全.zip 软件下载安装包

    "CPP工具大全.zip"是一个专为C++程序员设计的软件下载安装包,它包含了一系列有助于提升编码、调试、测试和优化C++项目的实用工具。下面我们将详细探讨这些工具及其功能,帮助你更好地理解和利用这些资源。 1. **...

    cpp-hinginx实现用C进行Web应用开发的一个Nginx分发

    5. **C++11及更高版本**:cpp-hi-nginx可能使用了C++11或更新的标准,需要熟悉这些新特性的使用,如智能指针、lambda表达式、右值引用等。 6. **多线程与并发**:Nginx处理高并发请求的能力强大,理解C++中的线程...

    yaml-cpp-master_library_yaml_cpp_

    "yaml" 标签表明这个库与YAML相关,而 "cpp" 明确指出这是针对C++语言的实现。 从压缩包文件名称 "yaml-cpp-master" 我们可以推断,这包含了yaml-cpp库的主分支源代码。通常,"master" 分支代表了项目的最新稳定...

    cpp-Leetcode问题的完整解决方案每日更新

    "cpp-Leetcode问题的完整解决方案每日更新"这个项目,显然是一个专门针对 LeetCode 题目的 C++ 解决方案集合,且每天都会更新,确保包含最新的题目和解法。 首先,让我们来了解一下 LeetCode 的核心价值。LeetCode ...

    cpp-ratelimit采用C编写Smyte的高性能速度限制器

    cpp-ratelimit是一个基于C语言实现的高性能速度限制器,主要设计用于限制网络请求的频率,以防止过载服务或保护系统免受恶意攻击。这个库由Smyte团队开发,旨在提供轻量级且高效的限速解决方案。下面将详细讨论cpp-...

    cpp-使用C实现的RetinaFace探测器

    在这个项目中,我们将深入探讨如何使用C++语言来实现这一强大的工具。 **C++实现的关键组件** 1. **深度学习模型**:RetinaFace的核心是基于深度学习的模型,通常采用预训练的神经网络,如SSD(Single Shot ...

    cpp-libuhttp一个用于嵌入式Linux非常小巧快速的HTTP库

    cpp-libuhttpd是一个专为嵌入式Linux系统设计的轻量级、高性能的HTTP服务器库,它利用了libev事件库和http-parser解析器,提供了一个简洁而强大的HTTP服务解决方案。在本文中,我们将深入探讨cpp-libuhttpd的关键...

    cpp-x86虚拟化抽象框架

    本文将深入探讨一种名为“cpp-x86虚拟化抽象框架”的技术,它是用C++编写的,专注于x86架构下的虚拟化解决方案。 一、虚拟化基础 虚拟化技术的核心是将物理硬件资源(如CPU、内存和磁盘)抽象为虚拟资源,使得每个...

    log4cpp6.0版本(已编译通过)

    **标题详解:** "Log4cpp 6.0版本(已...综上所述,这个压缩包提供的log4cpp 6.0版本是一个经过验证、可直接使用的日志解决方案,涵盖了日志记录的基本要素,同时也具备一定的灵活性和可扩展性,适用于多种C++项目。

    eclipse-cpp 版本

    CDT是Eclipse专门为C和C++开发者设计的一套工具集,提供了代码编辑、调试、构建以及项目管理等功能。 在Eclipse CDT中,主要包含以下核心功能: 1. **代码编辑器**:提供语法高亮、自动完成、代码折叠、错误检查等...

    libjson-rpc-cpp.rar

    《在Windows环境下构建json-rpc-cpp项目》 json-rpc-cpp是一个强大的开源库,主要用于实现基于JSON-RPC协议的客户端和服务器端通信。它最初设计为在Linux环境中编译,但通过适当的修改,我们可以使其在Windows系统...

    cpp-magmaserverdaemon是一个加密的电子邮件系统

    在文件结构方面,提供的 "magma-master" 压缩包很可能是cpp-magmaserverdaemon的源代码仓库主分支,包含项目的核心代码、配置文件、测试用例以及其他辅助资源。开发者可以从中获取项目的完整实现,进行编译、调试和...

    cpp-LEAR是一个以惊人效率提供静态资源的简单HTTP服务器

    cpp-LEAR正是针对这一需求,提供了高效的解决方案。 一、cpp-LEAR的设计理念 cpp-LEAR的设计理念是简洁而高效。它使用C++语言编写,充分利用了C++的特性,如模板、STL(标准模板库)和异步编程,以实现高性能和低...

    cpp-OpenSourceCarControl汽车自动驾驶相关的软硬件项目

    【cpp-OpenSourceCarControl汽车自动驾驶相关的软硬件项目】是一个开源项目,专注于为汽车自动驾驶提供全方位的软硬件解决方案。这个项目结合了C++编程语言,展现了C/C++在汽车控制领域的应用,同时也涉及到了开发...

    cpp-ShuffleNet这是ShuffleNet的一个快速实现caffe实现

    具体实现上,cpp-ShuffleNet项目可能包含了以下组件: 1. **模型定义**:在`prototxt`文件中,定义了ShuffleNet的网络结构,包括卷积层、池化层、激活函数(如ReLU)、Grouped Convolution和Channel Shuffle操作等...

    cpp-benchmarkGoogle提供小型微基准测试支持库

    通过这些功能,开发者可以对比不同实现方案的性能,从而选择最佳实践。 **使用方法** 1. **安装与集成**: `google-benchmark`通常可以通过包管理器(如`vcpkg`、`conan`或`cmake`)轻松添加到项目中。首先,你需要...

Global site tag (gtag.js) - Google Analytics