asp.net,c#,visual studio,sql自动化测试工具论文Visual C++.NET,毕业论文,课程设计,PPT,开题报告

3995
    


来源:
Licence:
联系:
分类:
平台:
环境:
大小:
更新:
标签:
免费下载 ×

下载APP,支持永久资源免费下载

限免产品服务请联系qq:1585269081

下载APP
免费下载 ×

下载APP,支持永久资源免费下载

下载APP 免费下载
下载 ×

下载APP,资源永久免费


如果出现不能下载的情况,请联系站长,联系方式在下方。

免费下载 ×

下载论文助手APP,资源永久免费

免费获取

如果你已经登录仍然出现不能下载的情况,请【点击刷新】本页面或者联系站长


苏州大学本科生毕业设计(论文)

目  录

摘  要 1

Abstract 2

第一章 前言 3

1.1概述 3

1.1.1开发背景 3

1.1.2开发的现实意义 3

1.2论文结构 4

第二章 自动化测试工具的研究概述 5

2.1自动化测试工具基础 5

2.1.1自动化测试依据 5

2.1.2自动化测试工具设计的一般原则 5

2.2自动化测试工具简介 5

2.2.1 IBM Rational 6

2.2.2 QuickTest Professional 6

2.3自动化测试工具特点 7

2.3.1自动化测试的优点 7

2.3.2自动化测试存在的问题 7

2.3.3自动化测试的优缺点对比 8

2.4自动化测试工具的应用与发展方向 9

第三章 基于UML的自动化测试工具分析与设计 10

3.1自动化测试简介 10

3.1.1概述 10

3.1.2自动化测试工具的模块分析 10

3.1.2.1录制模块 11

3.1.2.2脚本模块 11

3.1.2.3对象交互模块 11

3.1.2.4日志模块 11

3.2需求模型 11

3.2.1定义活动者 11

3.2.2定义用例 11

3.3动态模型 13

3.3.1回放脚本的UML的交互图 13

3.3.2回放脚本的UML的状态图和活动图 14

3.3.2.1 UML状态图 14

3.3.2.2 UML活动图 16

3.4本章小结 16

第四章 录制模块与对象交互模块的程序实现 17

4.1开发工具——Visual C++.NET 17

4.1.1 .NET概述 17

4.1.2 Visual C++.NET的新特性 17

4.1.3 Visual C++.NET的新功能 18

4.1.4 Visual C++.NET增强了开发人员的能力 19

4.2自动化测试工具的主界面功能简介 19

4.3录制模块 20

4.3.1钩子函数的安装和卸载 20

4.3.2获取鼠标点击的窗口的窗口信息 23

4.3.3生成测试脚本 24

4.4脚本管理模块 24

4.4.1脚本技术 25

4.4.2脚本结构 25

4.5对象交互模块 26

4.5.1用于保存脚本信息的类AutoFind 26

4.5.2查找定位对象 27

4.5.3操作对象 30

4.6日志模块 31

4.7本章小结 32

第五章 结论 33

参考文献 34

致  谢 35



摘  要

自动化测试工具的开发主要针对的是实际软件测试需求,从而减少人工测试的工作量,大大增加在有限的时间内的测试,并且增强测试的质量。

我们开发的自动化测试工具是一个用户界面自动化测试的工具。它分为录制模块、脚本模块、对象交互模块和日志模块,同时程序的执行也是按照这个流程进行。其中对象交互模块为内部模块,衔接脚本管理和日志管理两个模块,本身没有界面显示。

经过分析,我们使用Microsoft公司的Microsoft Visual Studio.NET开发工具,利用其提供的各种面向对象的开发工具,尤其是界面窗口这一能方便而简洁操纵对象,首先使用UML建立自动化测试工具的模型,然后在已建模型的基础上,以VC++.NET为开发工具对该工具进行实现,并不断修正和改进来不断满足用户需求。



关键词:自动化测试, 对象交互, 录制, UML








Abstract

Test automation tools are developed mainly for actual software testing requirement. Compared to manual testing, proper use of test automation tools will result in lower workload, higher testing efficiency in finite period, and higher quality products.

The test automation tool that we developed is a GUI test automation tool. It is made up of record module, script module, object interaction module and log module. This sequence is consistent with the process of running the program. Any more, object interaction module is an interior module, which links up script module and log module. So it shows no interface.

According to the analyzing, we decide to use Microsoft Visual Studio .NET developing tool of Microsoft Corporation. We can make use of kinds of Object Oriented developing tools which is offered by .NET. Especially interface window, which can operate object conveniently and compactly. First, we will use UML to build the system’s architecture model of the test automation tool. And then we developed the tool with VC++.NET basing on the model, modifying and improving it continually to keep pace with users’ requirement.



Keywords: Test automation, Object interaction, Record, UML



Written by Zhu Yingwen

Supervised by Zhang Guangquan


第一章 前言

1.1概述

软件测试自动化,已经成为国内软件工程领域一个众所周知的课题;不言而喻,软件测试从业者都意识到软件测试这项工作走向成熟化、标准化的一个必经之路就是要实施自动化测试。

1.1.1开发背景

软件必须通过测试才能确保其在应用环境中正常工作。软件测试应能有效地发现软件中的任何缺陷,同时软件测试也应是高效的,尽可能地占有时间少且开销小[1]。面对软件的规模越来越大,应用的复杂度和集成性越来越高,各种新的软件开发技术不断应用,那么,如何提供高效、有效性的测试,是软件测试技术面临的巨大挑战。如今的软件测试行情,正处在群雄逐鹿的混战岁月,每个人、每个有测试部门或从事测试业务的企业,都该多多借鉴国内外先进的测试经验,参考业界流行的行业标准,找到适合自己团队的测试方法和模式,同时开发一些辅助测试的工具,创造更大的社会价值。

