标题：测试有道:微软测试技术心得
内 容 简 介
本书由微软公司专家撰写，书中包含很多新颖的测试工具介绍，重点内容中英文对照是本书的另外一大亮点。书中包括超过20个微软公司的开发团队常用的测试工具及其使用方法的介绍。有很多工具是第一次正式通过出版物向公众介绍，包括一些刚刚开源不久的、之前仅在微软内部使用的测试自动化工具。同时本书还提供了一些实用测试文档的模板、内部最佳做法，以及常用度量标准，为读者的实际测试工作提供帮助。
本书适合学习和研究测试技术的测试工程师、对测试感兴趣的人员，以及高校学生阅读和参考。
作者简介
梁博，微软软件工程过程、软件测试、．NET框架技术专家，软件工学硕士。现任微软中国研发集团战略合作部产品外包合作组项目经理，负责中国本土外包产业的培育和发展项目，放眼国际深耕中国。曾任微软（中国）有限公司平台及开发技术部开发合作技术经理，分别长驻微软北京、上海分公司负责微软“潜力发展计划”和“卓越软件开发商计划”在华北、西部、华东三个区域的调研和实施，足迹遍布全国。
许珊，毕业于北京外国语大学，现就职于微软中国有限公司业务发展部，负责政府及电信行业高层上午活动的组织。此前在新华社国际部和CNET inernational IT没提工作，与英国金融时报特派自身记者共同完成北京奥运特稿。英文环保网站Greenbang的创立人之一，关注全球变暖给人类生活及商业发展带来的影响。负责撰写中国在环保方面的技术进步，商业举措及政府制度等专栏。
徐歆恺，软件工程硕士，微软技术专家，办公自动化认证专家，多年VC++，MFC，.NET，VB，VBA技术和Microsoft Office产品系列开发和测试经验。徐歆恺先生是中国人民解放军总装备部、北京航空航天大学、北京师范大学等单位的高级办公应用技术特约专家讲师。
引 子
今天，软件测试工程师会告诉我们，他们的主要工作就是发现缺陷。但是，我们都知道，测试将永远不会找到所有的缺陷，而且更不可能去“测试质量”。产品质量的显著提高需要改变我们的软件工程实践。为了达成长远的影响，我们的测试工程师必须要有更高的技能，并参与到软件开发生命周期中的每一个阶段中来。测试必须要不断地发展，以确保软件质量从产品刚开始构想阶段就得到贯彻。测试需要了解如何建立一个高质量的基础架构，以及如何最大化测试的影响，同时保持灵活性，并不断提高测试效率。
——S·索马塞加尔（DevDiv副总裁）
是的，包括微软公司在内的业界各个软件开发企业在不长的几十年的软件产品开发和服务提供的实践中，都深深认识到软件测试和软件测试工程师在软件开发工程过程中是必不可少的。在早期的“软件作坊”时代中，个人英雄主义盛行，大家崇尚程序员单打独斗的行为。但很明显，现如今已经到了一个新的时代，一个软件作为服务来提供的时代，一个软件系统的复杂性急剧增加的时代，一个成功的软件开发需要大量各有所长在一起相互配合和协作的人群参与的时代，一个多样化的时代。我们站在一个越来越“平”的地球上。在这个时候，在一个团队中，软件开发工程师重要、项目经理重要、测试工程师重要、文档工程师重要……因为少了谁，哪个角色做得不好，都会影响到产品最终如期发布抢占市场先机，都会影响到用户的最终体验——这种影响是生死攸关的。
但是，如果有人今天告诉我们说：“作为一个软件测试工程师，你非常重要。”我们可千万不要当真！要明白这些站在台上的人的潜台词，他们的本意是：软件测试工程师这个群体，重要！但作为个体的我们，只有首先让自己变得重要，然后才能有幸去代表“软件测试工程师”这一“重要”群体。任何人无法把“重要”这一荣誉附加到我们身上，我们只有自己不断努力学习专业知识，不断积累实践经验，才能赢得同事们的尊重和赞赏、获得应得的回报，真正变得重要。之所以说软件测试工程师这个角色并不是一个技术含量低或者低人一等的工作，是因为这种评价完全取决于从事和参与这项分工的人的能力、素质和技术水平。从这种层面上来看，只有分工的不同。
“你很重要！”
目 录
第1章 软件测试概述2005年笔者接触到了北京的一些培训公司，他们介绍说现在软件测试类的课程非常受欢迎，现在市面上有大量软件测试工程师的职位在公开招聘。实际上当时北京的几个大的外包公司如文思创新、博彦科技、天海宏业（后被大连海辉并购）、中软、神州数码等早就已经开始在大张旗鼓地挖抢人才，在北京市场上，对软件测试工程师的需求早就骤然如井喷式爆发。
什么是软件测试1测试工程师的任务3小知识 5什么是PSS数据5什么是Watson数据5测试工程师的职业路径6成功职业生涯规划的提示7测试与管理15案例：微软软件开发团队 16练习：测试自动可乐贩卖机18第2章 测试与软件开发模型软件开发生命周期模型（Software Development LifeCycle）指的是软件开发全过程、活动和任务的结构性框架。软件项目的开发会包括需求、设计、编码、测试、稳定、部署等阶段，有时也会包括维护阶段。本章介绍现今被业界广为使用的几种主要的开发模型，以及测试在这些模型中的地位。
瀑布模型（Waterfall Model）20RUP 20敏捷软件开发方法（Agile software development）22软件开发过程中的测试 23提高软件的可测性（Testability）23测试模式24微软的软件产品开发过程 25案例：MSF (Microsoft Solution Framework)28第3章 软件质量与测试软件跟其他的工业产品并没有本质区别，现代社会的工农业化进展已经经过了几十年，有很多种方法可以用来控制产品的质量，从而可以保证人民群众购买到的水果、食物、家电、设备尽可能少得出现瑕疵。这些被现代生产制造企业广泛采用的产品质量控制和质量保证方法，一样可以用于软件产品的质量保证和控制。例如，“全面质量管理”是一个基于统计学原理的质量控制方法，这个方法的发展过程就非常具有代表性，也会有助于我们理解软件的质量控制。
软件质量（Quality） 35
质量控制（Quality Control） 36
质量保证（Quality Assurance） 37
软件工程师摧毁地球 38
全面质量管理（Total Quality Management，TQM） 38
能力成熟度模型（Capability Maturity Model® Integration，CMMI） 39
ISO 9000 & ISO 17205 40
事后析误（Postmortem） 41
根本原因分析（Root Cause Analysis, RCA） 41
故障模式与后果分析（Failure mode and effects analysis） 42
威胁模型分析（Threat Model Analysis, TMA） 43
第4章 软件测试方法软件程序设计有基本的算法，软件系统测试也有一般性的测试方法。使用这些测试方法，我们往往能够找到那些最一般、最普遍的软件问题，这些方法也可以帮我们事半功倍地发现软件中存在的错误和瑕疵。更重要的是，这些一般性的软件测试方法可以被自动化，我们可以借助这些方法生成一些辅助性的自动化测试工具，从而可以让测试更加高效。
黑盒测试（Black-box testing） 45
白盒测试（White-box testing） 46
灰盒测试（Grey-box Testing） 48
基于场景的测试方法（Scenario testing） 49
等价类法（Equivalence value class） 50
练习：等价类测试设计 51
边界值法（Boundary value analysis） 52
示例：边界值分析 53
判定表法（Table Based Methodology） 54
组合分析法（Combinatorial analysis） 55
工具：PICT工具使用 56
状态转换表（State transition） 58
第5章 软件测试类型根据产品的特点，要在不同的阶段进行不同的测试操作。有一些测试是随时随地进行的，不少测试是有计划进行的，例如在每个功能完成之后，在每一个版本编译完成之后，就一定要进行回归测试、冒烟测试和版本验证测试。在产品的测试版本阶段，一般都会执行探索性测试。对于软件的用户界面、安全性、性能和可靠性、稳定性、用户安装等跟用户的软件使用体验直接有关的方面，我们也都必须要进行测试。
功能测试（Functional Testing） 59
小知识：API Testing 61
工具：NUnit 61
工具：Visual Studio 单元测试框架 62
回归测试（Regression testing） 63
冒烟测试与BVT测试 65
探索性测试（Exploratory testing） 67
安装/版本升级测试（Setup/upgrade testing） 69
工具：VeriTest-Rational Installation Analyzer 71
软件兼容性测试（Compatibility testing） 72
案例：Windows Vista兼容性测试 72
小知识：UAC 73
工具：ApplicationVerifier 75
性能测试（Performance testing） 77
工具：Windows Performance Analysis Tools（WPT） 79
工具：Visual Studio性能分析工具 80
工具：WPFPerf 81
负载测试（Load testing） 83
监视和分析负载测试结果 84
压力测试（Stress testing） 85
国际化/全球化/本地化测试 87
小知识：I18N, G11N, L10N 88
编码 89
工具：Character Map程序 91
工具：屏幕键盘工具 92
辅助选项测试（Accessibility testing） 92
工具：accVerify 94
工具：UI Spy 94
安全性测试（Security testing） 95
保证应用的安全性和威胁建模 96
小知识：微软安全性测试10个小提示 98
小知识：Microsoft SDL 98
工具介绍：SDL Threat Modeling Tool v3 99
安全托管代码 100
托管代码的常见设计缺陷 101
工具：Fxcop 103
C/C++代码的常见设计缺陷 104
工具：Prefast 105
代码度量（Code Metrics） 107
工具：Visual Studio 2008代码度量 108
第6章 测试计划和测试策略软件开发过程中的战略部署保证软件开发过程朝着正确的方向前进，软件开发过程中的计划保证战略按部就班地实施。在制订软件开发计划的时候，同时要制订软件测试计划。在现代的软件开发过程中，测试早就已经是项目过程中必不可少的一个任务，作为一个贯穿始终的行为，软件测试必须要有计划和策略。软件测试的计划依附于软件开发的计划，所以在进行软件测试计划时，要参考软件开发计划，当然，也要参考用户需求说明书和软件规格说明书等材料。
什么是测试计划 110
模板：测试计划文档 111
什么是测试策略 139
模板：测试策略模板 140
测试范围 143
风险优先级模型 145
基于风险的测试 146
有计划的复审活动 147第7章 测试自动化本章向大家介绍一些软件测试自动化小工具，包括一些录制工具、用户界面测试的自动化工具、基于模型的软件测试自动化工具，同时也介绍了一些自动化测试框架和类库，使用这些框架和类库，大家都可以开发自己的软件测试自动化工具。本章介绍到的工具，都是微软公司一直在内部使用的小工具，现在已经全部开放下载和使用。
测试自动化的发展 150
手动测试 151
硬编码测试自动化 152
工具：RPF（Record and Playback Framework）Programmer 152
练习：轻量.NET UI自动化设计 153
小知识：反射技术 159
Microsoft UI自动化库 160
测试自动化程序设计 160
测试库和测试框架 161
工具：White 162
数据驱动测试 164
基于模型的测试 165
小知识：杀虫剂悖论 166
例子：微软过桥问题 166
小知识：Dijkstra算法 168
工具：WinSTDtoDOT Visualization Tool 168
工具：NModel工具 170第8章 代码覆盖率代码覆盖率技术是对测试的检验，同时也是一种间接检验软件代码质量的方法。毫无疑问，代码覆盖率很重要。代码覆盖率的考量，是对软件测试用例水平的考量，这时，我们对软件测试开始进行管理。软件测试从全凭经验的、随机的、不可控的阶段进入到了可管理、可控制、可度量的新的阶段。
代码覆盖率 171
覆盖种类 173
代码覆盖率度量结果分析和决策 178
其他类型的覆盖 178
工具：Visual Studio代码覆盖率工具 179
第9章 调试调试技能是软件支持工程师赖以生存的最基本技能，软件测试工程师最好能了解一些调试技术的知识。不少时候我们测试的程序是已经编译完成的版本，如果出现了崩溃、蓝屏、或者其他严重的系统性错误，如果我们掌握一定的调试技能，就能在运行时抓取错误，跟踪错误，找到导致程序出错的代码片段的位置。请记住，软件测试工程师的角色永远不是找错，而应该是找出错误的根源。
调试 180
工具：Visual Studio在设计时进行调试 182
异常 182
小知识：异常捕获 185
断言（ASSERT） 186
工具：WinDBG 187
托管代码中的断言 188
转储文件 188
转储文件类型 189
用户模式数据转储文件生成 191
核心转储文件生成 191
远程调试 192
调试准则 192
调试建议 193
第10章 测试文档编写本书提供了一些实用测试文档的模板、内部最佳做法及常用度量标准。相信这些内容会为读者的实际测试工作提供帮助。
测试文档概述 196
测试用例 197
模板：测试用例模板 198
软件缺陷报告（Bug Report） 199
模板：软件缺陷报告 201
项目状态报告 203
第11章 软件缺陷管理软件缺陷的管理包括：缺陷类选和缺陷消除管理。所有的软件缺陷，所有被发现的软件缺陷，都应该被存储在缺陷管理库中，以备查和再次验证。这个缺陷被操作的过程，这个缺陷被最终解决的方法，都要被记录下来，作为知识保留。软件缺陷和测试用例等都是关联在一起的，对于软件缺陷的管理，跟对源代码的管理，对测试用例的管理一样，都是现代软件项目管理的一部分。
缺陷处理工作流 204
缺陷类选（Bug Triage） 205
缺陷类选图例 206
优先级和严重性定义 207
小知识：错误收敛（Bug Convergence） 212
小知识：零错误反弹（Zero Bug Bounce） 212
缺陷消除的有效性（Defect Removal Efficiency） 214
第12章 完整的测试体系构成企业中要真正实施软件测试，就必须建立一个完整的软件测试体系，建设软件测试队伍，搭建软件测试的软件硬件环境，购买必须的工具，并对人员进行训练。
人员 215
一个完善的测试体系的构成 217
环境搭建 218
测试执行管理 220
工具：WTT测试框架 221
工具：VSTS测试管理 221
第13章 微软公司企业文化我们希望在这里与大家一起分享微软公司的企业文化中代表性的一些要点，这些要点可能会帮助到大家，用更加“微软”的方式去思考，也可以更容易地去跟微软公司的项目经理和工程师进行沟通。
员工才是最重要的资产 226
认同和鼓励多元化 227
用技术武装人 228
技术可以改变员工的工作方式 229
利用信息要真正帮助员工和企业 229
微软公司价值观 230
微软的企业商业环境 231
实现承诺 232
从错误中学习 233
按期完成工作 233
了解决议的形成过程 235
解决冲突 236
尊重多元化 237
第14章 更加国际化承接欧美外包项目，就需要参与者更加国际化。世界上的民族和国家之间的文化差异其实非常明显。本章中讨论的文化主要是美国文化，因为本书面向的期望读者群将有很多正在从事着来自美国企业的外包项目。在仔细审视美国的核心价值与商业后会发现，作为一个软件测试工程师或软件开发工程师，不能仅停留在代码编写层面，在商业社会里大家都分工协作，要想保持顺畅的沟通，就必须理解对方的民族性格。
打死我也不说（Yes to death） 238
美国的核心价值与商业 239
第15章 测试经理的领导力培养在美国，有一种领导者往往具有非常强的个人魅力和远见，能够通过自身的人格去影响他人。因为他们的特殊天赋和激励他人的能力，这种人通常会成为领袖。但往往这种类型的领导是不可替代的，当他们离开时，所在的组织可能会陷入一个混乱的状态。
领导风格 246
激励团队 248
构建团队 251
做出决定 254
附录附录A 对欧美外包的有效沟通之道 257
美国人的沟通方式 257
建立信誉 260
获取信息 263
善于表达 265
手机、电话、邮件、书信、报告 269
交涉与谈判 272
与美国人讨论的话题 276
附录B 对欧美外包活动之有效的会议组织 281
组织有欧美人士参加的会议 281
附录C 学会写邮件 286