[转]使用CPPUNIT如何建立一个基于MFC的GUI测试框架

 第一步:使用VC建立基于对话框的工程

打开VC,在File菜单项下选择New,选择Projects,选择MFC AppWizard(exe)条目,工程名Project name、工程位置Location信息你自己设定,我们这里工程名设为MyTest,存放在D:/MyTest  

点击OK确认后,选择Dialog based选项

按Finish按钮后,一个空的基于对话框的工程就建立起来了
点击工具栏红色的感叹号!这个工程可以运行起来,我们可以看到一个对话框,我们需要的不是这个窗口,而是基于cppunit的GUI的窗口,为了实现这个GUI窗口,需要调用cppunit的相关文件,继续下面的步骤:

第二步:加入CppUnit 库文件:
在第一步创建完工程后,我们可以把第一章节编译的CppUnit的库文件加入到VC的这个工程中,等我们需要使用CppUnit的时候,就可以去调用这些库文件。
点击ProjectAdd To ProjectFiles,将CppUnit的库文件:cppunitd.lib,cppunitd_dll.lib,testrunnerd.lib加入到工程中。
(说明:我们前面对CppUnit已经编译过,编译后的库文件存放在D:/cppunit-1.12.0/lib目录下)





第三步:设置CppUnit头文件和lib库文件路径、打开RTTI开关、给dLL库设置环境变量:

A、        在VC中,点击ToolsOptionsDirectories中设置CppUnit 的include文件路径和lib文件路径:
说明:include在D:/cppunit-1.12.0
      lib在D:/cppunit-1.12.0


B、        点击菜单Project roject SettingsC++ Language:
打开RTTI开关。具体位置


  C、拷贝TestRunnerd.dll

CppUnit提供一种基于GUI的测试环境,这个环境需要testrunnerd.dll文件,我们后面会使用CppUnit的这种GUI环境,所以,我们提前把这个库文件testrunnerd.dll拷贝到工程路径即D:/MyTest下。



第四步:屏蔽工程对话框

在工程MyTest.cpp文件中(即:工程名.cpp文件),
找到BOOL CMyTestApp::InitInstance()方法,查找下面的蓝色代码,这些代码的作用是显示我们刚才看到的对话框 (我想你大概能看懂), 现在将它们使用/*   */注释掉:
BOOL CMyTestApp::InitInstance()
{
        AfxEnableControlContainer();

        // Standard initialization
        // If you are not using these features and wish to reduce the size
        //  of your final executable, you should remove from the following
        //  the specific initialization routines you do not need.

#ifdef _AFXDLL
        Enable3dControls();                        // Call this when using MFC in a shared DLL
#else
        Enable3dControlsStatic();        // Call this when linking to MFC statically
#endif

/*
        CMyTestDlg dlg;
        m_pMainWnd = &dlg;
        int nResponse = dlg.DoModal();
        if (nResponse == IDOK)
        {
                // TODO: Place code here to handle when the dialog is
                //  dismissed with OK
        }
        else if (nResponse == IDCANCEL)
        {
                // TODO: Place code here to handle when the dialog is
                //  dismissed with Cancel
        }
*/

        // Since the dialog has been closed, return FALSE so that we exit the
        //  application, rather than start the application's message pump.
        return FALSE;
}

做完上面的操作后,执行红色感叹号!你会发现原有的对话框已经被屏蔽了,现在要想让这个工程运行后,出现如下的界面,需要我们增加下面这个对话框的代码,呵呵,不要怕,这个对话框CppUnit工具已经提供了这个对话框的代码,我们按照第六步的操作使用现成的就可以了。


第五步:实现CppUnit的GUI测试模式,并且创建CppUnit的执行器和测试工厂

A、在BOOL CMyTestApp::InitInstance()中,添加如下红色代码:

BOOL CMyTestApp::InitInstance()
{
        AfxEnableControlContainer();

        // Standard initialization
        // If you are not using these features and wish to reduce the size
        //  of your final executable, you should remove from the following
        //  the specific initialization routines you do not need.

#ifdef _AFXDLL
        Enable3dControls();                        // Call this when using MFC in a shared DLL
#else
        Enable3dControlsStatic();        // Call this when linking to MFC statically
#endif

        //定义CppUnit的测试执行器
        CppUnit::MfcUi::TestRunner runner;

        //CppUnit为被测对象定义一个测试工厂(这里取名叫FactoryTest):
        CppUnit::TestFactoryRegistry &registry
= CppUnit::TestFactoryRegistry::getRegistry("FactoryTest");

        //并将工厂添加到测试执行器中
    runner.addTest( registry.makeTest() );

        //运行执行器,显示执行器GUI界面
        runner.run();

        /*
        CMyTestDlg dlg;
        m_pMainWnd = &dlg;
        int nResponse = dlg.DoModal();
        if (nResponse == IDOK)
        {
                // TODO: Place code here to handle when the dialog is
                //  dismissed with OK
        }
        else if (nResponse == IDCANCEL)
        {
                // TODO: Place code here to handle when the dialog is
                //  dismissed with Cancel
        }
        */

        // Since the dialog has been closed, return FALSE so that we exit the
        //  application, rather than start the application's message pump.
        return FALSE;
}
继续执行红色感叹号!会发现程序报很多的错,为什么?
因为我们刚才加入的代码使用了CppUnit类,但这个类在哪里?系统并不知道,所以还需在这个文件头加入该类的头文件(不用怕,这些头文件不用我们自己去找,CppUnit工具手册中已有说明)
#include <cppunit/extensions/TestFactoryRegistry.h>
#include <cppunit/ui/mfc/TestRunner.h>