从目前的测试工具来看,以国外品牌居多,选择测试工具当然也要根据自己的需求。虽然测试工具很多,但是针对性却不尽相同,有针对功能的,有针对源代码的,有针对压力负载测试的,等等。在针对性相同的工具中再进行比较,这些工具往往大同小异,最好先进行试用,当然也可以咨询专业的测试机构,无论如何,满足自己需要的才是最好的。

1.1.2开发的现实意义

自动化主要是指一个黑盒、自动回放这样一些东西,取决于一个很好的流程。一个测试管理的流程,取决于相对稳定的需求。

自动化测试可以大大减少测试开销,同时大大增加在有限的时间内的测试[1]。从各种测试工具的开发趋势来看,自动化测试是发展主流。

实施软件测试自动化的理由分析:首先,测试人员的工作比以往任何时候都更加困难,因为公司和组织希望以更快的速度和更低的成本开发出高质量的应用程序。此外,在很多项目中,测试人员的所有任务实际上都是手动处理的,而实际上,有很大一部分重复性强的测试工作,是可以独立开来自动实现的。还有,在大型项目中测试团队和其他的团队之间没有足够的合作,无法促进彼此的工作。最后,从个人角度来说,测试人员通常很难花费大量时间来学习新技能;这是目前国内测试从业者的现状,太多的企业为了节约成本而将刚刚走出校门的毕业生作为测试工程师,他们每日做着繁忙的重复工作,又基于自身技能的不足,不知从何处入手。

可以说,实施测试自动化是软件行业一个不可逆转的趋势,如果在这个领域走在了前列,无论从企业的核心竞争力还是个人的工作技能来说,都有巨大的优越性。

1.2论文结构

全文共分为五章。第一章简述了自动化测试工具的开发背景以及开发的现实意义;第二章对QuickTest Professional和Rational Robot等目前主流的自动化测试工具进行深入的研究,了解自动化测试工具的工作原理与工作流程;第三章首先对自动化测试工具进行需求分析,明确需要实现的功能,然后用UML对自动化测试工具进行模块划分,建立其需求模型和动态模型;第四章介绍了自动化测试工具的代码实现过程,包括录制模块、脚本模块、对象交互模块、日志模块。其中详细介绍了笔者负责开发的录制模块和对象交互模块;第五章总结了本文的工作。


第二章 自动化测试工具的研究概述

2.1自动化测试工具基础

2.1.1自动化测试依据

首先,要有良好定义的测试策略和测试计划(知道要测试什么以及什么时候测试),对于自动化测试,你要有一个能够被识别的测试框架;其次是能够确保多个测试运行的构建策略,如果多平台环境需要被测试,必须拥有运行测试的硬件,并且拥有关注在自动化过程上的资源;最后,被测试系统是可以实施自动化测试的。

2.1.2自动化测试工具设计的一般原则

使最重复性的任务实现自动化。

使传统上能发现最多错误的任务实现自动化。

实现测试的模块化以使得可维护性更好,可在其他项目中重复使用。

编写有意义的测试日志。

根据测试需求,有针对性。

2.2自动化测试工具简介

自动化测试工具应该分为性能测试、功能测试、单元测试、测试管理几类。目前绝大部分应用软件都是基于GUI(即Graphics User Interface图形用户界面)进行设计开发,所以在产品的测试活动尤其是功能测试活动中,GUI测试将占到非常大的比率,GUI测试质量和效率是整个产品质量提升和成本降低的关键。我们知道大部分软件产品都有必不可少的人机交互界面MMI,而且它的功能也基本上是通过人机交互操作来体现和完成的,所以我们可以说软件产品的GUI测试在整个产品测试中占有非常重要的地位。下面介绍几种目前市场上的主流的黑盒测试工具,其中具有代表性的是Rational Robot和QuickTest Professional。

2.2.1 IBM Rational

Rational Robot图形用户界面(GUI)的功能测试自动化。可以对使用各种集成开发环境(IDE)和语言建立的软件应用程序,创建、修改并执行自动化的功能测试、分布式功能测试、回归测试和集成测试。IBM Rational Robot是一种可扩展的、灵活的功能测试工具,通过编写脚本的方式提供自动化测试特性。其GUI方式的脚本录制功能,有助于对GUI软件进行功能测试;其VU方式的脚本录制功能,有助于测试某些软件的数据通讯功能。

突出特点:

支持多种IDE:Microsoft VisualStudio .NET,Oracle Developer/2000,Delphi,PeopleSoft,PowerBuilder。

支持多种语言:Java,HTML和DHTML,Visual Basic,Visual C++,ActiveX,XML。

自动GUI功能测试。

执行分布式功能测试。

测试所有.NET本机控件,包括VB.NET、C#、J#、Managed C++,允许在记录时查看和编辑测试脚本。

2.2.2 QuickTest Professional

QuickTest Professional是一款先进的自动化测试解决方案,用于创建功能和回归测试。它自动捕获、验证和重放用户的交互行为。为每一个重要软件应用和环境提供功能和回归测试自动化的行业最佳解决方案。

QuickTest Professional的互动式的报告工具通过提供详尽的、易读的报告(其中会列出在测试中发现的差错和出错的位置)来解释所得的结果。这些报告对在测试运行中发生的重要事件进行描述,如出错内容和检查点等。点击按钮,您还能进一步获取任何未被包括在此测试范围内的错误的详尽资料。

突出特点:

具有行业领先的便于使用的特性,以及支持提前配置环境的功能,确保了快速的投资回报。

可独立运行,也可以同Mercury Business Process Testing和Mercury质量中心集成。

引进了QuickTest Professional 8.0中新一代的“零配置”关键词驱动测试技术,从而实现了快速建立测试、测试脚本更易维护,和更强大的数据驱动能力。

通过集成的数据表,可数据驱动任意对象、方式、检查点和输出值等。

2.3自动化测试工具特点

自动化测试工具是第三方测试,最大的特点在于它的专业性、独立性、客观性和公正性。对于软件开发商来说,经过第三方测试机构的测试,不仅可以通过专业化的测试手段发现软件错误,帮助开发商提升软件的品质,而且可以对软件有一个客观、科学的评价,有助于开发商认清自己产品的定位。通过第三方测试机构公平、公正、公开的测试,把可视性差为特征的软件透明化,用量化的数据说话,为科技部和专家组择优支持提供了科学客观的依据,从而避免了以前的印象以及关系成分。

