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

linux下CppUnit的应用

    博客分类:
  • c++
阅读更多
   本文主要是论述CppUnit在C++项目中的应用,如何使用该单元测试,以及如何生成和查看测试报告和覆盖率报告。
   1.CppUnit 的安装。
   本文以在Ubuntu下开发C++项目为例。
   首先,读者需要选好速度较好的源去download一些应用程序,本文主要使用到gcc,cppunit,所以读者可以使用下面的命令去安装,使用sudo -i切换到root账户。
使用apt-cache search gcc 和apt-cache search cppunit去查看当前源中是否存在gcc,cppunit的应用程序。然后使用apt-get install gcc,cppunit去安装。如果依赖其他应用或者程序包,请相应下载。
  2.简单应用的设计。
   设计一个简单的计算器的类,能够进行加减乘除运算。头文件 Calculator.h 如下:
#include <string>
#include <stdexcept>
#include <cppunit/portability/Stream.h>

#ifndef CALCULATOR_H_
#define CALCULATOR_H_

class DivideByZeroException : public std::runtime_error
{
public:
   DivideByZeroException() : std::runtime_error( "Divide By Zero Exception" )
  {
  }
};

class Calculator {
public:
        Calculator();
        virtual ~Calculator();
        const double add(const double &a, const double &b) ;
        const double subtract(const double &a, const double &b);
        const double multiply(const double &a,const double &b);
        const double divide(const double &a,const double &b);

};

#endif /* CALCULATOR_H_ */

实现该类 Calculator.cpp。
#include "Calculator.h"

Calculator::Calculator() {
}

Calculator::~Calculator() {
}

const double Calculator::add(const double &a, const double &b) {
        return a + b;
}

const double Calculator::subtract(const double &a, const double &b) {
        return a - b;
}

const double Calculator::multiply(const double &a, const double &b) {
        return a * b;
}

const double Calculator::divide(const double &a, const double &b) {
        if(b <=0.000001)
        {
                throw DivideByZeroException();
        }
        return a / b;
}

接下来是书写测试代码,CalculatorTest.h
#ifndef CALCULATORTEST_H
#define CALCULATORTEST_H

#include <cppunit/extensions/HelperMacros.h>
#include <cppunit/TestFixture.h>
/*#include "MyTest.h"*/
#include "Calculator.h"

/*class CalculatorTest : public MyTest*/
class CalculatorTest : public CPPUNIT_NS::TestCase
{
  /*CPPUNIT_TEST_SUB_SUITE( CalculatorTest, MyTest);*/
  CPPUNIT_TEST_SUITE( CalculatorTest );
        CPPUNIT_TEST( testAdd );
        CPPUNIT_TEST( testSubtract );
        CPPUNIT_TEST( testMultiply );
        CPPUNIT_TEST( testDivide);
        CPPUNIT_TEST_EXCEPTION( testDivideByZero, DivideByZeroException );
  CPPUNIT_TEST_SUITE_END();

public:
  /* Initial something here, e.g, instance the Calculator.*/
  void setUp();

  /* destory something here, e.g, destory the Calculator instance.*/
  void tearDown();

        /* test method to test add function.*/
  void testAdd();
  /* test method to test subtract function.*/
  void testSubtract();
  /* test method to test multiply function.*/
  void testMultiply();
  /* test method to test divide function,but the divisor is not zero.*/
  void testDivide();
  /* test method to test divide function,but the divisor is zero.*/
  void testDivideByZero();
private:
        Calculator *calculator;
};

#endif

之后是测试代码的实现,CalculatorTest.cpp
#include <cppunit/config/SourcePrefix.h>
#include "Calculator.h"
#include "CalculatorTest.h"

CPPUNIT_TEST_SUITE_REGISTRATION( CalculatorTest );

void
CalculatorTest::setUp()
{
        std::cout<<"\nSetup()";
        calculator = new Calculator;
}

void
CalculatorTest::tearDown()
{
        std::cout<<"->tearDown()\n";
        delete calculator;
}

void
CalculatorTest::testAdd()
{
        double a = 2.0;
        double b = 3.0;
        const double result = calculator->add(a,b);
        CPPUNIT_ASSERT_DOUBLES_EQUAL( 5.0, result, 0.1 );
}

void
CalculatorTest::testSubtract()
{
        double a = 5.0;
        double b = 3.0;
        const double result = calculator->subtract(a,b);
        CPPUNIT_ASSERT_DOUBLES_EQUAL( 2.0, result, 0.1 );
}

