PO模式+数据驱动(TPshop网站的登录模块进行单元测试以及区分正向逆向用例)

2023-11-19

一、区分正向逆向用例

思路:在测试数据中添加一一个标识正向用例或逆向用例的标记:如:True/False
步骤:

  1. 调用登录方法(此登录方法中,只有输入用户名、输入密码、输入验证码、
    点击登录按钮)
  2. 判断用例标记:
    #判断安全退出是否存在
    #点击安全退出
    #点击登录连接地址

二、实例

TPshop网站的登录模块进行单元测试(最终版),可点击链接查看之前不同模式的测试

(一)实现步骤
  1. 编写测试用例
  2. 采用PO模式的分层思想对页面进行封装
  3. 编写测试脚本
  4. 定义数据文件,实现参数化
(二)用例设计

在这里插入图片描述

(三)代码结构图

在这里插入图片描述

(四)示例代码
  • 对象库层:base.py
"""base.py"""
# -*-coding:utf-8 -*-
# Auothor:yue_luo
import time
from selenium.webdriver.support.wait import WebDriverWait

class Base:

    # 初始化
    def __init__(self,driver):
        self.driver = driver

    # 查找元素方法
    def base_find_element(self,loc,timeout=30,poll_frequency=0.5):
        return WebDriverWait(driver=self.driver,timeout=timeout,poll_frequency=poll_frequency).until(lambda x:x.find_element(*loc))

    # 点击方法
    def base_click(self,loc):
        self.base_find_element(loc).click()

    # 输入方法
    def base_input(self,loc,value):
        element = self.base_find_element(loc)
        element.clear()
        element.send_keys(value)

    # 获取文本方法
    def base_get_text(self,loc):
        msg = self.base_find_element(loc).text
        return msg
    
    # 截图
    def base_get_image(self,):
        self.driver.get_screenshot_as_file("./{}.png".format(time.strftime("%Y_%m_%d_%H_%M_%S")))

    # 判断元素是否存在
    def base_if_success(self,loc):
        try:
            self.base_find_element(loc, timeout=2)
            # 找到元素 assertTrue
            return True
        except:
            return False
"""get_driver.py"""
# -*-coding:utf-8 -*-
# Auothor:yue_luo
from selenium import webdriver
from v3 import page

class GetDriver:

    driver = None
    @classmethod
    def get_driver(cls):
        if cls.driver == None:
            cls.driver = webdriver.Chrome()
            cls.driver.maximize_window()
            cls.driver.get(page.url)
        return cls.driver

    @classmethod
    def quit_driver(cls):
        if cls.driver:
            cls.driver.quit()
            """置空"""
            cls.driver = None
  • 操作层:_ _init _ _.py 和 page_login.py
"""__init__.py"""
# -*-coding:utf-8 -*-
# Auothor:yue_luo
from selenium.webdriver.common.by import By

"""以下为服务器域名配置地址"""
url ="http://www.tpshop.com"

"""以下为登录页面配置信息"""
# 登录链接
login_link = By.PARTIAL_LINK_TEXT , "登录"
# 用户名
login_username = By.ID,"username"
# 密码
login_pwd = By.NAME,"password"
# 验证码
login_verify_code = By.CSS_SELECTOR,"#verify_code"
# 登录按钮
login_btn =By.NAME,"sbtbutton"
# 获取异常文本信息
login_err_info = By.CLASS_NAME,"layui-layer-content"
# 异常提示框 确定按钮
login_err_btn_ok = By.CSS_SELECTOR,".layui-layer-btn0"
# 安全退出
login_logout = By.PARTIAL_LINK_TEXT,"安全退出"
"""page_login.py"""
from v3 import page
from v3.base.base import Base

class PageLogin(Base):

    # 点击登录链接
    def page_click_login_link(self):
        self.base_click(page.login_link)

    # 输入用户名
    def page_input_username(self,username):
        self.base_input(page.login_username,username)

    # 输入密码
    def page_input_passwrod(self,pwd):
        self.base_input(page.login_pwd,pwd)

    # 输入验证码
    def page_input_verify_code(self,code):
        self.base_input(page.login_verify_code,code)

    # 点击登录
    def page_click_login_btn(self):
        self.base_click(page.login_btn)

    # 获取异常提示信息
    def page_get_error_info(self):
        return self.base_get_text(page.login_err_info)

    # 点击异常信息框 确定
    def page_click_error_btn_ok(self):
        self.base_click(page.login_err_btn_ok)

    # 截图
    def page_get_screenshot(self):
        self.base_get_image()
	# 点击 安全退出->退出登录
    def page_click_logout(self):
        self.base_click(page.login_logout)

    # 判断是否登录成功
    def page_is_login_success(self):
        return self.base_if_success(page.login_logout)

    # 判断是否退出成功
    def page_is_logout_success(self):
        return self.base_if_success(page.login_link)
        
    #  组合业务方法
    def page_login(self,username,pwd,code):
        self.page_input_username(username)
        self.page_input_passwrod(pwd)
        self.page_input_verify_code(code)
        self.page_click_login_btn()
  • 业务层:test_login.py