2.3.1自动化测试的优点

对程序的新版本运行已有的测试。

可以运行更多更频繁的测试。自动化的一个显而易见的好处是可以在较少的时间内运行更多的测试。

可以执行一些手工测试困难或不可能做的测试。客户端用户通过定义可以自动回放的测试,随时都可以运行用户脚本[1]。

更好地利用资源。将繁琐的任务自动化,如重复输入相同的测试输入,可以提高准确性和测试人员的积极性,将测试技术人员解脱出来投入更多精力设计更好的测试用例[1]。

测试具有一致性和可重复性。对于自动重复的测试可以重复多次相同的测试。

增加软件信任度。

降低风险。知道你测试了什么和没测试什么。

2.3.2自动化测试存在的问题

使用自动化测试的过程中可能会遇到很多问题,下面是一些普遍存在的问题:

不现实的期望。人们都期望新工具可以解决目前遇到的所有问题,可能会忽略取得持久效益所做的努力。如果期望不现实,那么无论工具从技术角度实现得多么好,都满足不了期望[1]。

缺乏测试实践经验。如果缺乏测试实践经验,测试组织差,文档较少或不一致,测试发现缺陷的能力较差,在这种情况下采用自动化测试并不是好办法[1]。

期望自动化测试发现大量缺陷。

安全性错觉。测试软件没有发现任何缺陷并不意味着软件没有缺陷,因为测试可能不全面或测试本身就有缺陷。

自动化测试的维护性。测试维护的开销打击了测试自动化的积极性,当修改测试比手工重新测试更费劲时,测试自动化将被丢弃。

技术问题。测试工具与其他软件的互操作性,也是一个严重问题。除工具本身的技术问题外,用户也要了解被测软件的技术问题。

组织问题。自动化测试实施起来并不简单,每当使用一个新工具时,都需要调整管理方法以适应新的工作方式[1]。

2.3.3自动化测试的优缺点对比

表2-1自动化测试的优缺点对比

优点

实际情况

采取策略

快速

“脚本执行比人工执行快!”

实际上,测试人员还需要做编写脚本,设置脚本如何运行,解释测试结果,讨论是否需要修复等工作。所有这些工作使得测试执行实际上只是整个测试工作量中的一个小部分。

第一次的自动化测试项目将花费比纯粹的手工测试更多的时间。我们应该将自动化看成是改进测试人员效率的一个工具,而不是一个测试人员的完全替代物。利用测试脚本程序可以很快地将测试人员带到测试应用程序的同一水平线上。

全面

“你可以构建一个覆盖应用程序每一个功能的测试包!”

自动化测试覆盖的功能点越多,测试程序就会变得越复杂。自动化测试战胜了消耗时间和测试深度之间的平衡。

在做自动化测试之前,详细地说明所有的功能点及其运行条件。利用手工测试的检查表可以发现许多人为的错误。测试人员要集中在测试深度上。

可靠

“每次测试脚本在运行时执行相同的操作,因此减少了人为的错误!”

现在的技术只能识别那些已经被编程的部分并进行检查。需要人为地检查并且留意异常的事情。

利用自动化做些繁复的工作,如扫描应用程序中期望的菜单标题等。并且为测试人员给出可能发生的问题的指示。

可编程

“你可以编写复杂的测试脚本来找出应用程序中隐藏的信息!”

花在编写复杂测试脚本的时间往往不会像手工测试中“真实工作”的时间一样被检查。

预算明确的用于自动化研究及开发的时间。

可重用

“你可以重复使用测试脚本来测试应用程序的不同版本,即使用户界面发生了变更!”

为了彼此可以更好的工作,需要在一个公共的架构上创建程序代码。

强制使用命名规范及函数的公用库。设计模块中的测试脚本从一个共同的起点开始。并且追踪使用的测试数据。

2.4自动化测试工具的应用与发展方向

Microsoft这样的公司说过“大多数人认为我们是一个软件开发公司,其实我们是一家软件测试公司”的话,从中可以看出测试是非常重要的。考虑到软件行业的长远发展,自动化测试将是今后的一个发展方向。由此看来,自动化测试是有必要深入开展的。做测试工具比较专业的主要有Mercury,Segue,IBM Rational,Compuware,Empirix这几家公司。

测试工具要有可集成性、可扩展性以及平台兼容性。实际测试过程中,我们常常需要把测试流程,需求管理,缺陷管理,配置管理结合得更紧密,通过工具去统一管理。这些都是在选用工具时要考虑到的因素。如果有特别的测试需求,可以自行开发测试工具,实现比较有针对性的期望结果。


第三章 基于UML的自动化测试工具分析与设计

本章以自动化测试工具的开发为背景,探讨了UML在软件分析与设计中的应用。首先对该自动化测试工具进行需求分析,明确需要实现的功能;然后用UML用例视图对该自动化测试工具进行模块划分,建立需求模型;进而利用UML的交互图以及活动图和状态图等描述了该自动化测试工具的动态模型;最后,对UML在软件分析与设计方面的应用进行了总结。

3.1自动化测试简介

以前的测试采用手工方法,测试内容繁多,工作量大,容易造成疏漏。引入自动化测试来取代目前严重影响测试效率的冗余繁复的人工过程,可以大大提高测试人员的工作效率,方便测试人员进行测试工作,消除了以前测试任务繁重,测试覆盖范围太小的局面,使测试工作高效化,全面化。

本节说明我们所要研究与实现的自动化测试工具的特点及模块功能。

3.1.1概述

自动化测试可以使某些测试任务比手工测试执行高效得多,而重复的活动特别适合自动化[1],因此自动化测试也应具有重用性。

