使用测试优先方法开发用户界面[4]

发表于:2010-03-30来源:作者:点击数: 标签:开发用户界面
使用测试优先方法 开发 用户界面[4] 软件测试 void MovieListWindow::OnClickAddButton() { UpdateData(); CString strNewMovieName; m_MovieField.GetWindowText(strNewMovieName); if("" != strNewMovieName) { m_pEditor-Add(strNewMovieName); m_MovieLi

 

  使用测试优先方法开发用户界面[4]   软件测试 

     void MovieListWindow::OnClickAddButton()

  {

  UpdateData();

  CString strNewMovieName;

  m_MovieField.GetWindowText(strNewMovieName);

  if("" != strNewMovieName)

  {

  m_pEditor->Add(strNewMovieName);

  m_MovieListBox.AddString(strNewMovieName);

  }

  }

  ??编译、测试、通过。

  ??5、Mock Objects

  在删除操作的单元测试中,我们遇到的一个问题是,影片列表的数据应该是保存在一个文本文件或者数据库当中的,如果我们编写的测试依赖于这些实际的文件或数据库,那么我们的测试就会受制于这些外部的资源。一旦文件或者数据库里的数据发生变化,必然会波及到我们的测试代码,从而产生错误的测试信息。前面的MovieListEditor中我们没有加入一些初始化的数据,在测试删除操作时会遇到一些问题 。

  这里,我们引入Mock Objects。Mock Objects用来模拟外部复杂的资源(如数据库,网络连接等),使UI可以测试那些依赖于这些复杂外界资源的模块。例如在测试一个跟数据库有关系的模块时,我们并不一定要建立一个真实的数据库连接,而只需建立一个Mock Objects就可以了。测试所需的数据都存在于这个Mock Objects。可以说,Mock Objects为我们提供了一个轻量级的、可控制的、高效的模型。

  在本例中,影片的增加、删除都会跟文件或数据库操作发生关系。这时我们就可以利用Mock Objects来隔离测试代码与文件或数据库。使用Mock Objects一般有以下几个步骤:

  ??a)、定义一个外部资源的接口.(这个接口一般是可以在重构过程中提炼出来的)。

  ??b)、定义一个Mock Objects,从外部资源的接口继承下来,实现外部资源的接口。

  ??c)、创建一个Mock Objects,并设置它的内部期望值。

  [NextPage]

  ??d)、把创建的这个Mock Objects传递给需要测试的模块进行操作。??

  ??e)、操作完毕后将Mock Objects内部的状态与期待状态比较。 现在我们就根据这个步骤来实现本例子中的Mock Objects.通过对前面的代码进行重构,我们可以提炼出一个接口MovieListEditor:

  class AFX_EXT_CLASS MovieListEditor

原文转自:http://www.ltesting.net