书籍详情
软件自动化测试实战解析:基于Python3编程语言
作者:徐西宁
出版社:机械工业出版社
出版时间:2021-07-01
ISBN:9787111685616
定价:¥89.00
购买这本书可以去
内容简介
本书由浅入深地对自动化软件测试进行了阐述,内容涵盖软件测试的基础知识、Python、PyTest、Selenium、面向对象编程、自动化测试框架的设计要点和测试自动化开发实践等,本书内容组织成入门、进阶和高阶三个逐步提高的版块,每个版块都有实战编程章节,清晰呈现了技术方案的打磨和改进的过程。本书的内容分为三个大的版块。个版块,从基础的部分讲起,让基础薄弱的工程师对测试和编程语言有基本的认识,在此基础上开始了解PyTest测试框架的基础用法,以及如何用Selenium来做简单的Web UI的自动化测试。通过这个版块的学习,测试工程师有能力把一些简单的测试工作用代码实现,减少手工重复劳动的比重,做到一定程度的测试自动化,这是对自动化测试工程师的入门要求。第二个版块,夯实Python语言基础,讲解更深入的PyTest和Selenium特性,演示如何应用这些知识来改进测试用例的编写,改善测试框架,让测试自动化更加高效。通过这个版块的学习,测试工程师对编程语言和测试工具会有更深入的了解,可以更高效地进行测试自动化的工作,有能力开始针对产品特性来设计自动化测试框架,这是工程团队对中级测试工程师的一般要求。第三个版块,学习Python的高级特性、面向对象的思想、自动化测试工具和框架的高级特性、设计思路、以及存在的问题、限制及其改进思路、工程团队的高质量协作、实际项目中的实践等更深入的内容,这个部分包含了大量实战中提炼出来的经验和总结。通过这个版块的学习,测试工程师可以往高级工程师和架构师方向迈出坚实的一步,而具备这样的技术能力和思维方式后,测试工程师可以在整个软件工程团队中起到非常积极的正面影响,而不只限于测试团队。每个版块的末尾都有一个实战章节,所有的实战章节围绕同一个测试场景展开,前后衔接呼应,有很强的延续性。每个实战章节都是针对相应的技术水平而设计的,读者可以非常直观地看到代码和设计如何随着技术水平的提升而改进。
作者简介
徐西宁,毕业于华中科技大学计算机学院,资深全栈软件工程师,从事软件开发和测试工作15年,先后任职于Autodesk、EMC、每锐软件等公司,在自动化测试框架设计、自动化测试流程优化、持续集成、Web开发等方面有丰富的经验,是一位活跃的开源软件和技术分享实践者。
目录
序一
序二
前言
第1章 软件测试基础 1
1.1 什么是软件测试1
1.2 软件测试的类型2
1.2.1 按测试对象的颗粒度划分2
1.2.2 按内部逻辑的透明度划分3
1.2.3 按执行阶段划分4
1.2.4 按执行方式划分4
1.3 敏捷开发模式5
1.4 测试经济学6
1.4.1 测试是必需的吗6
1.4.2 放弃追求完美7
1.4.3 关注核心功能8
1.4.4 等价类划分8
1.4.5 边界值分析9
1.4.6 用机器取代人工10
1.5 自动化测试不容易12
1.6 本章小结12
第2章 Python入门 13
2.1 世界上好的两种编程语言13
2.2 别问我怎么安装14
2.3 解释器是什么14
2.4 初识变量16
2.5 函数基础17
2.6 代码缩进和代码块18
2.7 字符串19
2.7.1 拼接和格式化21
2.7.2 下标访问22
2.7.3 更多常见操作23
2.8 数值类型26
2.8.1 数值类型的基本运算27
2.8.2 浮点数的常见运算29
2.9 布尔值和条件判断32
2.9.1 条件判断的组合33
2.9.2 条件判断的短路34
2.9.3 条件判断的链式表达35
2.10 日期和时间36
2.10.1 生成时间对象37
2.10.2 格式化日期字符串38
2.11 list基础39
2.11.1 下标访问40
2.11.2 插入元素40
2.11.3 删除元素41
2.11.4 简单排序42
2.11.5 更多常见操作43
2.11.6 遍历44
2.11.7 元素类型46
2.12 dict基础47
2.12.1 读取48
2.12.2 插入和更新49
2.12.3 合并50
2.12.4 删除51
2.12.5 遍历53
2.12.6 key的选择55
2.13 循环56
2.13.1 while循环57
2.13.2 for循环58
2.13.3 多重循环59
2.13.4 循环的终止60
2.13.5 递归63
2.14 异常63
2.14.1 基本语法64
2.14.2 异常的类型67
2.14.3 捕获特定类型的异常68
2.14.4 主动抛出异常71
2.15 断言72
2.15.1 assertion72
2.15.2 AssertionError73
2.15.3 assert73
2.16 pip的基础用法74
2.17 本章小结76
第3章 PyTest入门 77
3.1 框架是什么77
3.2 测试框架77
3.2.1 筛选测试源文件77
3.2.2 筛选测试函数78
3.2.3 测试函数的启动79
3.2.4 成功还是失败80
3.2.5 测试报告80
3.2.6 测试前的环境配置81
3.2.7 测试后的现场清理81
3.2.8 核心功能的扩充82
3.2.9 主流测试框架82
3.3 PyTest是什么83
3.4 自动发现84
3.4.1 自动发现测试源文件84
3.4.2 自动发现测试函数84
3.5 使用断言85
3.6 测试结果解读86
3.7 测试报告88
3.8 本章小结89
第4章 Selenium入门 90
4.1 Selenium是什么90
4.1.1 Selenium IDE91
4.1.2 Selenium Grid97
4.1.3 Web Driver98
4.2 Selenium的安装配置99
4.3 用Web Driver驱动网页100
4.4 页面元素的定位102
4.4.1 简单定位102
4.4.2 CSS定位107
4.5 页面元素的常见操作108
4.6 本章小结112
第5章 实战12306之入门篇 113
5.1 测试用例设计文档113
5.2 代码实战114
5.3 代码解析116
5.3.1 审视测试逻辑116
5.3.2 用变量澄清代码逻辑117
5.3.3 DRY原则118
5.3.4 改善代码可读性120
5.4 本章小结122
第6章 Python进阶 123
6.1 基本数据类型的深入了解123
6.1.1 转义字符123
6.1.2 字符串的不可变性124
6.1.3 深入了解布尔类型126
6.1.4 set128
6.1.5 tuple131
6.1.6 整型数的设计很优秀132
6.1.7 浮点数为什么算不准133
6.1.8 Decimal,准!134
6.2 深入了解函数137
6.2.1 函数的调用137
6.2.2 函数的返回138
6.2.3 不支持函数重载139
6.2.4 默认参数141
6.2.5 可变参数142
6.3 关于时间144
6.3.1 时间差144
6.3.2 UTC时间146
6.4 面向对象基础148
6.4.1 面向对象到底是什么意思148
6.4.2 类和对象148
6.4.3 初始化函数149
6.5 模块是什么151
6.6 高级排序153
6.6.1 list的排序153
6.6.2 dict的排序157
6.6.3 自定义对象序列的排序159
6.7 复杂的遍历场景160
6.7.1 一边遍历一边修改160
6.7.2 一边遍历一边删除162
6.8 文件和文件系统操作基础165
6.8.1 路径的正确操作方式165
6.8.2 文件系统的基本操作168
6.8.3 文本文件的读169
6.8.4 文本文件的写170
6.8.5 文本文件的关闭171
6.8.6 CSV文件的读写172
6.8.7 Excel文件的读写174
6.9 浅拷贝与深拷贝176
6.10 深入了解import179
6.11 变量的作用域182
6.12 局部变量和全局变量的冲突185
6.13 __name__和__main__186
6.14 注释188
6.15 pip的工程用法190
6.16 本章小结192
第7章 PyTest进阶 193
7.1 自动发现测试类193
7.2 测试集合194
7.3 标记195
7.3.1 忽略执行195
7.3.2 条件执行197
7.3.3 期待失败的发生199
7.3.4 限时执行201
7.3.5 自定义标签201
7.4 参数化测试204
7.5 测试用例的ID206
7.6 Fixture初探207
7.7 PyTest的插件机制209
7.7.1 Hook函数209
7.7.2 PyTest插件210
7.7.3 多级conftest协同210
7.7.4 第三方插件212
7.8 本章小结213
第8章 Selenium进阶 214
8.1 页面元素的XPath定位214
8.2 页面元素的等待215
8.2.1 隐式等待216
8.2.2 显式等待216
8.3 Selenium的局限218
8.4 本章小结219
第9章 实战12306之进阶篇 220
9.1 PO设计模式220
9.2 更有针对性的显式等待223
9.3 更健壮的代码逻辑224
9.4 函数单一职责原则225
9.5 测试单一职责原则226
9.6 本章小结227
第10章 Python高阶 228
10.1 面向对象设计思想228
10.1.1 继承228
10.1.2 封装230
10.1.3 多态232
10.2 对类的深入了解233
10.2.1 析构函数233
10.2.2 访问权限控制235
10.2.3 self不是关键字236
10.2.4 实例属性和类属性239
10.2.5 成员方法和类方法240
10.2.6 类方法和静态方法242
10.3 重写244
10.3.1 如何重写244
10.3.2 重写中的代码复用247
10.3.3 重写__str__方法249
10.3.4 重写运算符249
10.4 深入了解函数252
10.4.1 函数也是一种对象252
10.4.2 内嵌函数254
10.4.3 函数装饰器255
10.4.4 不只是会装饰259
10.4.5 用Property装饰器改进设计261
10.5 None是什么264
10.6 Enum是什么265
10.7 Python不支持常量267
10.8 随机数据和时间戳268
10.9 自定义异常类型270
10.10 需要用强类型吗271
10.11 日志272
10.12 本章小结277
第11章 测试框架的设计和演进 278
11.1 代码的可读性278
11.1.1 统一的代码风格279
11.1.2 丑陋的函数名280
11.1.3 糟糕的变量名282
11.2 友好的函数设计283
11.2.1 简洁的接口283
11.2.2 操作状态的处理285
11.2.3 不要过度设计287
11.2.4 防呆288
11.3 有效管理测试资源290
11.3.1 封装微服务290
11.3.2 统一的资源入口295
11.3.3 资源的延迟加载296
11.3.4 保证资源的释放298
11.3.5 支持多环境测试300
11.3.6 容忍不稳定的测试环境302
11.4 不要引入getter和setter304
11.5 一次收集多个断言错误306
11.6 日志的支持和改进308
11.7 减少重复执行的负面影响310
11.8 数据驱动测试的设计311
11.8.1 让PyTest支持中文ID311
11.8.2 更优雅的参数化测试314
11.8.3 用YML取代JSON316
11.8.4 面向对象的测试数据317
11.9 接受一定程度的重复代码319
11.10 本章小结320
第12章 实战12306之高阶篇 321
12.1 就近原则321
12.2 用Enum澄清设计意图322
12.3 支持链式表达324
12.4 简化函数名325
12.5 封装复杂逻辑326
12.6 单例设计模式328
12.7 异常和断言的使用场景的区别331
12.8 测试用例的维护333
12.9 本章小结334
术语表 335
参考文献 336
后记 337
序二
前言
第1章 软件测试基础 1
1.1 什么是软件测试1
1.2 软件测试的类型2
1.2.1 按测试对象的颗粒度划分2
1.2.2 按内部逻辑的透明度划分3
1.2.3 按执行阶段划分4
1.2.4 按执行方式划分4
1.3 敏捷开发模式5
1.4 测试经济学6
1.4.1 测试是必需的吗6
1.4.2 放弃追求完美7
1.4.3 关注核心功能8
1.4.4 等价类划分8
1.4.5 边界值分析9
1.4.6 用机器取代人工10
1.5 自动化测试不容易12
1.6 本章小结12
第2章 Python入门 13
2.1 世界上好的两种编程语言13
2.2 别问我怎么安装14
2.3 解释器是什么14
2.4 初识变量16
2.5 函数基础17
2.6 代码缩进和代码块18
2.7 字符串19
2.7.1 拼接和格式化21
2.7.2 下标访问22
2.7.3 更多常见操作23
2.8 数值类型26
2.8.1 数值类型的基本运算27
2.8.2 浮点数的常见运算29
2.9 布尔值和条件判断32
2.9.1 条件判断的组合33
2.9.2 条件判断的短路34
2.9.3 条件判断的链式表达35
2.10 日期和时间36
2.10.1 生成时间对象37
2.10.2 格式化日期字符串38
2.11 list基础39
2.11.1 下标访问40
2.11.2 插入元素40
2.11.3 删除元素41
2.11.4 简单排序42
2.11.5 更多常见操作43
2.11.6 遍历44
2.11.7 元素类型46
2.12 dict基础47
2.12.1 读取48
2.12.2 插入和更新49
2.12.3 合并50
2.12.4 删除51
2.12.5 遍历53
2.12.6 key的选择55
2.13 循环56
2.13.1 while循环57
2.13.2 for循环58
2.13.3 多重循环59
2.13.4 循环的终止60
2.13.5 递归63
2.14 异常63
2.14.1 基本语法64
2.14.2 异常的类型67
2.14.3 捕获特定类型的异常68
2.14.4 主动抛出异常71
2.15 断言72
2.15.1 assertion72
2.15.2 AssertionError73
2.15.3 assert73
2.16 pip的基础用法74
2.17 本章小结76
第3章 PyTest入门 77
3.1 框架是什么77
3.2 测试框架77
3.2.1 筛选测试源文件77
3.2.2 筛选测试函数78
3.2.3 测试函数的启动79
3.2.4 成功还是失败80
3.2.5 测试报告80
3.2.6 测试前的环境配置81
3.2.7 测试后的现场清理81
3.2.8 核心功能的扩充82
3.2.9 主流测试框架82
3.3 PyTest是什么83
3.4 自动发现84
3.4.1 自动发现测试源文件84
3.4.2 自动发现测试函数84
3.5 使用断言85
3.6 测试结果解读86
3.7 测试报告88
3.8 本章小结89
第4章 Selenium入门 90
4.1 Selenium是什么90
4.1.1 Selenium IDE91
4.1.2 Selenium Grid97
4.1.3 Web Driver98
4.2 Selenium的安装配置99
4.3 用Web Driver驱动网页100
4.4 页面元素的定位102
4.4.1 简单定位102
4.4.2 CSS定位107
4.5 页面元素的常见操作108
4.6 本章小结112
第5章 实战12306之入门篇 113
5.1 测试用例设计文档113
5.2 代码实战114
5.3 代码解析116
5.3.1 审视测试逻辑116
5.3.2 用变量澄清代码逻辑117
5.3.3 DRY原则118
5.3.4 改善代码可读性120
5.4 本章小结122
第6章 Python进阶 123
6.1 基本数据类型的深入了解123
6.1.1 转义字符123
6.1.2 字符串的不可变性124
6.1.3 深入了解布尔类型126
6.1.4 set128
6.1.5 tuple131
6.1.6 整型数的设计很优秀132
6.1.7 浮点数为什么算不准133
6.1.8 Decimal,准!134
6.2 深入了解函数137
6.2.1 函数的调用137
6.2.2 函数的返回138
6.2.3 不支持函数重载139
6.2.4 默认参数141
6.2.5 可变参数142
6.3 关于时间144
6.3.1 时间差144
6.3.2 UTC时间146
6.4 面向对象基础148
6.4.1 面向对象到底是什么意思148
6.4.2 类和对象148
6.4.3 初始化函数149
6.5 模块是什么151
6.6 高级排序153
6.6.1 list的排序153
6.6.2 dict的排序157
6.6.3 自定义对象序列的排序159
6.7 复杂的遍历场景160
6.7.1 一边遍历一边修改160
6.7.2 一边遍历一边删除162
6.8 文件和文件系统操作基础165
6.8.1 路径的正确操作方式165
6.8.2 文件系统的基本操作168
6.8.3 文本文件的读169
6.8.4 文本文件的写170
6.8.5 文本文件的关闭171
6.8.6 CSV文件的读写172
6.8.7 Excel文件的读写174
6.9 浅拷贝与深拷贝176
6.10 深入了解import179
6.11 变量的作用域182
6.12 局部变量和全局变量的冲突185
6.13 __name__和__main__186
6.14 注释188
6.15 pip的工程用法190
6.16 本章小结192
第7章 PyTest进阶 193
7.1 自动发现测试类193
7.2 测试集合194
7.3 标记195
7.3.1 忽略执行195
7.3.2 条件执行197
7.3.3 期待失败的发生199
7.3.4 限时执行201
7.3.5 自定义标签201
7.4 参数化测试204
7.5 测试用例的ID206
7.6 Fixture初探207
7.7 PyTest的插件机制209
7.7.1 Hook函数209
7.7.2 PyTest插件210
7.7.3 多级conftest协同210
7.7.4 第三方插件212
7.8 本章小结213
第8章 Selenium进阶 214
8.1 页面元素的XPath定位214
8.2 页面元素的等待215
8.2.1 隐式等待216
8.2.2 显式等待216
8.3 Selenium的局限218
8.4 本章小结219
第9章 实战12306之进阶篇 220
9.1 PO设计模式220
9.2 更有针对性的显式等待223
9.3 更健壮的代码逻辑224
9.4 函数单一职责原则225
9.5 测试单一职责原则226
9.6 本章小结227
第10章 Python高阶 228
10.1 面向对象设计思想228
10.1.1 继承228
10.1.2 封装230
10.1.3 多态232
10.2 对类的深入了解233
10.2.1 析构函数233
10.2.2 访问权限控制235
10.2.3 self不是关键字236
10.2.4 实例属性和类属性239
10.2.5 成员方法和类方法240
10.2.6 类方法和静态方法242
10.3 重写244
10.3.1 如何重写244
10.3.2 重写中的代码复用247
10.3.3 重写__str__方法249
10.3.4 重写运算符249
10.4 深入了解函数252
10.4.1 函数也是一种对象252
10.4.2 内嵌函数254
10.4.3 函数装饰器255
10.4.4 不只是会装饰259
10.4.5 用Property装饰器改进设计261
10.5 None是什么264
10.6 Enum是什么265
10.7 Python不支持常量267
10.8 随机数据和时间戳268
10.9 自定义异常类型270
10.10 需要用强类型吗271
10.11 日志272
10.12 本章小结277
第11章 测试框架的设计和演进 278
11.1 代码的可读性278
11.1.1 统一的代码风格279
11.1.2 丑陋的函数名280
11.1.3 糟糕的变量名282
11.2 友好的函数设计283
11.2.1 简洁的接口283
11.2.2 操作状态的处理285
11.2.3 不要过度设计287
11.2.4 防呆288
11.3 有效管理测试资源290
11.3.1 封装微服务290
11.3.2 统一的资源入口295
11.3.3 资源的延迟加载296
11.3.4 保证资源的释放298
11.3.5 支持多环境测试300
11.3.6 容忍不稳定的测试环境302
11.4 不要引入getter和setter304
11.5 一次收集多个断言错误306
11.6 日志的支持和改进308
11.7 减少重复执行的负面影响310
11.8 数据驱动测试的设计311
11.8.1 让PyTest支持中文ID311
11.8.2 更优雅的参数化测试314
11.8.3 用YML取代JSON316
11.8.4 面向对象的测试数据317
11.9 接受一定程度的重复代码319
11.10 本章小结320
第12章 实战12306之高阶篇 321
12.1 就近原则321
12.2 用Enum澄清设计意图322
12.3 支持链式表达324
12.4 简化函数名325
12.5 封装复杂逻辑326
12.6 单例设计模式328
12.7 异常和断言的使用场景的区别331
12.8 测试用例的维护333
12.9 本章小结334
术语表 335
参考文献 336
后记 337
猜您喜欢