"""test_login.py"""
# -*-coding:utf-8 -*-
# Auothor:yue_luo

# 导包
import unittest
from time import sleep
from parameterized import parameterized

from v3.base.get_driver import GetDriver
from v3.page.page_login import  PageLogin

# 参数化
from v3.tool.read_json import read_json


def get_data():
    data = read_json("login.json")
    """
       期望数据格式:[("13099999999","123456","8888","账号不存在!",false),
            ("17864307785","error","8888","密码错误!",false)]
    """
    list = []
    for n in data.values():
        list.append((n["username"], n["pwd"], n["code"], n["msg"],n["flag"]))# n["key"] 或n.get("key")
    return list

# 新建测试类并继承
class TestLogin(unittest.TestCase):

    # setUp
    @classmethod
    def setUpClass(cls):
        # 实例化driver并获取
        cls.driver = GetDriver().get_driver()
        # 实例化 获取登录对象
        cls.login =PageLogin(cls.driver)
        # 点击登录链接
        cls.login.page_click_login_link()

    # tearDown
    @classmethod
    def tearDownClass(cls):
        # 关闭driver浏览器驱动对象
        sleep(3)
        GetDriver().quit_driver()

    # 登录测试方法
    @parameterized.expand(get_data())
    def test_login(self,username,pwd,code,expect_result,success):
        # 调用登录方法
        self.login.page_login(username,pwd,code)
        # 登陆成功
        if success :
            try:
                # 判断 安全退出是否存在
                self.assertTrue(self.login.page_is_login_success())
                print("***登录成功")
                # 退出
                self.login.page_click_logout()
                try:
                    self.assertTrue(self.login.page_is_logout_success())
                except AssertionError:
                    # 截图
                    self.login.page_get_screenshot()
                    raise
            except AssertionError:
                # 截图
                self.login.page_get_screenshot()
                raise
            finally:
                self.login.page_click_login_link()
        else:
            # 获取登录提示信息
            result = self.login.page_get_error_info()
            print("result;",result)
            sleep(1)
            #断言
            try:
                self.assertIn(result,expect_result)
                sleep(1)
            except AssertionError:
                #截图
                self.login.page_get_screenshot()
                raise
            finally:
                # 点击提示框确定按钮
                self.login.page_click_error_btn_ok()
                sleep(1)
  • 数据文件(login.json)
{
  "login_01":{"username":"13099999999","pwd":"123456","code":"8888","msg":"账号不存在!","flag":false},
  "login_02":{"username":"17864307785","pwd":"error","code":"8888","msg":"密码错误!","flag":false},
  "login_03":{"username":"","pwd":"error","code":"8888","msg":"用户名不能为空!","flag":false},
  "login_04":{"username":"17864307785","pwd":"","code":"8888","msg":"密码不能为空!","flag":false},
  "login_05":{"username":"17864307785","pwd":"error","code":"","msg":"验证码不能为空!","flag":false},
  "login_06":{"username":"17864307785","pwd":"123456","code":"8888","msg":"安全退出","flag":true}
}
  • 工具类(read_json.py)
import json

def read_json(filename):
    filepath ="../data/"+ filename
    with open(filepath,"r",encoding="utf8") as f:
        return json.load(f)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PO模式+数据驱动(TPshop网站的登录模块进行单元测试以及区分正向逆向用例) 的相关文章

  • 游戏引擎:打造梦幻游戏世界的秘密武器

    介绍 游戏引擎是游戏开发中不可或缺的工具 它为开发者提供了构建游戏世界所需的各种功能和工具 本文将介绍游戏引擎的概念 使用方法以及一个完整的游戏项目示例 游戏引擎的概念 游戏引擎是一种软件框架 它提供了游戏开发所需的各种功能和工具 包括图形