本自动化测试工具是针对测试工作的基本需求设计的,采用了面向对象的方法实现,需要指出的是我们将要分析与设计的是一个利用测试脚本实现自动化测试的工具,所以具有很好的重用性。

3.1.2自动化测试工具的模块分析

本自动化测试工具参考了QuickTest Professional和Rational Robot等目前主流的自动化测试工具的做法,分成四个基本的功能模块:录制模块、脚本模块、对象交互模块、日志模块,这样的模块划分可以实现重复使用测试脚本进行自动化测试,能够满足自动化测试工具的重用性要求。

3.1.2.1录制模块

当用户使用应用程序时,本自动化测试工具会记录用户的鼠标和键盘操作,并产生测试脚本。

3.1.2.2脚本模块

当用户打开测试脚本,本自动化测试工具会读取脚本内容,并以树型结构显示脚本内容。

3.1.2.3对象交互模块

当用户执行回放任务时,本自动化测试工具会自动查找定位窗口焦点坐标,并执行测试脚本所描述的鼠标和键盘操作。

3.1.2.4日志模块

当本自动化测试工具执行完测试脚本,会产生一个日志文件,包含测试的执行者、测试时间、测试内容、测试结果和测试失败原因等。

3.2需求模型

本自动化测试工具使用UML用例图来构建需求模型。

3.2.1定义活动者

本自动化测试工具是针对测试工作的基本需求设计的,设计的目的是为了提高测试人员的工作效率,所以活动者只有一个:测试人员。

3.2.2定义用例

使用UML用例图来构建自动化测试工具的需求模型,如图3-1所示。



图3-1自动化测试工具需求模型



该图由使用者和所驱动的用例以及用例之间的相互关联组成,实箭线表示使用者和用例的关联。



图3-2自动化测试工具回放脚本需求模型(UML交互图)



一般来说,用例定义后需要为一些重要用例建立一些简单的行为模型,从而使该用例更为清晰,也为我们在建立结构模型时更容易把握哪些构件是应该抽象出来的。图3-2为初步建立的自动化测试工具回放脚本的UML交互图。

3.3动态模型

自动化测试工具的动态模型采用UML的交互图以及活动图和状态图来描述。下面以回放脚本为例,建立其UML的交互图以及活动图和状态图,并作出相应说明。

3.3.1回放脚本的UML的交互图

交互图描述模块间消息传递的连接关系及其空间分布,揭示模块之间的交互过程。它有两种类型:顺序图和协作图,前者着重描述对象按照时间顺序的消息交换,后者着重描述各模块如何协同工作。我们将对回放脚本建立其UML顺序图。

图3-3是回放脚本的UML顺序图,其交互事件如下:

“Tester”通过选择“文件”菜单的“打开”选项或单击工具栏的“打开”按钮执行OnFileOpen()方法打开测试脚本,然后脚本模块执行ReadScript()方法读取脚本内容,并执行InsertTreeData()方法用树形结构显示脚本内容。“Tester”通过选择“操作”菜单的“回放”选项或单击工具栏的“回放”按钮回放脚本,然后脚本模块通过调用对象交互模块的FindWindow()方法查找定位对象,并通过执行WindowEvent()方法操作对象。最后日志模块执行WriteLog()方法生成日志文件,并执行InsertTreeData()方法用树形结构显示日志内容。“Tester”也可以通过选择“操作”菜单的“日志”选项或单击工具栏的“日志”按钮执行OnLog()方法查看日志内容。



图3-3自动化测试工具回放脚本动态模型(UML顺序图)

3.3.2回放脚本的UML的状态图和活动图

3.3.2.1 UML状态图

状态图表现了一个对象(或模型元素)的生存史,显示触发状态转移的事件和因状态改变而导致的动作。下面,我们将采用状态图来描述回放脚本的动态模型,如图3-4所示。



图3-4自动化测试工具回放脚本动态模型(UML状态图)



“脚本管理”状态

当发生“打开测试脚本”事件时,就进入“脚本管理”状态。本状态的入口动作是“读取测试脚本内容”。然后进行“翻译测试脚本”动作,这个动作实际上要调用脚本模块中的多个方法来完成。完成后,其出口动作是“建立测试脚本树形分析器”。

“对象交互”状态

当在“脚本管理”状态时发生“回放测试脚本”事件,则转移到本状态。本状态的入口动作是“查找定位对象”,也就是将鼠标或光标定位到目标窗口上。然后进行“模拟鼠标键盘操作对象”动作,这个动作实际上要调用对象交互模块中的多个方法来完成。完成后,其出口动作是“将测试结果写入日志”。

“查看日志”状态

当“对象交互”状态结束时,就转移到本状态。本状态的动作是“建立日志文件树形分析器”,然后直接转移到状态图的出口。

3.3.2.2 UML活动图

活动图的主要作用是表示软件的业务工作流和并发处理过程。图3-5是回放脚本的UML活动图。



图3-5自动化测试工具回放脚本动态模型(UML活动图)

3.4本章小结

在本章中,我们使用统一建模语言UML描述了自动化测试工具的需求模型和动态模型。

通过这个具体的应用可以看出,UML作为一种可视化建模语言和标准的表达工具,可以帮助我们记录和推进分析和设计的过程,并且完成设计以后便于进行回溯和交流。


第四章 录制模块与对象交互模块的程序实现

本章具体描述自动化测试工具的录制模块与对象交互模块的实现。首先介绍本自动化测试工具的开发环境——Visual C++.NET,说明为什么选择UML和VC.NET;然后对某些关键的函数和算法给出具体的编码。在实现时,我们可能会根据实际情况对模型稍作修改。

4.1开发工具——Visual C++.NET

当模型初步建立后,就是实现的问题。我们采用的开发工具是Visual C++.NET。

4.1.1 .NET概述

Microsoft.NET是Microsoft XML Web services平台。XML Web services允许应用程序通过Internet进行通讯和共享数据,而不管所采用的是哪种操作系统、设备或编程语言。Microsoft.NET平台提供创建XML Web services并将这些服务集成在一起之所需。对个人用户的好处是无缝的、吸引人的体验。

