BaseTestCase system 是属于主线程的,在执行Test Case 后,BaseTestCase system 将接管主线程的操作权,然后执行test case ,正因为BaseTestCase system具备这样的能力,同时因为它是具有代码级的,所以他可以很简单的控制所有对象,从而实现动作的录制。
下面我们用一个Sample 来演示BaseTestCase system 是如何实现动作的录制。
首先我们来看一下测试用类的代码:
//.h
#include "BaseTestCase.h"
class CTest_View : public CBaseTestCase
{
TEST_CASE_MAP
BASE_TEST_CASE_H(CTest_View)
public:
…….
void test_Annotation_circle();
……
};
// .cpp
BEGIN_TEST_CASE_MAP(CTest_View)
……….
TEST_CASE_MEMBER(test_Annotation_circle)
………………..
END_TEST_CASE_MAP
void CTest_View::test_Annotation_circle()
{
TEST_CASE_TRACE("Begin");
//获取被测试的对象,通常可是使用这中方法,当然也可以使用一个全局的指针来记录//我们要测试的对象 ,这个全局的对象可以通过条件编译来实现,这样可以保证在正
//式 Release 的时候不会影响到产品
CMainFrame* pMain =(CMainFrame*) AfxGetMainWnd();
CImageView * pView = (CImageView*)pMain->GetActiveView();
if (pView)
{
TEST_CASE_TRACE("Draw Line (200,200) to (300,300)");
// 这部分是模拟用户在Toolbar 上点击 Circle button 的作用。因为点击这个button
// 的动作就是执行这样的动作,所以这样等于用户点击了button
pView->type = CImageView::CIRCLE;
TEST_CASE_DELAY(10);
// 在CImageView 的头文件中添加
// #ifdef TEST_CASE_CODE
// friend class CTest_View;
// #endif
// 这样测试用类可以访问任何它所想访问的函数或是变量 ^_^
// 同样是使用条件编译,不会影响到正常的Release
// 以下模拟鼠标点击,移动的动作
pView->OnLButtonDown(1,CPoint(200,200));
pView->OnMouseMove(1,CPoint(200,200));
pView->OnLButtonUp(1,CPoint(300,300));
TEST_CASE_TRACE("Draw Line (250,250) to (400,400)");
TEST_CASE_DELAY(10);
pView->OnLButtonDown(1,CPoint(250,250));
pView->OnMouseMove(1,CPoint(400,400));
pView->OnLButtonUp(1,CPoint(400,400));
TEST_CASE_DELAY(10);
TEST_CASE_TRACE("Draw Line (350,350) to (400,400)");
pView->OnLButtonDown(1,CPoint(350,350));
pView->OnMouseMove(1,CPoint(400,400));
pView->OnLButtonUp(1,CPoint(400,400));
}
TEST_CASE_TRACE("End");
}
在这里我们可以看到,通过利用C++ 这个 friend class 的定义,我们可以很轻松的控制一个已经存在对象的所有方法与属性,同时,我们配合条件编译,可以保证,所有的测试代码均不会影响到我们现有的代码,轻轻松松实践动作的录制。