51Testing软件测试论坛

标题: cppuint结合实际应用的一个简单例子 [打印本页]

作者: dyjyhx    时间: 2006-2-14 14:41
标题: cppuint结合实际应用的一个简单例子
新建一个基于对话框的exe程序。例如名称为cppunit_example
包含
cppunit_example.cpp
cppunit_exampledlg.cpp

测试类
在cppunit_example工程中新建一个名称为CPlusTest的头文件CPlusTest.h,建立一个测试类CPlusTest:

#pragma warning(push, 3)
#include "C:\\Program Files\\cppunit-1.10.2\\include\\cppunit\\ui\\mfc\\TestRunner.h"
#include "C:\\Program Files\\cppunit-1.10.2\\include\\cppunit\\TestCase.h"
#include "C:\\Program Files\\cppunit-1.10.2\\include\\cppunit\\extensions\\HelperMacros.h"
#pragma warning(pop)
class CPlusTest : public CppUnit::TestFixture
{
CPPUNIT_TEST_SUITE(CPlusTest);
        CPPUNIT_TEST(TestEqual1);
        CPPUNIT_TEST(TestEqual2);
        CPPUNIT_TEST_SUITE_END();

public:
        CPlusTest(){};
        virtual ~CPlusTest(){};
        void setUp();
        void tearDown();
        void TestEqual1();
        void TestEqual2();
private:
        int x;
        int y;
};
新建一个名称为CPlusTest的实现文件CPlusTest.cpp
#include”stdafx.h”
#include”CPlusTest.h”
        void CplusTest::setUp()
        {
                x = 1;
                y = 2;
        };
        void CplusTest::tearDown()
        {
                x = 0;
                y = 0;
        }       
        void CplusTest::TestEqual1()
        {
                //CPPUNIT_ASSERT(x + y == 4);
        Cplus puls;
        int nResult = puls.Add(x+y);
        CPPUNIT_ASSERT_EQUAL(30,nResult);
}
        void CplusTest::TestEqual2()
        {
                //CPPUNIT_ASSERT(x + y == 3);
        Cplus puls;
        int nResult = puls.Add(x+y);
        CPPUNIT_ASSERT_EQUAL(3,nResult);
        }

在cppunit_example.cpp文件的开始加上下面语句:
CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(CPlusTest, "plusTest");


在cppunit_example.cpp文件的InitInstance中只需要具有下面的语句
CppUnit::MfcUi::TestRunner runner;
CppUnit::Test *pSuite = CppUnit::TestFactoryRegistry::getRegistry("plusTest").makeTest();
        runner.addTest(pSuite);
        runner.run();
此处的runner是一个mfc图形界面的,也可以是文本方式的。

说明:   现在在图形化界面中包含了三层树结构。第一层是plusTest,第二层是CPlusTest,第三层是TestPlus1和TestPlus2。 可以给getRegistry不指定参数使用默认注册的test case,即“All Tests”。

根据测试代码编写产品代码
编写完上面的测试代码后,进行编译。编译肯定通不过,编译器会告诉我们CPlus类没有声明,因为我们还没有实现CPlus类呢!现在的工作就是马上实现CPlus类,让编译通过。现在你应该了解一点“测试驱动“的味道了吧?

在cppunit_example.dsw中加入一个MFC Extension Dll的新Project,在这个Project 中加入类CPlus,它的声明如下
class AFX_EXT_CLASS CPlus
   {
      public:
          CPlus();
          virtual ~CPlus();
      public:
          int Add(int nNum1, int nNum2);
  };
仅有一个方法,就是我们的测试代码要测试的那个方法。来看看它的实现:
int CPlus::Add(int nNum1, int nNum2)
   {
        return nNum1+nNum2;
   }
把这个工程加入到你的测试工程中去,现在让前面那个包含测试代码的Project dependent这个Project,include 相关头文件 (注意把新工程生成的DLL文件链接到你的测试工程中去),Rebuild All,你会发现编译已通过。

其中
int CPlus::Add(int nNum1, int nNum2)
   {
        return nNum1+nNum2;
   }
就是你要编写的代码。也是你需要测试的代码。


(根据各位大虾的资料进行的总结)

[ 本帖最后由 dyjyhx 于 2006-2-14 14:42 编辑 ]
作者: dyjyhx    时间: 2006-2-14 14:47
这就是极限编程的要点,先写测试驱动,测试驱动一般无法编译的,因为你还没有被测试的代码。根据测试驱动编写被测代码。
就像上面的例子一样,我们先编写代码TestEqual1();,测试两个数的相加。根据测试代码,编写被测函数Add();
作者: dyjyhx    时间: 2006-2-15 10:39
呵呵,那当然,钩上才能 dependent上,不然肯定编译不过去的




欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2