本书主要讲解在.NET环境下编写轻量级软件测试自动化程序的实用技术。全书内容由Windows UI测试、Web应用程序测试和存储过程及XML测试三部分组成,全面介绍了如何利用.NET平台提供的一系列技术(而不是依赖于第三方的商业自动化测试工具),采用C#语言编写轻量级的、功能强大的自动化测试程序。本书各个章节所提供的示例代码适用于单元测试(Unit Test)、集成测试(Integration Test)等软件开发过程中的各个测试环节。本书适合于所有在.NET平台上从事应用程序开发的程序员、测试人员以及自动化测试工具开发人员。
关于作者 Ⅰ
关于技术审校 Ⅲ
致谢 Ⅴ
导读 Ⅶ
第1部分 Windows应用程序测试
第1章 API测试 3
1.0 导读 3
1.1 存储用于测试用例的数据 6
1.2 读入测试用例数据 7
1.3 解析测试用例 8
1.4 把数据转换为合适的类型 9
1.5 判定测试用例通过与否 11
1.6 记录测试用例结果 13
1.7 给测试用例结果加上时间戳 16
1.8 通过计算对测试结果进行总结 17
1.9 获得测试运行的总时间 19
1.10 处理输入为空或期望值为空的情况 20
1.11 处理“方法抛出异常”的情况 22
1.12 处理输入参数为空字符串的情况 24
1.13 编写程序,在测试用例失败时发送警告邮件 26
1.14 自动运行测试套件 28
1.15 示例程序:ApiTest 29
第2章 基于反射的UI测试 33
2.0 导读 33
2.1 运行待测程序 35
2.2 设置窗体的属性 39
2.3 获得窗体属性 44
2.4 设置控件的属性 47
2.5 访问控件的属性 50
2.6 方法调用 53
2.7 示例程序:ReflectionUITest 58
第3章 基于Windows的UI测试 65
3.0 导读 65
3.1 运行待测程序 66
3.2 获得待测程序主窗体的句柄 68
3.3 获得有名字控件的句柄 73
3.4 获得无名控件的句柄 75
3.5 发送字符给控件 78
3.6 鼠标单击一个控件 80
3.7 处理消息对话框 82
3.8 处理菜单 86
3.9 检查应用程序的状态 89
3.10 示例程序:WindowsUITest 91
第4章 测试套件设计模式 97
4.0 导读 97
4.1 创建使用文本文件存储数据并采用Streaming模型的测试套件 100
4.2 创建使用文本文件存储数据并采用Buffered模型的测试套件 104
4.3 创建使用XML文件存储数据并采用Streaming模型的测试套件 108
4.4 创建使用XML文件存储数据并采用Buffered模型的测试套件 113
4.5 创建用于轻量级自动化测试数据存储的SQL数据库 117
4.6 创建使用SQL存储数据并采用Streaming模型的测试套件 119
4.7 创建使用SQL数据并采用Buffered模型的测试套件 123
4.8 发掘关于待测系统的信息 126
4.9 示例程序:PokerLibTest 129
第2部分 Web应用程序测试
第5章 请求-响应测试 135
5.0 导读 135
5.1 发送一个简单的HTTP GET请求并且取回响应 138
5.2 发送带有认证信息的HTTP请求并取回响应 139
5.3 发送复杂的HTTP GET请求并且取回响应 140
5.4 逐行返回HTTP响应的内容 141
5.5 发送简单的HTTP POST请求给传统的ASP网页 143
5.6 发送HTTP POST请求给ASP.NET Web应用程序 145
5.7 处理特殊的输入字符 150
5.8 通过编写程序确定ViewSate和EventValidation的值 152
5.9 处理CheckBox和RadioButtonList控件 156
5.10 处理DropDownList控件 157
5.11 判断“请求-响应”的测试结果 159
5.12 示例程序:RequestResponseTest 162
第6章 基于脚本的Web UI测试 167
6.0 导读 167
6.1 创建一个基于脚本的UI测试套件结构 170
6.2 判断Web程序的状态 172
6.3 把进度信息记录在测试套件界面上 173
6.4 验证待测Web页面上HTML元素的值 174
6.5 操纵待测Web页面上HTML元素的值 176
6.6 把测试场景结果保存到客户端的文本文件 177
6.7 把测试场景的结果保存到服务器上的数据库表里 179
6.8 示例程序:ScriptBasedUITest 181
第7章 底层的Web UI测试 185
7.0 导读 185
7.1 启动IE并连接到这个实例 188
7.2 如何判断待测Web程序何时完全加载到浏览器 190
7.3 操纵并检查IE Shell 192
7.4 操纵待测Web页面上的HTML元素的值 194
7.5 验证Web页面上HTML元素的值 195
7.6 创建一个Excel工作簿用来存储测试场景的运行结果 198
7.7 把测试场景的运行结果存入Excel工作簿 200
7.8 从Excel工作簿里读取已存储的测试结果 201
7.9 示例程序:LowLevelUITest 203
第8章 Web Service测试 207
8.0 导读 207
8.1 使用Proxy机制测试Web方法 212
8.2 使用套接字测试Web方法 214
8.3 使用HTTP测试Web方法 220
8.4 使用TCP测试Web方法 222
8.5 使用存储在内存中的测试用例数据 226
8.6 把测试结果存储在内存中 229
8.7 示例程序:WebServiceTest 232
第3部分 部分数据测试
第9章 SQL存储过程测试 237
9.0 介绍 237
9.1 创建测试用例以及测试结果存储 239
9.2 执行T-SQL脚本 241
9.3 使用BCP工具导入测试用例数据 243
9.4 创建T-SQL测试套件 245
9.5 从T-SQL测试套件里把测试结果直接写入文本文件 249
9.6 当待测存储过程返回行集的时候,如何判断测试结果是否通过 252
9.7 当待测存储过程返回out参数时,如何判断测试结果是否通过 254
9.8 当待测存储过程没有返回值的时候,如何判断测试结果是否通过 256
9.9 示例程序:SQLspTest 259
第10章 排列与组合 265
10.0 导读 265
10.1 创建数学组合对象 267
10.2 计算从n个数据中取出k个样本共有多少种取法 269
10.3 计算某个数学组合项的后继者 271
10.4 对于给定的n和k,生成所有的数学组合项 273
10.5 按照字典顺序找出某个数学组合的第m个项 275
10.6 把数学组合应用到字符串数组 278
10.7 创建数学排列对象 280
10.8 计算n阶排列的排列数 282
10.9 计算某个数学排列项的后继项 284
10.10 针对给定的n值,产生所有的数学排列项 286
10.11 按照字典顺序,找出某个数学排列的第k个项 287
10.12 把数学排列应用到字符串数组 291
10.13 示例程序:ComboPerm 293
第11章 ADO.NET测试 301
11.0 导读 301
11.1 当期望值是DataSet的时候,如何判断测试结果是否通过 303
11.2 测试有返回值的存储过程 306
11.3 测试返回值为行集(Rowset)的存储过程 309
11.4 测试把返回值放入out参数的存储过程 311
11.5 测试没有返回值的存储过程 314
11.6 测试不通过存储过程对数据库进行访问的程序 318
11.7 比较两个DataSet对象是否相等 321
11.8 从文本文件把测试用例数据读入到SQL数据库表 324
11.9 从SQL表把测试用例数据读入到文本文件 327
11.10 示例程序:ADOdotNETtest 329
第12章 XML测试 335
12.0 导读 335
12.1 通过XmlTextReader解析XML 337
12.2 通过XmlDocument解析XML 339
12.3 通过XPathDocument解析XML 341
12.4 通过XmlSerializer解析XML 343
12.5 通过DataSet对象解析XML文件 347
12.6 通过XSD Schema对XML文件进行验证 350
12.7 通过XSLT对XML进行修改 353
12.8 通过XmlTextWriter对XML文件进行写操作 355
12.9 比较两个XML文件是否严格相等 356
12.10 不考虑编码方式,比较两个XML文件是否严格相等 358
12.11 比较两个XML文件的规范等价性 359
12.12 示例程序:XmlTest 361
索引 365
本书讲的是什么
本书讲解的是在.NET环境下编写轻量级软件测试自动化程序的实用技术。如果你从事的是.NET软件的开发、测试或管理工作,那么这本书就是为你而写的。在.NET之前,编写自动化测试程序往往和编写待测程序一样困难。有了.NET,只需要以前几分之一的时间就可以编写出轻量级、定制的自动化测试程序。说到轻量级的自动化测试程序,我的意思是源代码通常不超过两页或者编写时间不超过两个小时、小型、专用的测试套件。本书的重点在于介绍可以直接应用到日常工作的那些实用技术。
本书适合哪些人
本书的读者定位是采用.NET技术的软件开发者、测试人员和管理人员。阅读本书的前提是要基本熟悉.NET,但是对具体的熟练程度并没有特殊的要求。书中的例子已经在一些讲座中成功地得到应用,这些讲座的听众既有初级程序员,又有高级的系统程序员,背景千差万别。另外,本书的内容也曾针对一些学习中级.NET编程的学生进行过讲授,实践证明这些内容是非常有效的。
轻量级自动化测试的优点
本书所讲述的自动化测试技术是为了补充其他测试的不足,比如手工测试、测试驱动开发(test-driven development)、基于模型的测试(model-based testing)、开源测试框架、商业测试框架等等,而不是为了替代这些测试。软件测试自动化(包括本书所讲解的技术)相比于手工测试有5个优点。有时候我们把自动化测试相比于手工测试的这些优点概括为SAPES:更快的速度(Speed),更高的准确性(Accuracy)、精度(Precision)以及效率(Efficiency),并且更有利于测试者提升自身技能(Skill-Building)。此外,与开源测试框架和商业框架相比,轻量级的自动化测试没有前者那么陡峭的学习曲线(有些框架甚至要求你学习一门专用的脚本语言)。与商业自动化测试框架相比,轻量级的自动化测试花费相对便宜并且很容易进行定制。与开源测试框架相比,轻量级的自动化测试不会有太多版本更新和bug修复,从而更为稳定。轻量级的自动化测试套件与商业测试框架和开源测试框架相比,最大的优点是可以调动测试者的主观能动性——轻量级的自动化测试积极鼓励编写有创造性的测试程序,而商业框架和开源框架常常限制你只须编写框架支持良好的那些测试类型。轻量级的自动化测试唯一的缺点是不太容易维护。因为轻量级的测试套件编写起来非常容易,如果不小心处理,所创建的大量测试套件、测试用例数据和测试用例结果文件可能使你不堪重负。测试过程管理超出了本书的范围,但是在编写轻量级的自动化测试程序时,这却是一个不容低估的有挑战性的问题。
关于代码
本书所有代码都采用C#语言编写。因为底层的.NET框架为各种编程语言提供了统一的平台,如果有需要,不用费太大力气就可以把书中的这些代码改写成Visual Basic .NET代码。书中的所有代码都经过了测试,并且在Windows XP Professional (SP2)和Windows Server 2003上采用Visual Studio .NET 2003(with Framework 1.1)和SQL Server 2000成功运行。这些代码也针对Visual Studio 2005 (with Framework 2.0)和SQL Server 2005进行了测试。但是如果你的工作环境是后者,则需要对这些代码进行一些细微的改动。这些代码针对的是32位的操作系统,并没有针对64位的系统进行过测试。
如果你对软件测试自动化还不是很熟悉,你可能很快就会发现,作为一个测试人员编写代码与作为开发人员编写代码有着明显的不同。本书中的大部分代码都采用传统、脚本风格的编码方式,而没有采用面向对象的风格。我觉得采用脚本风格编写的自动化测试代码更容易理解,但这只是我个人的看法。
另外,很多示例代码并没有引入很多参数,也没有封装成方法。这么做是为了让代码更为简洁明了。大多数通常的错误检查代码(比如针对方法的输入参数进行检查)都被省略掉了。错误捕获对于产品级的自动化测试代码来说是至关重要的(毕竟,我们是在通过代码找出错误),但是用于错误检查的代码经常是核心代码的三四倍。你可以很容易地对本书中的代码进行修改,比如封装成方法、添加错误检查、集成到其他测试框架以及封装到工具类或者程序库。本书大部分章节所测试的都是出于演示目的的小程序。从设计上来说,这些小程序并不是好的编程风格的范例,而且这些待测程序经常还包含故意制造的一些错误。这么做是为了保持演示程序不至于过大并且也模拟了在开发过程中出于尚待完善状态的应用程序。例如,我通常使用textBox1这样的默认控件名称,而没有采用更具说明性的名称,局部变量名称我也取得很短(比如用s表示一个字符串变量),有时候我还会把多个语句写在同一行上,等等,不一而足。我在本书的插图中还留下一些“严重等级为4”的bug(印刷错误);试试看你能不能找到它们。大多数时候,我都尽量让自己使用的术语尽可能地准确。例如,当某个子程序是C#类的成员函数时,我使用术语方法(method),当指代Win32 API库的C++子程序时,我使用术语函数。但是,有时候当我觉得使用意思相近的术语可能更容易理解或者更容易让别人读懂,我也会使用那些稍有偏差的术语。例如,有时候我使用术语字符串变量(string variable)而不是更为准确的字符串对象(string object)来指代C#的字符串。
本书采用了提出问题并给出解决方案(problem-solution)的组织结构。这种方法的优点是可以方便地组织各种各样的自动化测试任务。但是为了让本书的篇幅限制在合理的范围内,大多数解决方案并不是完整并且独立的代码段。我的意思是说,我经常会省略掉变量声明,或者不会一再地讨论解决方案中所用到的命名空间和工程引用,等等。许多解决方案经常会用到同一章中的其他解决方案,所以你应该仔细考虑一下它们之间的依赖关系,以及如何才能利用它们写出完整的测试套件。为了帮助读者理解一章的各个小节是如何一起工作的,每章的最后一个小节我都给出了完整的独立的程序代码。
本书内容
大多数计算机书籍,都会在导读部分概要性地介绍一下书中的内容。我不打算采取这种做法,我觉得要知道一本书的内容最好的方法是浏览一下它的目录;我自己通常就是这样做的。尽管如此,我还是想提一下本书的4个特定主题,这4个主题在我的同事中间激发了巨大的兴趣。第1章,“API测试”从很多方面来说都是软件测试最基本的类型。如果你对软件测试还不是很熟悉,你不但可以学到有用的测试技术,而且还能了解到软件测试中的许多基本原则。第3章,“基于Windows的UI测试”介绍了通过用户界面对应用程序进行操纵的技术。即使有很多年经验的软件测试人员也会惊叹于通过.NET和第3章所讲述的技术,UI测试能变得如此的容易。第5章“请求-响应测试”讲解了用于测试Web程序的基本技术。Web开发人员和测试人员经常也会惊叹于在.NET环境下,这些技术是如此的强大。第10章“排列与组合”介绍了如何通过编写程序生成把输入值的所有排列或组合考虑在内的测试用例。有经验的测试人员和测试新手都觉得组合数学和.NET结合起来大大提高了测试用例的生成效率。
使用书中的代码
本书旨在为从事软件开发和测试的人员提供实际的帮助。很自然地,这就意味着你可以在你的系统或文档里使用本书给出的代码。但是这种授权并不包括在网站上或杂志文章中大段地复制本书中的代码,或者在会议讲演中使用本书给出的例子,等等。大多数作者(包括我在内)都会希望,如果您在书中或杂志中用到了他们书中给出的例子,那么最好能指明所援引例子的原作者。另外,作者对使用这些示例代码可能造成的后果不承担任何责任。
联系博文视点
您可以通过如下方式与本书的出版方取得联系。
读者信箱:sheguang@broadview.com.cn
投稿信箱:broadvieweditor@gmail.com
北京博文视点资讯有限公司(武汉分部)
湖北省 武汉市 洪山区 吴家湾 邮科院路特1号 湖北信息产业科技大厦1402室
邮政编码:430074
电话: (027)87690813 传真:(027)87690813转817
若您希望参加博文视点的有奖读者调查,或对写作和翻译感兴趣,欢迎您访问:
http://bv.csdn.net
关于本书的勘误、资源下载及博文视点的最新书讯,欢迎您访问博文视点官方博客:
http://blog.csdn.net/bvbook
无封面