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, mode='r', encoding='utf-8') as f:
        # 读取JSON文件并解析为Python对象
        tmp = json.load(f)
        for i in tmp:
            a = tuple(i.values())
            data.append(a)
        # 返回列表
        return data
3.实现参数化
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}")
        raise

357.登录功能的参数化

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).text

359.额度申请页面测试

        1.pytest框架无需继承,直接拿过来用

        2.驱动什么时候前面加self什么时候不加?当前方法内直接用无需加,别的方法也要用就需要加self

360.web自动化_day03总结

目标

         完成项目核心业务web自动化脚本编写

项目封装
        web自动化框架:

                python+selenium+po+pytest

        架构搭建(结构):
                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.ini

                pytest的配置文件,批量用例处理

        config.py

                项目配置文件

                        项目地址

                        项目URL

                        ...

        tools.py

                通用工具

                        浏览器驱动

                        日志管理

                        读取json数据

数据驱动
                定义

                        以测试数据(批量数据)驱动脚本执行,是一种自动化的设计模式

                应用场景

                        单模块/页面的批量数据(覆盖不同场景)执行

                如何实现

封装思路

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