Visual C++是Microsoft公司推出的目前使用极为广泛的基于Windows平台的可视化编程环境。最新版本Visual C++7.0(Visual C++.NET)与以往版本相比,增加许多新的特性,这其中包括:Web应用程序、新颖的C#编程语言以及ATL、DCOM、MFC、数据库等方面的增强,尤其是在开发环境界面上变化更大,它采用平面化的操作界面,这一点有点类似Visual Basic,它的亲和性使得更多的程序开发人员乐意接受。

Visual C++ 7.0开发环境是平面化的界面,它除了具有和Windows窗口一样的标题栏、菜单栏、工具栏和状态栏外,最主要的是还有不一样的窗口区。窗口区是由Web浏览区、方案导航区、输出窗口区、属性窗口区以及其他窗口等组成。

Visual Studio.NET使用方案这个概念来表示一个工程项目。从概念来说,方案是一个容器,它可以包含了若干个工程及其相关项目。它的最大特点就是能管理与工程相关的多种类型的外部文件。

4.1.2 Visual C++.NET的新特性

与Visual C++6.0相比,Visual C++.NET包含许许多多新的特性,主要有:

不再使用MFC42.DLL,而是采用和Visual C++版本号相同的MFC70.DLL。

集成MFC和ATL,使它们能够共用一些常用的类,如CString。

提供最新开发平台的SDK,并支持最新Windows的用户界面特性,如Windows XP的界面主题、GDI+、CLinkCtrl等。

增加了许多新的MFC用户界面类,如DHTML对话框、增强图像类CImage。

在MFC应用程序中支持Web Services的客户端开发,以及用ATL Server编写Web Services应用程序。

增加了新的OLE DB属性和类,这使得用户更加能够快速地进行数据访问。

增加属性化编程和ATL更新。所谓属性化编程,是指能够使用少量的代码迅速地建立COM组件,在最新Visual C++.NET开发环境中,还新增了一些属性,这些属性可以改变代码的行为,甚至可以通过插入一些额外的代码来完成一些基本的工作,例如ActiveX控件的执行、类厂的创建以及数据库命令的格式化处理等。

Visual C++.NET中的新功能还包括C++属性、托管扩展、ATL Server,以及大量的新库、IDE和编译器优化与增强功能。

4.1.3 Visual C++.NET的新功能

C++属性:C++属性允许公布式编程,它们可以通过尽可能减少重复样板源代码来简化开发工作。开发人员可以通过应用简单的属性标记,以XML Web服务形式公开新的和现有的ATL COM组件。C++属性标记的引入还减少了独立接口定义语言(IDL)模块的需要。

C++托管扩展:使用C++托管扩展,开发人员可以利用Microsoft.NET并合并下一代技术(包括资源管理、统一类型和组件远程处理)。使用.NET,开发人员可以获得用于无缝垃圾回收和减少程序复杂性的出色的内存管理技术。通过在进行有效的远程过程调用的同时使用.NET框架通用类型系统,开发人员可以利用以20多种支持.NET的语言中的任意一种写成的代码。

.NET框架类库:Visual C++.NET开发人员还可以使用Microsoft.NET框架类库并利用强大的内置功能——包括一组丰富的集合类、网络支持、多线程支持、字符串和正则表达式类,以及对XML、XML架构、XML命名空间、XSLT、Xpath和SOAP的广泛支持。

ATL Server:当开发人员选择用C++编写部分Web应用程序时,他们通常出于性能或控制的原因考虑。ATL Server在一组简单和可扩展的ATL类中封装了开发高性能C++ Web应用程序的最佳做法供开发人员重用。ATL Server包括让Web应用程序和XML Web服务扩展到一个Web服务器群集内的多个CPU的功能。

4.1.4 Visual C++.NET增强了开发人员的能力

Visual C++.NET为开发人员提供了许多专业级功能,让他们能够为Windows和Web创建功能非常强大的应用程序和组件。自始至终,该工具都提供了帮助简化C++软件开发过程的功能。

应用程序向导为快速启动项目提供了强大的模板。其中包括的MFC和ATL应用程序框架库是最强劲、最有效和最流行的用于开发基于Windows应用程序的库,现在又针对Windows XP得到了增强。这些功能与专业级编译器和高级调试器集成在一起,共同提供了一致和有效的开发体验。

C++是全世界最流行的语言之一,通过Visual C++.NET,开发人员能够享用世界级的C++开发工具。C++是一种可互操作的基于标准的语言,而C++技能也可以在多个计算环境和社区间利用。

4.2自动化测试工具的主界面功能简介

新建一个MFC应用程序项目TheTree,利用系统默认生成的窗体作为主界面,并为其添加主菜单控件和其他控件。如图4-1所示,主界面视图主要为分为左右两视图,左边为树形视图,右边为列表框视图。主界面中功能主要分为5类:录制脚本,主要负责录制鼠标和键盘操作,生成测试脚本;打开脚本,主要负责管理脚本和信息;回放脚本,根据读取的脚本信息进行自动化测试;日志管理,主要负责日志窗口的打开与日志的显示,并且能够有选择的打开已生成的日志文件;帮助,显示本自动化测试工具的版本信息和开发环境。



图4-1自动化测试工具的主界面

4.3录制模块

因为需要在不同的进程间捕获窗口事件,所以有必要新建一个MFC DLL项目RecordScript,编写相应的鼠标和键盘的钩子函数专门用于捕获不同进程的鼠标和键盘事件,然后在项目TheTree中调用项目RecordScript中生成的DLL文件。本自动化测试工具的录制界面如图4-2所示:



图4-2自动化测试工具的录制界面

4.3.1钩子函数的安装和卸载

函数InstallMouseHook负责安装鼠标和键盘的钩子函数。

void InstallMouseHook(HWND hwndMainWindow)