第六步:定义测试套文件,向测试套中添加测试用例
做完上面的操作后,执行红色感叹号!你会看到什么?
如果你前面操作无误的话,你会看到如下界面:

注意:我们需要的GUI界面出来了,点击Browse,可以看到测试工厂,但是没有测试套,
自然也无法向测试套添加测试用例,也就是说,现在还不能通过用例测试IsCodeLine函数。
那好,让我们先来添加测试套:

按照下面示图加入测试类的测试套头文件和测试套源文件,文件名可以随便,我们这里使用TestSuite.h和TestSuite.cpp:





TestSuite.h中的代码如下:

#include "cppunit/extensions/HelperMacros.h"

class myTestSuite : public CppUnit::TestFixture {

        CPPUNIT_TEST_SUITE(myTestSuite);   // 声明一个TestSuite,名称myTestSuite
        CPPUNIT_TEST( testcase_001);        //这里向测试套里面添加测试用例
        CPPUNIT_TEST_SUITE_END();         // TestSuite声明完成

public:
        /*
        这里应该定义你的测试用例
        */
                // 定义测试用例
        void testcase_001();

};

TestSuite.cpp中的代码如下(注意头文件要做相应的修改):
#include "stdafx.h"

#include "TestSuite.h"

// 把TestSuite"测试套添加到测试工厂中,测试工厂"FactoryTest"

CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(myTestSuite,"FactoryTest" );

#define RET_OK 0
#define RET_FAIL 1
void myTestSuite::testcase_001()
{
//这是一个测试用例,但是这个用例里面现在是空的
}

当我们做完以上操作后,执行红色的感叹号!,我们会看到如下界面:

点击Browse,可以看到

显然,我们利用CppUnit的整个框架已经搭起来了,测试工厂已经有了,测试套也有了,测试用例也有了,但是注意:用例是空的!我们的被测试的函数还没有登场,
前面的操作在以后的测试过程中都是一样的,我们可以重复进行。
目前的问题是怎样在上面的框架中添加被测试的对象,对其进行测试?


第七步:添加被测对象CCounter。

将被测对象所在文件(Counter.h和Counter.cpp) 添加到工程中:
点击FileNewC/C++ Header File,文件名为Counter,点击确定,工程中会增加一个Counter.h的头文件,将我们给大家的Counter.h的内容拷贝到这个文件中;

点击FileNewC/C++ Source File,文件名为Counter,点击确定,工程中会增加一个Counter.cpp的源文件,将我们给大家的Counter.cpp的内容拷贝到这个文件中;


思考一下:我们的IsCodeLine函数所在的源码文件Counter.cpp已经添加到工程中去了,但是IsCodeLine有没有被调用过?
没有!那么现在IsCodeLine函数该登场了
让我们设计完善测试用例,来调用IsCodeLine吧

执行红色感叹号!我们会看到这个对话框工程执行的结果,而这个不是我们需要的,我们需要通过CppUnit的GUI的方式来对Counter.cpp文件中的CCounter类中的IsCodeLine方法进行测试。
怎样利用CppUnit工具的框架去调用被测试对象,并且测试的界面是通过CppUnit的如下GUI界面来进行?

进入下一环节,先把原有的对话框对应的代码屏蔽掉!
第八步:完善测试用例

我们知道测试用例是需要添加在测试套里面的,那么现在让我们一起来向测试套中增加CCounter中针对IsCodeLine()方法的测试用例:
1 首先需要把目录counter(这个目录下有Counter.cpp文件和Counter.h文件)放到D:/ MyTest下;   
  因为在测试用例里面我们要去执行Counter.cpp文件中的IsCodeLine函数。
2 要想在TestSuit.cpp文件中访问Counter.cpp文件中的IsCodeLine函数,需要在TestSuit.cpp文件头添加一句话:
  #include "counter/Counter.h"
3 现在需要完善测试用例,把测试用例的框架给大家列出来,和我们使用手工方式测试的思路一样,大家尝试写一下,看是否能写出来
void myTestSuite::testcase_001()
{
     //*定义IsCodeLine需要的两个输入参数,一个CString型,一个int型

        //*设置输入参数1和输入参数2的值

        //*定义预期返回结果,整型;定义预期输出结果,整型

        //*设置预期返回结果值;        设置预期输出结果值

        //*定义实际返回结果

        CCounter m_counter;

        //驱动被测函数
        实际返回结果变量 = m_counter.IsCodeLine(参数变量1,参数变量2);

        //结果比较,预期返回结果和实际返回结果相等;预期输出和实际输出相等
        CPPUNIT_ASSERT_EQUAL(iOkReturn,iResult);
        CPPUNIT_ASSERT_EQUAL(iOkIsComment,bIsComment);
}

需要大家把上面红色字体部分拷贝到用例1方法里面去,有*号的注释部分需要补充实际的语句。
语句补充完毕后,编译
编译连接成功后,运行测试,出现下面的界面,表示测试用例Counter_UT_IsCodeLine_001运行成功.

你可能感兴趣的:(框架,测试,application,mfc,dialog,initialization)