AI+软件测试第二篇0616
350.注册页面测试脚本前后置方法名是固定的toast提示时间很短而且不是源代码里的显示一秒钟就消失抓不到不好抓。如果抓不到这个提示直接定位当前页面的元素即可比如说即便注册后仍然可以找到”注册抢88现金“意味着登陆失败page_register.py封装页面的方法1.初始化方法放属性页面元素定位的属性2.方法打开浏览器业务方法登陆注册成功方法失败方法test_02_register.py测试脚本1.前置后置2.测试用例成功/失败351.开通资金托管页面封装正向业务与逆向业务维度正向业务逆向业务关注点功能的可用性与正确性系统的健壮性与安全性输入数据合法、标准数据非法、边界、异常数据预期行为顺利执行返回成功优雅降级准确报错拒绝非法操作测试占比通常占 30%~40%通常占 60%~70%Bug往往藏在逆向中思维模式顺向思维按说明书操作逆向/破坏性思维找茬、挑刺这是正向业务UI自动化就是对版本进行回归测试回归测试是正向的。自动化测试很少做逆向的回归测试全是正向业务写代码思路从page开始写元组的括号可以不写但要保证“”在352.开通资金托管账号测试353.faker工具介绍354.faker应用演示355.数据驱动介绍数据驱动通过批量数据测一个独立的功能步骤1.构造数据--2.读取数据--3.参数化调用1.构造数据json[ { user_id: 1001, name: 张三 }, { user_id: 1002, name: 李四 } ]每一个花括号代表一条测试用例可以把测试数据构造出json文件然后读取内容变成字典2.读取数据3.参数化调用356.数据驱动演示1.构造数据数据应该放在data中json文件里面的键值必须是双引号引起来的json中的引号必须是双引号不能用单引号[ { phone:13800001001, password:Aa123456, expect:13800001001 }, { phone:13800001001, password:123456, expect:密码错误 }, { phone:13800008001, password:Aa123456, expect:不存在 }, { phone:13800008001, password:, expect:不能为空 } ]2.读取数据def read_json(file_name): 读取JSON文件并转换为格式为 [(), (), ...] 的列表 :param file_name: json文件名 :return: 列表 data [] file_path PATH /data/ file_name with open(file_path, moder, encodingutf-8) as f: # 读取JSON文件并解析为Python对象 tmp json.load(f) for i in tmp: a tuple(i.values()) data.append(a) # 返回列表 return data3.实现参数化import pytest from page.page_login import PageLogin from script import log from tools import DriverTools, read_json class TestLogin: def setup_method(self): 前置方法 # 准备数据 driver DriverTools.get_driver() self.page_login PageLogin(driver) # 调用方法 self.page_login.open_url() def teardown_method(self): 后置方法 DriverTools.quit_driver() pytest.mark.parametrize(phone,password,expect, read_json(login_data.json)) def test_01_login(self, phone, password, expect): # 准备数据 try: # 调用方法 self.page_login.login(phone, password) # 获取结果 if expect phone: result self.page_login.get_success_result() else: result self.page_login.get_fail_result() # 打印日志 log.debug(f登录结果: {result} | 期望值: {expect}) # 断言 assert expect result except Exception as e: log.error(f测试执行过程中发生异常: {e}) raise357.登录功能的参数化358.额度申请页面封装#######################page_credit_application.py########################## from selenium.webdriver.common.by import By from base.base import BasePage class PageCreditApplication(BasePage): 额度申请页面 def __init__(self,driver): 设置属性 super().__init__(driver) # 页面元素定位信息 self.role (By.XPATH, //em[text()借款账户]) self.application (By.LINK_TEXT, 申请额度) self.money (By.ID, amount_account) self.detail (By.NAME, remark) self.code (By.ID, verifycode) self.submit (By.CSS_SELECTOR, .btn-submit.btn-md) # 提交成功结果 #amount_list tr:nth-child(1) td:nth-child(3) self.success_result (By.CSS_SELECTOR, #amount_list tr.ng-scope td:nth-child(3)) def switch_role(self): 点击切换账户 self.base_click(self.role) def click_application(self): 点击额度申请 self.base_click(self.application) def credit_application(self,money, detail, code): 额度申请提交 :param money: 金额 :param detail: 详情 :param code: 验证码 :return: 无 # 输入信息 self.base_input(self.money, money) self.base_input(self.detail, detail) self.base_input(self.code, code) # 点击提交 self.base_click(self.submit) def get_success_result(self): 获取提交成功结果 return self.fd_element(self.success_result).text359.额度申请页面测试1.pytest框架无需继承直接拿过来用2.驱动什么时候前面加self什么时候不加当前方法内直接用无需加别的方法也要用就需要加self360.web自动化_day03总结目标完成项目核心业务web自动化脚本编写项目封装web自动化框架pythonseleniumpopytest架构搭建结构base层封装页面的公共操作按照面向对象思想封装页面对象的公共方法page层按PO模式封装页面对象把页面元素定位和页面操作放到这个里面实例属性页面元素定位实例方法页面基本操作多步可以拆分不同的方法一个操作一个方法最好script层基于pytest框架封装测试用例/脚本前后置处理方法级别setup_method()teardown_method()类级别setup_class()teardown_class()测试用例1.准备数据/创建对象2.调用方法3.打印结果日志记录4.断言结果data层存放参数化使用的json数据也可以存放excel数据此时tools里应该换成读取excel的方法report层log层存放测试执行过程的日志信息pytest.inipytest的配置文件批量用例处理config.py项目配置文件项目地址项目URL...tools.py通用工具浏览器驱动日志管理读取json数据数据驱动定义以测试数据批量数据驱动脚本执行是一种自动化的设计模式应用场景单模块/页面的批量数据覆盖不同场景执行如何实现封装思路