{

hWindowHandle=hwndMainWindow;

InitCalled=true;

hMouseHook=SetWindowsHookEx(WH_MOUSE,(HOOKPROC)MouseFunc,

(HINSTANCE)hInstance,0);

MouseHookState=TRUE;

//安装鼠标钩子函数

hKeybdHook=SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeybdFunc,

(HINSTANCE)hInstance,0);

KeybdHookState=TRUE;

//安装键盘钩子函数

}

函数UninstallMouseHook负责卸载鼠标和键盘的钩子函数。

void UninstallMouseHook(void)

{

UnhookWindowsHookEx(hMouseHook);

hMouseHook=NULL;

MouseHookState=FALSE;

//卸载鼠标钩子函数

UnhookWindowsHookEx(hKeybdHook);

hKeybdHook=NULL;

KeybdHookState=FALSE;

//卸载键盘钩子函数

InvalidateRect(hWindowHandle,NULL,TRUE);

UpdateWindow(hWindowHandle);

}

需要指出的是项目RecordScript中的函数并不能直接被项目TheTree所使用,编写RecordScript.h的目的正是为了更方便的使用这些函数。

#ifndef _RECORDSCRIPT_H_

#define _RECORDSCRIPT_H_

#include

//DLL入口函数

void InstallMouseHook(HWND hwndMainWindow);

void UninstallMouseHook();

//函数定义

typedef void(*INST)(HWND hwndMainWindow);

typedef void(*UNST)();

class CMouseHookDllCtrl

{

public:

CMouseHookDllCtrl(const char* pDllFileName):

m_hDll(NULL),m_pfnInst(NULL),m_pfnUnst(NULL)

{

m_hDll=LoadLibrary(pDllFileName); //安装钩子函数

if(m_hDll!=NULL)

{

m_pfnInst=(INST)GetProcAddress(m_hDll, "InstallMouseHook");

//获取鼠标钩子函数

m_pfnUnst=(UNST)GetProcAddress(m_hDll, "UninstallMouseHook");

//获取键盘钩子函数

}

else

{

MessageBox(NULL,"Cannot load the hook dll!",

"Error",MB_OK);

}

}

~CMouseHookDllCtrl()

{

if(m_hDll!=NULL)

{

FreeLibrary(m_hDll); //卸载钩子函数

m_hDll=NULL;

}

}

INST m_pfnInst;

UNST m_pfnUnst;

private:

HMODULE m_hDll;

};

#endif

4.3.2获取鼠标点击的窗口的窗口信息

查找鼠标点击的窗口的原理是:首先通过遍历窗口找出鼠标点击的位置被哪些窗口所包含,然后从中找出尺寸最小的窗口。

BOOL CALLBACK mygetwindow(HWND hwnd,LPARAM lParam)

{

if(IsWindowVisible(hwnd))

{

GetWindowText(hwnd,chrObjectText,256); //获取窗口标题

GetClassName(hwnd,chrObjectClassName,256); //获取窗口类

RECT rWindowRect;

GetWindowRect(hwnd,&rWindowRect);

//保存编辑窗口所属的窗口标题

if(strcmp(chrObjectClassName,"Button")==0

||strcmp(chrObjectClassName,"Static")==0)

{

strcpy(chParentWindowText,chrObjectText);

strcpy(chParentWindowClassName,chrObjectClassName);

}

//保存关联窗口的窗口标题和窗口类

if(rWindowRect.left
&&rWindowRect.top
&&rWindowRect.bottom>pCursorPos.y

&&rWindowRect.right>pCursorPos.x)

{

if(prTopLeft.x
&&prTopLeft.y
{

prTopLeft.x=rWindowRect.left;

prTopLeft.y=rWindowRect.top;

record.hObjectHandle=hwnd;

strcpy(record.chParentWindowText,chParentWindowText);

strcpy(record.chParentWindowClassName,

chParentWindowClassName);

//保存鼠标点击的窗口的窗口标题和窗口类

record.pCursorPos.x=pCursorPos.x-prTopLeft.x;

record.pCursorPos.y=pCursorPos.y-prTopLeft.y;

//保存鼠标点击位置的相对坐标

}

}

}

return true;

}

4.3.3生成测试脚本

打开D盘根目录下名为“Script.txt”的临时脚本文件,如果该临时脚本文件已经存在,则把文件指针移到末尾;如果该临时脚本文件不存在,则创建一个新的脚本文件。然后读取类AutoFind的实例对象record的如下成员变量:目标窗口的父窗口类名record.chWindowClassName、目标窗口的父窗口标题record.chWindowText)、目标窗口类名record.chObjectClassName、目标窗口标题record.chObjectText、窗口事件record.chWindowEvent、窗口事件内容record.chInputText或record.pCursorPos,并根据脚本格式按顺序连接起来。当脚本录制完毕时,将临时脚本文件的内容写入用户指定脚本文件名的脚本文件中,并删除临时脚本文件。

4.4脚本管理模块

当用户打开测试脚本时,本自动化测试工具会读取脚本内容,并以树型结构显示脚本内容。

4.4.1脚本技术

测试脚本是测试自动化中必要的组成部分,采用手动编写或自动录制脚本,每个测试用例产生一个脚本。脚本实际上是一种计算机程序的形式,一组测试工具执行的指令集合。编辑或编写脚本可以减少自动化一组测试用例的脚本编写量。一旦编写了合理而全面脚本集合,增加新的测试用例时就可以不用编写脚本,因此,上千个测试用例可以用上百个脚本来实现。测试工具脚本中可以包含的数据和指令包括:

窗口信息。

控件信息。

捕获何种屏幕数据及存储在何处。

一些脚本技术需要精心构造。而一些脚本技术相对简单点。如果脚本只用于大量生命周期较长的不同测试复用,则应该保证该脚本的合理性和维护性。如果脚本只用于一个测试用例,测试完成后就废弃,建立脚本时就不必花费太大工夫。

要使脚本易于使用和易于维护,应该遵循如下原则:

功能:执行单个任务且可以重用。

结构:应易读、易理解和易维护。

文档:有助于复用和维护。

4.4.2脚本结构

