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

发表于:2010-5-05 16:56

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:未知    来源:51Testing软件测试网采编

  1、概述

  测试优先是测试驱动开发(Test-Driven Development, TDD)的核心思想,它要求在编写产品代码前先编写基于产品代码的测试代码。在测试驱动开发的单元测试中,对GUI应用实施自动测试应该是测试驱动开发的软肋之一。由于界面的操作是有由人来完成的,所以要想在GUI中完成单元自动测试是有一定难度的。Kent Beck在它的《测试驱动开发》中就曾提到过这个问题。

  本文将通过一个例子来讲解在测试驱动开发中如何针对GUI进行单元测试。这个例子是 David Astels著的《测试驱动开发实用指南(影印版)》中一个关于影片列表管理的例子。该书中文版即将在国内出版。书中讨论并介绍了开发这个例子的多种方法。笔者将介绍其中的一种,并且为了方便使用C  的朋友的学习,书中的代码我用C  写了一遍,类名和变量名尽量和原书保持一致,以方便阅读该书的读者。在此也要感谢David Astels给我们带来如此精彩的一本书。

  本文叙述背景为:CppUnit1.9.0, Visual C   6.0, Windows2000 pro。文中叙述有误之处,敬请批评指正。如果读者对CppUnit还没有一定的了解,可以先参考笔者的另一篇文章《CppUnit测试框架入门》。

  2、需求分析

  对于这个影片管理的应用,我们主要实现增加、删除和显示影片列表的功能。基于这些需求,我们可以画一张GUI草图。

  界面的控件主要有:一个显示所有影片的列表listbox控件,一个填写新的影片名的edit控件,一个增加button控件,一个删除button控件。由此,我们的开发目标就十分的明确了。

  3、编写UI测试代码

  这部分的UI测试代码主要是测试各个控件是否正确生成并且是可见的,以及测试一些控件的label文字是否正确。

  我们从TestCase继承一个类TestWidgets用于测试窗口,并添加四个测试,分别测试listbox、edit、add button、delete button。

 class TestWidgets : public CppUnit::TestCase
{
     CPPUNIT_TEST_SUITE(TestWidgets);
     CPPUNIT_TEST(testList);
     CPPUNIT_TEST(testField);
     CPPUNIT_TEST(testAddButton);
     CPPUNIT_TEST(testDeleteButton);
     CPPUNIT_TEST_SUITE_END();
public:
     TestWidgets();
     virtual ~TestWidgets();
public:
     virtual void setUp();
     virtual void tearDown();
     void testList();
     void testField();
     void testAddButton();
     void testDeleteButton();
private:
     MovieListWindow* m_pWindow;
};

  其中,MovieListWindow是一个窗口类。我们来看看其中的一个测试,请看代码中的注释。

 void TestWidgets::testAddButton()
{
       //得到btn指针
       CButton* pAddButton = m_pWindow->GetAddButton();
       //检查是否生成btn
       CPPUNIT_ASSERT(pAddButton->m_hWnd);
       //检查btn是否可见
       CPPUNIT_ASSERT_EQUAL(TRUE, ::IsWindowVisible(pAddButton->m_hWnd));
       CString strText;
       pAddButton->GetWindowText(strText);
       CString strExpect = "Add";
       //检查btn的Label文字是否正确
       CPPUNIT_ASSERT_EQUAL(strExpect, strText);
}

  编译测试代码,编译器会给我们一些出错信息。这要求我们必须马上编写产品代码以让编译通过。首先第一个要实现的产品代码就是MovieListWindow窗口类。

 class AFX_EXT_CLASS MovieListWindow : public CDialog
{
public:
     MovieListWindow(CWnd* pParent = NULL); // standard constructor
     CListBox* GetMovieListBox(){return &m_MovieListBox;};
     CEdit* GetMovieField(){return &m_MovieField;};
     CButton* GetAddButton(){return &m_AddBtn;};
     CButton* GetDeleteButton(){return &m_DeleteBtn;};
     void Init();
     // Dialog Data
     //{{AFX_DATA(MovieListWindow)
     enum { IDD = IDD_MOVIELISTDLG };
     CButton m_AddBtn;
     CButton m_DeleteBtn;
     CEdit m_MovieField;
     CListBox m_MovieListBox;
     //}}AFX_DATA
     // Overrides
     // ClassWizard generated virtual function overrides
     //{{AFX_VIRTUAL(MovieListWindow)
  protected:
     virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
     //}}AFX_VIRTUAL
     // Implementation
  protected:
    // Generated message map functions
    //{{AFX_MSG(MovieListWindow)
    //}}AFX_MSG
  DECLARE_MESSAGE_MAP()
};

  在MovieListWindow窗口类中我们实现了需要的控件以及针对这些控件的一些方法,如GetMovieListBox()等,本文在此不做详述。编译测试代码和产品代码,检查是否通过。如未通过则继续检查产品代码以使编译和测试通过。

31/3123>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号