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

2016-01-29 11:59 3 1 收藏

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

【 tulaoshi.com - C语言心得技巧 】

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

作者:Cpluser

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com)

演示代码下载

关键字:测试优先 测试驱动开发 Mock Objects CppUnit

1、概述

  测试优先是测试驱动开发(Test-Driven Development, TDD)的核心思想,它要求在编写产品代码前先编写基于产品代码的测试代码。在测试驱动开发的单元测试中,对GUI应用实施自动测试应该是测试驱动开发的软肋之一。由于界面的操作是有由人来完成的,所以要想在GUI中完成单元自动测试是有一定难度的。Kent Beck在它的《测试驱动开发》中就曾提到过这个问题。
  本文将通过一个例子来讲解在测试驱动开发中如何针对GUI进行单元测试。这个例子是David Astels著的《测试驱动开发实用指南(影印版)》中一个关于影片列表管理的例子。该书中文版即将在国内出版。书中讨论并介绍了开发这个例子的多种方法。笔者将介绍其中的一种,并且为了方便使用C++的朋友的学习,书中的代码我用C++写了一遍,类名和变量名尽量和原书保持一致,以方便阅读该书的C++读者。在此也要感谢David Astels给我们带来如此精彩的一本书。
  本文叙述背景为:CppUnit1.9.0, Visual C++ 6.0, Windows2000 pro。文中叙述有误之处,敬请批评指正。如果读者对CppUnit还没有一定的了解,可以先参考笔者的另一篇文章《CppUnit测试框架入门》。

2、需求分析

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


图1

  界面的控件主要有:一个显示所有影片的列表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
                        

来源:https://www.tulaoshi.com/n/20160129/1484129.html

延伸阅读
标签: Web开发
表单,我相信这是前端开发者工作中最难处理的一个作业了.表单设计中几乎涉及了所有前端各方面的思想与技术.其用户注册页面即为最典型的代表,我要说设计本身没有对与错只有好与坏,就好像人的脸,只有漂亮与不漂亮,不能说某人的脸长错了.当然这其中就会有尺度去衡量,但难就难在这个尺度本身没有标准.好的,我已经为我将要阐述的观点铺好了下去的...
接触互联网有一段时间了。有个最深刻的感觉就是:互联网产品的特性决定它的产出速度必须快,很快,非常地快!!才有机会赢得市场。那么,按照常规的方式先进行漫长的用户调研再产出产品似乎有点龟速和不合时宜了。我个人觉得应该先快速产出一款产品,得到用户反馈后快速迭代开发,逐步完善和update产品才是王道。 这样,产品产出后如何得到用户...
作为一个 Java 程序员,从论坛上感受到使用 Java 开发程序的人越来多,心中不免欣慰。但是,同样是从论坛中,看到多数人提到 Java 就以为是网络开发不是这样的,Java 也可以开发应用程序,而且可以开发出漂亮的图形用户界面的应用程序,也就是 Windows/XWindow 应用程序。因此,我写下这篇文章,希望能带你进入Java 图形用户界面设计之门。 ...
标签: Web开发
一:重要内容重要展示 用户通过互联网搜索浏览到网站内部,通过网站内部信息的集合获取自己想要的内容。似乎现在站长都不明白自己网站用户需要什么样的信息,综合类门户网站需要的就是社会信息的快速报道和进行深度的挖掘,随着互联网用户的图片化浏览习惯,网站应建立起重要信息图片化和文字化。用户需要看的新闻要设计中网页主要位置。一...
标签: ASP
       启用 Foreach       许多用户希望能够使用 foreach 遍历我的列表。为此,我需要在类中实现 Ienumerable,并定义一个单独的用于实现 Ienumerable 的类。第一步,测试:      [Test]   public void TestForeach()   {   ...

经验教程

90

收藏

14
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部