参照Rational Robot和QuickTest Professional的脚本格式,并做出必要的修改。窗口信息和控件信息之间用“|”间隔,控件与操作之间用“:”间隔。如下例:

1|Window("编辑水印")|Button("添加(&D)"):Click(3,3)

2|Window("编辑水印")|Edit("名称(&N):"):Input(1x)

3|Window("编辑水印")|Button("确定"):Click(3,3)

所执行的操作是在“编辑水印”窗口,单击“添加(&D)”按钮,然后在“名称(&N):”文本框中输入“1x”,最后单击“确定”按钮。

图4-3是生成的一个脚本示例:



图4-3自动化测试工具的脚本示例

4.5对象交互模块

当用户回放脚本时,首先由脚本模块负责读取脚本信息,并保存在类AutoFind的实例对象window中,然后由对象交互模块负责根据所读取的脚本信息模拟鼠标和键盘进行相应的操作。

4.5.1用于保存脚本信息的类AutoFind

class AutoFind

{

public:

char chWindowClassName[256], //目标窗口的父窗口类型

chObjectClassName[256], //目标窗口类名

chWindowText[256], //目标窗口的父窗口标题

chObjectText[256], //目标窗口标题

chParentWindowText[256], //关联窗口标题

chParentWindowClassName[256], //关联窗口类名

chWindowEvent[256], //窗口事件

chInputText[256]; //输入文本

int iRowNum; //脚本行号

HWND hWindowHandle, //目标窗口的父窗口句柄

hObjectHandle; //目标窗口句柄

BOOL bIsObjectExistent, //判断目标窗口是否存在

bIsObjectVisible, //判断目标窗口是否可见

bIsObjectEnable, //判断目标窗口是否可操作

bIsOperationOK; //判断目标窗口操作是否成功

POINT pCursorPos; //鼠标点击位置坐标

};

通常,某些窗口类为“Static”、“Button”的窗口会存在一个或多个窗口类为“Edit”、“ComboBox”等类型的与之相关联的窗口,因此类AutoFind成员变量chParentWindowClassName和chParentWindowClassName就是用来保存这些关联窗口的窗口标题和窗口类。

4.5.2查找定位对象

在用户回放脚本时脚本模块已将所读取的脚本信息全都保存在类AutoFind的实例对象window中,所以在查找定位对象时只需要直接使用对象window中的相关变量就可以了。

在查找定位对象时要分成两步进行,第一步是查找目标窗口的父窗口,由函数FindWindow来实现该功能。

void FindWindow()

{

hWnd=FindWindow(NULL,window.chWindowText); //查找目标窗口的父窗口,

ShowWindow(hWnd,SW_SHOWNORMAL); //并将其激活

BringWindowToTop(hWnd);

char PS[256]="Cannot find the window - ";

if(hWnd==NULL) //如果未找到目标窗口

{ //的父窗口则弹出相应

strcat(PS,window.chWindowText); //的错误提示信息

MessageBox(hWnd,PS,"Error",MB_OK);

window.bIsObjectExistent=false;

}

else

{

BringWindowToTop(hWnd);

hWnd=GetForegroundWindow();

char chCurrentWindowText[256];

GetWindowText(hWnd,chCurrentWindowText,256);

if(strcmp(window.chWindowText,chCurrentWindowText)!=0)

window.bIsObjectEnable=false;

//判断当前窗口的窗口标题是否与脚本中所写的相一致

else

{

window.bIsObjectExistent=false; //操作对象结果

window.bIsObjectEnable=false; //初始化

window.bIsObjectVisible=false;

window.bIsOperationOK=false;

EnumChildWindows(hWnd,myfindwindow,NULL); //遍历窗口

if(window.bIsObjectExistent==false) //如果未找到目标

{ //窗口则弹出相应

strcat(PS,window.chObjectText); //的错误提示信息

MessageBox(hWnd,PS,"Error",MB_OK);

}

WindowEvent(); //调用操作对象函数

}

}

WriteLog(); //调用日志模块

}

第二步是查找目标窗口,就是通过遍历窗口找到与脚本内所写的目标窗口的窗口类和窗口标题相一致的窗口,由遍历窗口函数EnumChildWindows的回调函数myfindwindow来实现该功能。

BOOL CALLBACK myfindwindow(HWND hwnd,LPARAM lParam)

{

if(IsWindowVisible(hwnd)) //判断窗口是否可见

{

POINT pCursorPos; //保存鼠标点击位置的屏幕坐标

window.bIsObjectVisible=true;

GetWindowText(hwnd,chObjectText,256); //获取窗口标题

GetClassName(hwnd,chObjectClassName,256); //获取窗口类

hObjectHandle=hwnd; //存储窗口句柄

HDC hDC;

hDC=GetDC(hwnd);

GetWindowOrgEx(hDC,&pTopLeftPos);

//获取矩形窗口起点坐标

ReleaseDC(hwnd,hDC);

ClientToScreen(hwnd,&pTopLeftPos);

//将逻辑坐标转换为屏幕坐标

pCursorPos.x=window.pCursorPos.x+pTopLeftPos.x;

pCursorPos.y=window.pCursorPos.y+pTopLeftPos.y;

//计算鼠标点击位置的屏幕坐标

if(strcmp(chObjectClassName,"Edit")==0

||strcmp(chObjectClassName,"Button")==0

||strcmp(chObjectClassName,"ComboBox")==0

||strcmp(chObjectClassName,"ListBox")==0

||strcmp(chObjectClassName,"CheckBox")==0

||strcmp(chObjectClassName,"msctls_updown32")==0)

window.bIsOperationOK=true;

else

window.bIsOperationOK=false;

//通过窗口类判断窗口是否支持鼠标和键盘操作

if(IsWindowEnabled(hwnd))

window.bIsObjectEnable=true;

else

window.bIsObjectEnable=false;

//判断窗口是否可操作

if(strcmp(chObjectClassName,"Button")==0

||strcmp(chObjectClassName,"Static")==0)

{

strcpy(window.chParentWindowText,chObjectText);

strcpy(window.chParentWindowClassName,chObjectClassName);

}

//保存某些窗口类为“Static”、“Button”的窗口的关联窗口的

//窗口标题和窗口类

if(strcmp(window.chParentWindowText,window.chObjectText)==0

&&strcmp(window.chObjectClassName,chObjectClassName)==0)

{

window.bIsObjectExistent=true;

pScreenCursorPos.x=pCursorPos.x;

pScreenCursorPos.y=pCursorPos.y;

window.hObjectHandle=hObjectHandle;

return false;

}

//如果当前遍历到的窗口的窗口标题和窗口类与脚本内所写的目标窗口的

//窗口标题和窗口类相一致,则将当前遍历到的窗口的句柄保存为目标窗

//口句柄,并保存相应的鼠标点击位置的屏幕坐标,然后结束窗口遍历

}

else

window.bIsObjectVisible=false;

return true;

}