随机推荐

  • Burp Suite的安装

    首先 想要使用burp suite必须有Java环境 想要检查自己是否有Java环境可以在cmd命令行中输入java java version来查看 java环境可以去oracle官网下载一个jdk1 8 然后双击安装就行 jdk版本不能太
  • 两种方法清空memcache缓存(转)

    默认memcache会监听11221端口 如果想清空服务器上memecache的缓存 大家一般使用的是 telnet localhost 11211flush all 同样也可以使用 echo flush all nc localhost
  • c++——static总结

    前言 经过static修饰的变量 存储在内存的全局静态区 且被static修饰的变量只能在本模块的所有函数引用 内存中的存储区域如下 堆区 是由程序员手动申请 new 与释放 delete 的内存区域 从低地址向高地址申请 内存空间大 存储
  • 用户登录测试用例

    谈起用户登录的测试用例 试问有没有在面试测试职位的时候 经常被面试官问到或者是在笔试题上会让你回答 你当时的回答全面了吗 你对自己的答案给多少分呢 然而这只是面试而已 在工作中你的测试用例写得怎么样 有没有考虑全面呢 前几天网上报了一门课程
  • GBT9706.1中B型BF型和CF型各表示什么意思?多参监护仪设计

    1 GBT9706 1中B型BF型和CF型各表示什么意思 代表的是根据与患者接触的部件的电击防护分类 F代表floating绝缘 有很高的保护要求 低漏电流 B代表身体Body C代表心脏cardiac B类设备 具有特定程度电击防护的设备
  • Linux 编译安装中的 configure 命令

    用了这么久的 Linux 系统 也许你会发现 在编译安装中 有的服务编译安装需要执行 configure 命令 而有的却不需要 这是为什么呢 也是不是像我一样一头雾水呢 其实这取决于服务的构建系统和配置方式 以下是两个常见情况 自动配置系统
  • Keil编译完成后出现的程序大小说明

    Keil编译完成后出现的程序大小说明 Code 代表执行的代码 程序中所有的函数都位于此处 也可认为是程序所占用的FLASH大小 存储在FLASH中 RO data Read only data 代表只读数据 程序中所定义的全局常量数据和字
  • OpenStack--创建虚拟机

    启动虚拟机之前需要先做一些前期准备 比如网络和 IP 地址分配 虚拟机 类型创建等等 具体如下 1 网络规划及 IP 划分 官网安装文档 https docs openstack org ocata zh CN install guide
  • 今天我们来聊一聊孟德尔随机化

    欢迎关注 生信修炼手册 在传统的实验设计中 由于种种混杂因素的存在 我们仅仅能够分析变量之间的关联性 最典型的比如GWAS 对于显著的位点 只能够说明这些位点和性状之间存在关联 对于了解事情发生的原因和规律而言 关联性是不够的 我们需要的是
  • 【Excel】工作中会用到的excel操作和技巧

    最近入职培训 接受了一些企业文化的洗脑课 不过也有一些是很有实际应用的课程 比如excel操作和技巧 现将自己觉着很有用的地方总结如下 1 基础性操作与技巧 说在前面 一个好的工作表格 需要主要以下几点 首行首列要留白 外边框要加粗 字体字
  • php企业微信通讯录同步设置接收事件服务器

    第一步登陆企业微信pc端管理后台设置好信息 先不要点击保存 会提示失败 随后根据填写的URL编写接口 接口代码如下 就是第一步图中的token token xxx 就是第一步图中的EncodingAESKey encodingAESKey
  • msys2下gtk或qt程序的打包

    1 编译x64的程序 从win10的开始菜单中打开MSYS2 MinGW x64命令行 使用cd命令切换到二进制程序exe所在目录 2 执行如下命令 最后一个参数是当前文件存放dll 可以自定义一个新的文件夹 拷贝起来方便 ldd exe
  • 使用Visual Studio 2019和IntelliJ IDEA 2018实现JAVA调用本地代码

    使用Visual Studio 2019和IntelliJ IDEA 2018实现JAVA调用本地代码 1 我们使用的工具是 IntelliJ IDEA 2018 编写java代码 和VisualStudio 2019 编写Native方法
  • 关于“system”: 找不到标识符 的问题

    关于 system 找不到标识符问题和 包括 排除 设置禁用了加载功能的问题 这个问题主要是使用system pause 时造成的 可以删除或者注释这个语句试试 解决办法 1 添加头文件stdlib h 2 添加iostream h 另外
  • ld_preload

    gdb调试包含共享库代码的程序 shell export LD PRELOAD 相信有不少的同志调试过包含共享库代码的程序 这个时候最为头疼的就是不能进行单步跟踪 当然是在你不知道如何解决的情况下 本文根据一个实例来讲述如何来解决这个问题
  • C++Primer(第五版 )第十三章 拷贝控制 章节编程练习答案

    13 1 拷贝构造函数是什么 什么时候使用它 答 如果一个构造函数的第一个参数是自身类类型的引用 且任何额外参数都有默认值 则此构造函数是拷贝构造函数 当使用拷贝初始化时 我们会用到拷贝构造函数 13 2 解释为什么下面的声明是非法的 答
  • JS字符串转换为JSON的四种方法

    JS字符串转换为JSON的四种方法 1 jQuery插件支持的转换方式 示例 parseJSON jsonstr jQuery parseJSON jsonstr 可以将json字符串转换成json对象 2 浏览器支持的转换方式 Firef
  • 批量获取文件的摘要(md5、sha1、sha256)

    批量获取文件的摘要 md5 sha1 sha256 0x01 功能 0x02源码 0x03运行 0x01 功能 刚刚写了一个小工具 用于批量获取文件的摘要 md5 sha1 sha256 具体用法 gt gt gt gt python3 g
  • 文件服务器中按用户查询文件夹权限,服务器文件夹权限设置

    服务器文件夹权限设置 内容精选 换一换 该任务指导用户使用Loader将数据从SFTP服务器导入到HBase 创建或获取该任务中创建Loader作业的业务用户和密码 确保用户已授权访问作业执行时操作的HBase表或phoenix表 获取SF
  • PO模式+数据驱动(TPshop网站的登录模块进行单元测试以及区分正向逆向用例)

    一 区分正向逆向用例 思路 在测试数据中添加一一个标识正向用例或逆向用例的标记 如 True False 步骤 调用登录方法 此登录方法中 只有输入用户名 输入密码 输入验证码 点击登录按钮 判断用例标记 判断安全退出是否存在 点击安全退出