1. 自动化测试流程(一般流程)
-
需求分析
- 确定目标项目是否适合进行自动化测试(什么样的项目适合自动化)
-
挑选适合做自动化测试的功能
- 电商项目主流程
- 登录/注册
- 浏览商品
- 购物车
- 订单模块
- 支付模块
- 第三方业务
- 物流跟踪
- 第三方服务
- 一般情况下, 需要和第三方业务进行交互的模块, 都不适合执行自动化.
- 手工测试业务逻辑相对的复杂的也不适合自动化.例如:OA 系统
- 电商项目主流程
-
设计用例
- 讲: 运用手工测试阶段的各种测试方法出用例即可
- 做: 从现成的手工测试用例中抽取子集(适合实现断言端的用例)即可
-
搭建自动化测试环境 [可选]
- 开发环境组成
- 开发语言: Python
- Python 解释器
- 开发工具 IDE(IDE: 集成开发环境的简称)
- PyCharm
- 开发语言: Python
- 测试环境组成
- 浏览器
- 浏览器驱动
- Selenium 包
- 各种插件
- 参数插件
- 开发环境组成
-
设计自动化测试项目的架构 [可选]
- 环境组成
- 自动化项目工程结构
- 设计模式的选型(PO)
- 实现数据驱动
- 持续集成(CI/CD)
- Jenkins
-
编写代码
- 确保自动化脚本能够正常执行(需要调试)
-
执行测试用例
-
生成测试报告并分析结果
2. Web 项目运行的必备条件
-
硬件层面
- 服务器设备
- 实体设备
- 机房
- 虚拟设备
- VPS(虚拟服务器)(大多数公司采用的方案)
- 腾讯云/阿里云/华为云/百度智能云
- 工作中要获取的信息
- 账号密码
- 实体设备
- 服务器设备
-
软件层面
- 操作系统
- Linux(免费)
- Windows Server(收费)
- Web 系统软件
- Apache
- Nginx
- IIS
- 数据库软件
- MySQL
- 开发语言
- Java
- PHP
- 环境构建问题参考方案
- 直接询问开发照开发环境原样搭建
- 直接使用一体安装包: LNMP 或 LAMP
- 操作系统
3. Web UI 自动化注意点
- 只关注 UI 界面效果及逻辑即可, 不用校验数据库中的数据
- 测试过程中对数据库产生脏数据如何处理?
- 自动测试执行前, 对数据库进行备份, 执行完成后, 还原数据库备份(测试环境)
- 需要联络 DBA(数据库管理员)(生产环境)
4. XPath 策略方法扩展
//*[contains(text(),'部分文本信息')]
策略说明: 根据给出的部分文本内容定位元素
5. 日志模块
-
代码步骤
- 导包:
- import logging
- import logging.handles
- 实例化日志器
- logging.getLogger()
- 设置日志输出级别方法
- 日志器对象.setLevel(level=logging.DEBUG) -->DEBUG: 日志级别常量
- 实例化处理器
- logging.StreamHandler() --> 输出日志到控制台
- logging.FileHandler() --> 输出日志到文件(文件大小不可控)
- logging.hanlders.TimedRotatingFileHandler() -->输出日志到文件(控制文件数量及大小)
- 实例化格式器
- 格式化占位符:fmt = ‘%(asctime)s %(levelname)s [%(name)s] [%(filename)s(%(funcName)s:%(lineno)d)] - %(message)s’
- formatter = logging.Formatter(fmt=fmt)
- 将格式器添加给处理器
- 处理器对象.setFormatter(格式器对象)
- 将处理器添加给日志器
- 日志器对象.addHandler(处理器对象)
- 导包:
-
注意:
- 日志模块无论是基本用法还是高级用法, 都属于一种设置型代码, 不要死记, 只要清楚需要修改的内容, 完成调用即可!
-
代码演示1–日志模块基本使用
""" 日志模块基本使用 -- 输出日志信息到文件 """ import logging # 注意: # 1. 如果指定将日志信息输出到文件, 则控制台不会在打印日志信息 # 2. 日志文件默认情况下, 是以追加的形式添加后续内容的 fmt = '%(asctime)s %(levelname)s [%(name)s] [%(filename)s(%(funcName)s:%(lineno)d)] - %(message)s' logging.basicConfig(filename='./info.log', level=logging.DEBUG, format=fmt) # 格式化输出 # fmt = '%(asctime)s %(levelname)s [%(name)s] [%(filename)s(%(funcName)s:%(lineno)d)] - %(message)s' # logging.basicConfig(format=fmt, level=logging.DEBUG) # 设置日志输出级别 # 注意: 系统默认的日志输出级别为 warning 级别 # logging.basicConfig(level=logging.DEBUG) # 自定义日志输出方法 logging.debug('调试信息') logging.info('普通信息') logging.warning('警告信息') logging.error('错误信息') logging.critical('严重错误')
-
代码演示–日志模块高级用法1
""" 日志模块高级用法1 -- 将日志信息同时输出到控制台和文件中 """ # 导包 import logging # 实例化日志器 logger = logging.getLogger() logger.setLevel(level=logging.DEBUG) # 设置日志级别 # 实例化处理器(多个) sh = logging.StreamHandler() # 控制台 fh = logging.FileHandler('./info.log') # 文件 # 实例化格式器(多个, 跟处理器对应) fmt1 = '%(asctime)s %(levelname)s [%(name)s] [%(filename)s(%(funcName)s:%(lineno)d)] - %(message)s' formatter1 = logging.Formatter(fmt=fmt1) fmt2 = '%(asctime)s %(levelname)s - %(message)s' formatter2 = logging.Formatter(fmt=fmt2) # 将对应的格式器添加给处理器 sh.setFormatter(formatter1) fh.setFormatter(formatter2) # 将处理器添加给日志器 logger.addHandler(sh) logger.addHandler(fh) # 调用日志输出, 查看结果 while True: logger.debug('😈😈😈😈😈😈😈😈😈😈😈😈')
-
代码演示–日志模块高级用法2
""" 日志模块高级用法2: 每日生成一个日志文件(实际需求) 每 x 秒生成一个日志文件(伪需求) """ # 导包 import logging.handlers # 实例化日志器 logger = logging.getLogger() logger.setLevel(level=logging.DEBUG) # 设置日志级别 # 实例化处理器 """ 常用参数 filename : 日志文件存放路径及文件名和后缀 when : 时间单位(S/M/H/D...) interval : 间隔数值 backupCount : 生成的日志文件总数 """ # # 每日生成一个日志文件(实际需求) # th = logging.handlers.TimedRotatingFileHandler(filename='./my_info.log', # when='D', # interval=1, # backupCount=1) # 每 x 秒生成 x 个日志文件(伪需求) th = logging.handlers.TimedRotatingFileHandler(filename='./my_info.log', when='S', interval=4, backupCount=4) # 实例化格式器 fmt = '%(asctime)s %(levelname)s [%(name)s] [%(filename)s(%(funcName)s:%(lineno)d)] - %(message)s' formatter = logging.Formatter(fmt=fmt) # 将格式器添加给处理器 th.setFormatter(formatter) # 将处理器添加给日志器 logger.addHandler(th) while True: logger.debug('🎄🎄🎄🎄🎄🎄🎄🎄🎄🎄🎄🎄')