void
CalculatorTest::testMultiply()
{
        double a = 5.0;
        double b = 3.0;
        const double result = calculator->multiply(a,b);
        CPPUNIT_ASSERT_DOUBLES_EQUAL( 15.0, result, 0.1 );
}

void
CalculatorTest::testDivide()
{
        double a = 5.0;
        double b = 3.0;
        const double result = calculator->divide(a,b);
        CPPUNIT_ASSERT_DOUBLES_EQUAL( 1.667, result, 0.1 );
}

void
CalculatorTest::testDivideByZero()
{
        double a = 5.0;
        double b = 0.0;
        try
        {
                const double result = calculator->divide(a,b);
        }
        catch(DivideByZeroException e)
        {
                throw;
        }
}


程序入口代码 Main.cpp
#include <cppunit/BriefTestProgressListener.h>
#include <cppunit/CompilerOutputter.h>
#include <cppunit/extensions/TestFactoryRegistry.h>
#include <cppunit/TestResult.h>
#include <cppunit/TestResultCollector.h>
#include <cppunit/TestRunner.h>


int
main( int argc, char* argv[] )
{
  // Create the event manager and test controller
  CPPUNIT_NS::TestResult controller;

  // Add a listener that colllects test result
  CPPUNIT_NS::TestResultCollector result;
  controller.addListener( &result );

  // Add a listener that print dots as test run.
  CPPUNIT_NS::BriefTestProgressListener progress;
  controller.addListener( &progress );

  // Add the top suite to the test runner
  CPPUNIT_NS::TestRunner runner;
  runner.addTest( CPPUNIT_NS::TestFactoryRegistry::getRegistry().makeTest() );
  runner.run( controller );

  // Print test in a compiler compatible format.
  CPPUNIT_NS::CompilerOutputter outputter( &result, CPPUNIT_NS::stdCOut() );
  outputter.write();

  return result.wasSuccessful() ? 0 : 1;
}

简单的Makefile代码:Makefile
#SRC=Main.cpp ./Calculator.cpp ./CalculatorTest.cpp
SRC=Main.cpp ./Calculator.cpp ./CalculatorTest.cpp
CXX=g++
CC=gcc
CXXFLAGS=-I./
libflag = -L/usr/local/lib
LDFLAGS=-lcppunit -lrt -lcurses -ldl
TESTFLAG = -ftest-coverage -fprofile-arcs
All:main

main: $(SRC)
        $(CXX) -g -o $@ $(CXXFLAGS) ${libflag} $(LDFLAGS) $(SRC) -pg ${TESTFLAG}
clean:
        rm -f *.o main 



运行make命令,生成可执行和程序main,
使用下列命令执行程序  ./main
结果如下:
CalculatorTest::testAdd
Setup()->tearDown()
 : OK
CalculatorTest::testSubtract
Setup()->tearDown()
 : OK
CalculatorTest::testMultiply
Setup()->tearDown()
 : OK
CalculatorTest::testDivide
Setup()->tearDown()
 : OK
CalculatorTest::testDivideByZero
Setup()->tearDown()
 : OK
OK (5)

我会继续完善,有些地方还不好的
分享到:
评论

