使用Boost进行c ++单元测试

时间:2010-12-08 01:30:48

标签: c++ unit-testing

我是单元测试的新手,我有以下非常基本的程序:

#include "stdafx.h"


// classes example
#include <iostream>
using namespace std;

class CRectangle {
    int x, y;
  public:
    void set_values (int,int);
    int area () {return (x*y);}
 bool isEq ();
};

void CRectangle::set_values (int a, int b) {
  x = a;
  y = b;
}

bool CRectangle::isEq () {
  if(x==y)
  {
   return true;
  }
  else
  {
   return false;
  }


}
int main () {
  CRectangle rect;
  rect.set_values (3,3);
  cout << "area: " << rect.area();
  cout << "  isEq: " << rect.isEq() << "  \n";
  return 0;
}

我想知道如何测试方法isEq?我想要100%的代码覆盖此方法,我想使用Boost测试框架。有任何想法吗?我正在使用VS 2009 SP1,我将构建和运行什么?我对单元测试非常困惑。

更新

感谢斯图尔特,然而我所做的仍然没有意义。我知道以下代码具有以下文件名:

//FILENAME: test.cpp
#include "stdafx.h"
#define BOOST_TEST_MODULE isEq Test
#include <boost/test/included/unit_test.hpp>
#include "CRectangle.h"

BOOST_AUTO_TEST_CASE(isEq_test)
{
    CRectangle rect;
    rect.set_values(5,5);
    BOOST_CHECK_EQUAL(rect.isEq(), true);
    rect.set_values(23,9);
    BOOST_CHECK_EQUAL(rect.isEq(), false);
}

// FILENAME: CRectangle.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "CRectangle.h"
//#include <boost/test/included/unit_test.hpp>

// classes example
#include <iostream>
using namespace std;


void CRectangle::set_values (int a, int b) {
  x = a;
  y = b;
}

bool CRectangle::isEq () {
  if(x==y)
  {
      return true;
  }
  else
  {
      return false;
  }


}

int main () {
 CRectangle rect;
 rect.set_values (3,3);
 cout << "area: " << rect.area();
 cout << "  isEq: " << rect.isEq() << "  \n";
 return 0;
}

//FILENAME: CRectangle.h
//void CRectangle::set_values (int a, int b);
//bool CRectangle::isEq ();

#ifndef CRECTANGLE_H
#define CRECTANGLE_H

class CRectangle {
    int x, y;
  public:
    void set_values (int,int);
    int area () {return (x*y);}
    bool isEq ();
};


#endif

// FILENAME: stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently, but
// are changed infrequently
//

#pragma once

#include "targetver.h"

#include <stdio.h>
#include <tchar.h>



// TODO: reference additional headers your program requires here
#ifdef _UT
#define ut_private public
#define ut_protected public
#else
#define ut_private private
#define ut_protected protected
#endif

我想提醒您,我正在使用Visual Studio 2008 SP1(将此项目作为win32控制台应用程序运行)。每当我构建以下文件时,它都会给我带来错误。我也不确定Boost lib应该如何给我测试结果?是否会打开一个新窗口?究竟会发生什么?

2 个答案:

答案 0 :(得分:4)

测试它的最简单方法是做这样的事情(我不是要写出很好的测试用例,我会把它留给你):

#define BOOST_TEST_MODULE isEq Test
#include <boost/test/included/unit_test.hpp>

#include "CRectangle.h"

BOOST_AUTO_TEST_CASE(isEq_test)
{
    CRectangle rect;
    rect.set_values(5,5);
    BOOST_CHECK_EQUAL(rect.isEq(), true);
    rect.set_values(23,9);
    BOOST_CHECK_EQUAL(rect.isEq(), false);
}

如果您这样做,则无需构建Boost.Test,只需包含标题即可。希望有所帮助!

P.S。作为旁注,你可能想为你的函数选择一个命名方案并坚持下去 - 让set_valuesisEq看起来有点不一致,因为它的价值......

答案 1 :(得分:2)

继续回答:

需要导出源文件中的类和函数,以便它们可以在单元测试文件中使用,如下所示:

//CRectangle.h

#define DLLEXPORT __declspec(dllexport)

class DLLEXPORT CRectangle
{
...
}

// CRectangle.cpp

void DLLEXPORT  CRectangle::set_values (int a, int b)
{
...
}

bool DLLEXPORT  CRectangle::isEq ()
{
..
}

编译CRectangle source.lib。

最后将Unit Test程序与source.lib链接,包括“CRectangle.h”并调用 CRectangle中的函数。

希望这会有所帮助..