4.5.3操作对象

目前本自动化测试工具所支持的窗口事件主要有三种:“Click”、“Input”和“Select”,与之相对应的窗口事件处理函数也有三个:MouseEvent、KeyboardEvent和SelectEvent。当查找定位对象执行完毕后,由函数WindowEvent负责判断窗口事件类型,并转入相应的窗口事件处理函数执行操作对象的任务。

void WindowEvent()

{

if (strcmp(window.chWindowEvent,"Click")==0) MouseEvent();

else if (strcmp(window.chWindowEvent,"Input")==0) KeyboardEvent();

else if (strcmp(window.chWindowEvent,"Select")==0) SelectEvent();

else MessageBox(NULL,"Unknown window event!","Error",MB_OK);

}

函数MouseEvent主要负责模拟鼠标左键的单击事件;函数KeyboardEvent主要负责模拟键盘的按键事件;函数SelectEvent则是作为一种扩展窗口事件类型专门负责模拟ComboBox的选择事件。

4.6日志模块

日志模块分为生成日志、读出日志、树形显示和列表显示四个部分。界面由主程序菜单调用,并以对话框形式显示,图4-4是本自动化测试工具的日志界面。当用户回放脚本时会在指定路径下生成日志文件,采取每执行一条脚本命令就往日志文件中写入一条日志信息的方式,直到测试脚本中的脚本命令全都执行完毕。每回放脚本一次就重新生成一个新的日志文件,先按规则得到日志文件名,然后生成日志文件。日志内容包括测试所使用的计算机名、测试时间、测试内容、测试结果和测试失败原因分析等。



图4-4自动化测试工具的日志界面

4.7本章小结

本章从自动化测试工具的主界面开始,依次介绍了自动化测试工具各模块的设计与实现过程,并围绕着录制模块和对象交互模块列举出部分较典型的代码。在整个实现过程中,软件结构非常清晰,体现了基于UML建立软件模型的优势。


第五章 结论

本文主要对自动化测试工具进行了深入研究,并在此基础之上基于UML进行了自动化测试工具的建模,然后重点介绍了录制模块与对象交互模块的设计与开发过程。软件建模与面向对象开发方法相结合,不但使我从整体上牢牢把握住了自动化测试工具的结构,而且可以充分利用UML面向对象的优势,最终使得项目成功完成。

在进行毕业设计和撰写毕业论文的过程中,我对软件设计与开发的全过程有了更深刻的认识。短短三个月的毕业设计是宝贵的,它使我对大学四年所学的知识有了一个全面的总结,并认识到了自己的不足。由于能力有限,对自动化测试工具的认识还不够深入和透彻,理论过程和实际应用还存在着差异,功能还不是特别完善,这是本次设计的不足之处。


参考文献

[1] (美)Mark Fewster, Dorothy Graham. 软件测试自动化技术与实例详解. 电子工业出版社, 1999. 2~14

[2] (美)Kanglin Li, Mengqi Wu. 图形用户界面测试自动化. 电子工业出版社, 2005

[3] 刘寅虓. 系统分析与软件开发过程管理实用案例教程. 清华大学出版社, 2003

[4] 张志强. Windows编程技术. 机械工业出版社, 2003

[5] 求是科技. Windows API程序设计参考大全. 人民邮电出版社, 2006

[6] (美)Elfriede Dustin. 软件自动化测试:引入、管理与实施. 电子工业出版社, 2003

[7] 软件测试自动化技术IBM Rational技术白皮书. IBM Rational公司软件技术资料

[8] QuickTest Professional 8 Tutorial. Mercury公司软件技术资料

[9] Rational Robot基础使用手册. IBM Rational公司软件技术资料

[10] 苏峰, 黄金双, 汤蕾. Visual C++.NET编程实例. 清华大学出版社, 2004

[11] (美)Wendy Boggs, Michael Boggs. UML与Rational Rose 2002从入门到精通. 电子工业出版社, 2002

[12] (美)Craig Larman. UML和模式应用:面向对象分析与设计导论. 机械工业出版社, 2002


致  谢

首先感谢我的指导老师张广泉教授对我的悉心指导和循循善诱,他严谨的治学态度、睿智的学者风度与锲而不舍的钻研精神深深感染着我,为我今后的学习、工作道路点亮了一盏指路明灯。

同时还要感谢佳能(苏州)系统软件有限公司的鲁亮课长、袁学明组长及其他员工的悉心指导,感谢他们在此期间对我的帮助。

另外,我还要感谢和我同项目组的同学,在我的学习和研究过程中,他们给予了我热情的帮助。

最后感谢所有关心和帮助过我的老师与同学。





I

免费下载 ×

下载APP,支持永久资源免费下载

下载APP 免费下载
温馨提示
请用电脑打开本网页,即可以免费获取你想要的了。
扫描加我微信 ×

演示

×
登录 ×


下载 ×
论文助手网
论文助手,最开放的学术期刊平台
				暂无来源信息			 
回复
来来来,吐槽点啥吧

作者联系方式

×

向作者索要->