相关推荐

    cppunit在linux下使用简介

    ### CppUnit在Linux下的使用方法详解 #### 一、引言 - **摘要:** 本篇文章将详细介绍如何在Linux环境下使用CppUnit来进行单元测试。通过本文的学习,读者可以掌握CppUnit的基本功能并应用于实际的单元测试中,...

    CPPUnit安装程序

    本篇文章将详细介绍如何在Visual C++ 6.0和Visual Studio 2005环境下安装和配置CPPUnit。 首先,让我们了解CPPUnit的基本概念。CPPUnit是从JUnit(Java编程语言中的单元测试框架)移植过来的,它提供了类似于JUnit...

    Cppunit 1.12 单元测试工具

    Cppunit 1.12 兼容多种操作系统,如 Windows、Linux 和 macOS,同时可以与各种构建系统(如 Make、CMake)和 IDE 集成。此外,还可以通过插件或其他工具(如 Google Mock)扩展其功能,实现更复杂的测试需求。 总的...

    Linux下的C-C++编程

    在Linux环境下,C++可以用于构建复杂的系统服务和应用程序,如服务器软件、图形用户界面和游戏。 3. **Linux系统调用**:Linux API主要由系统调用组成,如`open()`用于打开文件,`read()`和`write()`用于文件读写,...

    linux下开发小tool

    在Linux环境下开发小工具是一项常见的任务,这通常涉及到利用开源操作系统提供的强大命令行工具和编程环境来构建实用的脚本或应用程序。以下是一些关于在Linux下开发小工具的重要知识点: 1. **shell脚本**:Linux...

    单元测试自动化工具xUnit应用举例

    下面我们将详细介绍如何在Windows和Linux环境下配置和应用这两个工具。 首先,我们来看CPPUnit在Windows下的配置与应用。CPPUnit是一个用C++编写的开源单元测试框架。要使用CPPUnit,你需要从SourceForge.net下载...

    Linux 开发环境工具 指导

    随着Linux系统的广泛应用与普及,越来越多的开发者选择在Linux环境下进行软件开发工作。对于Linux新手来说,熟悉并掌握一套完整的开发工具集至关重要。本文将详细介绍一系列Linux下的开发工具,涵盖集成开发环境、...

    PKGBUILDs:PKGBUILD用于创建各种Arch Linux软件包(包括许多mingw-w64交叉编译器软件包)

    iconv,Boost,OpenSSL,CppUnit,Qt 5和Kirigami apple-darwin-*软件包,允许在Arch Linux下为MaxOS X构建。 osxcross和Qt 5(仍在实验中) 从AUR导入的其他软件包,需要稍加修改即可构建因此,如果您想改进我的...

    Linux软件开发环境.pdf

    Linux作为一款开放源代码的操作系统,已经被广泛应用于服务器、桌面、嵌入式系统等多个领域,它的软件开发环境也异常活跃和丰富,涵盖了从代码管理到构建、调试、测试、文档编写、性能分析等软件开发的各个阶段。...

    Python在C单元测试中的应用.pdf

    本文主要探讨了Python在C单元测试中的具体应用方法,包括单元测试的基本概念、关键技术以及实际操作步骤,并对比了使用Python进行单元测试与使用Cppunit等方案的优劣。 首先,单元测试是指开发者编写的测试代码,用...

    驱动的编写方法与调试

    在Windows下,可以使用Microsoft的WDF库,而在Linux下,通常使用Kernel-Mode Programming and Support (KMS)或DirectFB等库。 4. 调试驱动程序 调试驱动比普通应用程序更复杂,因为它们可能引发系统崩溃。Windows下...

    Support_Format.rar_Linux/Unix编程_Unix_Linux_

    7. **多线程编程**:pthread库提供了在Unix/Linux下进行多线程编程的接口,如pthread_create()、pthread_join()和pthread_mutex_*()函数用于同步和互斥。 8. **TestCase和单元测试**:在"Support Format"中,提到的...

    linux平台CEGUI及OGRE的安装配置.pdf

    在Linux平台上配置CEGUI(Common EventGui Toolkit)和OGRE(Object-Oriented Graphics Rendering Engine)是一项关键的技术任务,尤其对于在Intel CE(Consumer Electronics)嵌入式平台上开发图形用户界面的应用...

    cpp unit 例子 文档

    在大多数情况下,你可以通过包管理器(如Linux的`apt-get`或Mac的`brew`)来安装预编译的库。配置项目时,确保包含CppUnit头文件,并链接相应的库文件。 ### 三、编写测试用例 1. **创建测试类**:每个测试用例...

    python 在C代码测试中的应用

    - **操作系统**:Linux x86 - **编译器**:GCC version 3.4.5 - **Python**:Python 2.5 #### 示例代码 假设我们有一个名为`test.cpp`的C文件,其中定义了几个基本的数学运算函数(加、减、乘、除): ```cpp #...

    我们将常用的测试工具分为10类.docx

    **性能测试工具**衡量系统在高负载下的表现。常用工具包括: 1. LoadRunner:功能全面,但学习曲线陡峭。 2. JMeter:轻量级且开源,适合性能测试。 3. Web Bench、Load UI、HttpPerf、Siege、Gatling:各有特色,...

    moduletest-dio_unittest_C++_

    在本文中,我们将深入探讨基于C++的单元测试在嵌入式Linux系统中的应用,以"moduletest-dio_unittest_C++_"为例。这个项目包含了三个核心文件:main.cpp、dio.cpp和dio.h,它们共同构成了一个针对 dio 模块的测试...

    3partlib

    5. `libdb47d.lib` 和 `libdb47.lib`:与 `dll` 文件对应,这是 Berkeley DB 在 Windows 上的静态链接库文件,用于在不依赖外部 DLL 的情况下编译应用程序。 综上所述,"3partlib" 可能是一个包含了 CppUnit(一个 ...

Global site tag (gtag.js) - Google Analytics