自动化测试框架

news2024/11/23 22:14:03

自动化测试框架

  • 1.自动化测试框架核心功能
    • 1.数据驱动
    • 2.页面驱动
    • 3.关键字驱动
  • 2.关键字驱动实现-文档形式
  • 3.关键字驱动实现-表格形式

1.自动化测试框架核心功能

在这里插入图片描述
这三种驱动测试可以结合使用来完成系统的自动化测试。可以将测试数据

1.数据驱动

将测试代码和测试数据分离,一般用于一个测试场景需要多个不同的测试数据的条件下,通过数据驱动测试(有多少条测试数据,测试就会执行多少次)。
典型的应用:见我另外一篇博文unittest框架,还可用于接口自动化测试。
适合的场景:使用边界值分析法,等价类划分法。

2.页面驱动

基于页面对象和操作进行封装,便于代码复用,便于代码修改,一般用于大规模自动化测试。典型的应用:见我另外一遍博文web自动化测试框架。

3.关键字驱动

表达式:object.action(parameters)
object表示对谁做,action表示做什么,parameters表示参数
关键字驱动适合app自动化测试,将输入,点击按钮等操作封装成关键字。

2.关键字驱动实现-文档形式

data.txt 关键字驱动的脚本
action(自定义),object(元素定位),parameters(输入数据)

goto#http://www.taobao.com
input#id=username#admin
input#id=password#admin123
input#id=verifycode#0000
singleclick#xpath=//button[contains(@onclick,'doLogin')]
delay#1
checktext#xpath=//ul[contains(@class, 'navbar-right')]/li/a#admin
singleclick#xpath=//a[text()='会员管理']
droplist#id=childsex#女
delay#3
over

goto表示跳转,input表示输入,singleclick表示单机,delay表示延时,checktext表示检查文本,droplist表示单选,over表示关闭浏览器

util.py 写读取文档的方法

class Util:

    @classmethod
    def get_test_data_from_txt(cls, path):

        '''
            读取txt文档
        '''

        cmds = []
        with open(path, 'r', encoding='utf-8') as f:
            while True:
                line = f.readline()  # 读取一行
                if not line:  # 读取结束
                    break
                cmds.append(line.strip())
            return cmds

keyword.py action关键字实现方法

from selenium import webdriver
from time import sleep


class Keywords:
    # 函数名字必须跟action一样
    @classmethod
    def goto(cls, driver, *args): # *args使用不定长参数,是因为data.txt每行的字段数不一样  
        if args and len(args) >= 2:
            driver.get(args[1])
            return True
        else:
            print('goto命令参数不正确,请检查')
            return False

    @classmethod
    def input(cls, driver, *args):
        if args and len(args) >= 3:
            if 'xpath' in args[1]:
                locate_way = 'xpath'
                locator = args[1][6:]  # 切片xpath的值
                value = args[2].strip()
            else:  # 用id定位
                locate_way = 'id'
                locator = args[1][3:]  # 切片id的值
                value = args[2].strip()
            driver.find_element(locate_way, locator).send_keys(value)
            return True
        else:
            print('input命令参数不正确,请检查')
            return False

    @classmethod
    def singleclick(cls, driver, *args):
        if args and len(args) >= 2:
            if 'xpath' in args[1]:
                locate_way = 'xpath'
                locator = args[1][6:]  # 切片xpath的值
            else:  # 用id定位
                locate_way = 'id'
                locator = args[1][3:]  # 切片id的值
            driver.find_element(locate_way, locator).click()
            return True
        else:
            print('singleclick命令参数不正确,请检查')
            return False

    @classmethod
    def delay(cls, driver, *args):
        if args and len(args) >= 2:
            sleep(args[1])
            return True
        else:
            print('delay命令参数不正确,请检查')
            return False

    @classmethod
    def checktext(cls, driver, *args):
        if args and len(args) >= 3:
            if 'xpath' in args[1]:
                locate_way = 'xpath'
                locator = args[1][6:]  # 切片xpath的值
                value = args[2].strip()
            else:  # 用id定位
                locate_way = 'id'
                locator = args[1][3:]  # 切片id的值
                value = args[2].strip()
            element = driver.find_element(locate_way, locator)
            if value in element.text:
                print('文字检查成功,要检查的文字', value, '在文字', element.text, '里')
                return True
            else:
                print('文字检查错误,要检查的文字', value, '不在文字', element.text, '里')
                return False
            return True
        else:
            print('checktest命令参数不正确,请检查')
            return False

    @classmethod
    def over(cls, driver, *args):
        print('测试结束')
        driver.quit()
        return True

    @classmethod
    def droplist(cls, driver, *args):
        if args and len(args) >= 3:
            if 'xpath' in args[1]:
                locate_way = 'xpath'
                locator = args[1][6:]  # 切片xpath的值
                value = args[2].strip()
            else:  # 用id定位
                locate_way = 'id'
                locator = args[1][3:]  # 切片id的值
                value = args[2].strip()
            from selenium.webdriver.support.ui import Select  # 下拉框
            Select(driver.find_element(locate_way, locator)).select_by_visible_text(value)

            return True
        else:
            print('droplist命令参数不正确,请检查')
            return False

run.py 执行action方法

from selenium import webdriver
from util import Util
from keywords import Keywords


def run_case_from_txt(driver):
    test_data = Util.get_test_data_from_txt('data.txt')
    for line in test_data:
        print('当前执行:{}'.format(line))
        key_words = line.split('#')
        if hasattr(Keywords, key_words[0]):  # 判断Keywords对象是否包含action方法
            action = getattr(Keywords, key_words[0])  # getattr()方法是调用关键字action对应的方法
            result = action(driver, *key_words)  # action里面两个参数是goto方法的参数
            if not result:  # 如果action方法返回false,则提示错误,否则提示成功
                print('命令执行错误,测试终止。。。。。')
            else:
                print('命令执行成功')


if __name__ == '__main__':
    driver = webdriver.Chrome()
    run_case_from_txt(driver)

3.关键字驱动实现-表格形式

test_data.xlsx
在这里插入图片描述
util.py 去实现读取表格

import openpyxl


class Util:

    @classmethod
    def get_test_data_from_excel(cls, path):
        book = openpyxl.load_workbook(path)  # 打开已有的表格
        sheet = book.active  # 激活
        test_data = []
        for row in range(2, sheet.max_row + 1):  # 从第二行开始
            cmd = ''
            for col in range(1, sheet.max_column + 1):
                content = sheet.cell(row=row, column=col).value  # 单一单元格访问
                if content:
                    cmd += str(content)
                    cmd += '#'
            test_data.append(cmd[:-1])
        return test_data

keyword.py同第二点的
run.py

from selenium import webdriver
from util import Util
from keywords import Keywords


def run_case_from_txt(driver):
    test_data = Util.get_test_data_from_excel('test_data.xlsx')
    for line in test_data:
        print('当前执行:{}'.format(line))
        key_words = line.split('#')
        if hasattr(Keywords, key_words[0]):  # 判断Keywords对象是否包含action方法
            action = getattr(Keywords, key_words[0])  # getattr()方法是调用关键字action对应的方法
            result = action(driver, *key_words)  # action里面两个参数是goto方法的参数
            if not result:  # 如果action方法返回false,则提示错误,否则提示成功
                print('命令执行错误,测试终止。。。。。')
            else:
                print('命令执行成功')


if __name__ == '__main__':
    driver = webdriver.Chrome()
    run_case_from_txt(driver)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/46435.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

科技云报道:云计算走向工业互联网“深水区”

科技云报道原创。 在新科技革命中,将网格化、信息化与智能化深度融合的工业互联网,正在将人、机、物全面互联,实现全要素、全产业链、全价值链的连接,推动传统产业加快转型升级、助力新兴产业加速发展壮大。 工业如何在快速变革…

培训机构借助创客匠人发力线上业务

疫情反反复复,传统线下教学受到严重影响,转型线上、借力线上发展业务成为行业主流趋势。但是,没有线上经验,人手不足的线下教培机构是否可以转型线上做教学服务,实现招生引流呢? 答案是——可以!用对工具,选对模式,其实很简单! 有很多没有专门线上运营团队,甚至是…

《计算机体系结构量化研究方法》1.7 可信任度

主要内容 计算机是在不同的抽象层上设计和构造的。我们可以逐级深入计算机的不同层面,将每个组件放大为一个完整的子系统进行查看,直到深入到独立的晶体管为止。尽管有些故障会波及整个系统,比如掉电,但许多故障可以被限制在模块…

leetcode-每日一题-1758-生成交替二进制字符串的最少操作数(简单,数学思想)

这道题标记为简单题是正常的,因为当你想到0或者1开头的时候就已经结束了看看我的分析 那么知道这个信息之后就很简单了,加上我们的位运算符号^作为标记即可,大家看看代码实现 1758. 生成交替二进制字符串的最少操作数 难度简单88收藏分享切换…

R语言和Tableau通过情感分析,我们可以从特朗普的推文得到什么?

社交媒体分析的许多用途中的一些是情绪分析,我们评估特定问题的帖子是积极还是消极。我们把社交媒体分析、机器学习、预测建模等集成到文本数据挖掘中。最近我们被客户要求撰写关于推文的研究报告,包括一些图形和统计输出。 在这篇文章中,我…

使用React.ts创建一个密码生成器的简单示例

目录密码生成器DemoFeature知识点React TypeScript —— Function Components为元素(::before/::after)绑定点击事件React如何正确定义对象数组在React中设置复选框check属性三目运算符实现React动态绑定class和style参考资料密码生成器Demo 使用密码生成器工具创建随机密码。P…

Java基于springboot +vue网上超市购物网站 多商家

随着我国信息化的发展,大家更多的是希望通过网络获取到更多的直接所需的信息,而商品一直以来就是人类永恒的追求之一,如何能够享有到更多的商品是很多人一直以来关系的问题。 本系统通过在线网购的方式让用户可以在需要购买商品但是有没有时间…

git submodule创建子仓库

git submodule创建子仓库 文章目录git submodule创建子仓库简介创建主仓库创建子仓库将子仓库添加到主仓库中将合并后的主仓库提交推送到云端简介 当我们的项目伴随着时间的增长越来越大的时候,单一的仓库便不再方便管理,这时候就需要将部分功能提取出来…

PyQt5 事件处理机制

PyQt5 事件处理机制PyQt为事件处理提供了两种机制:高级的信号与槽机制,以及低级的事件处理机制。信号与槽可以说是对事件处理机制的高级封装。 常见事件类型: 键盘事件:按键按下和松开。鼠标事件:鼠标指针移动&#x…

Go语言中的值传递和引用传递 附: 内存地址分析

在学习Go语言函数部分遇到了引用传递和值传递,与C颇为类似,浅谈一下自己对Go语言中的值传递和引用传递的理解。 一、数组—值传递 我们用Go语言中的数组作为样例,来理解值传递的过程。 代码 package mainimport "fmt"func main…

[附源码]计算机毕业设计springboot基于Java的员工管理系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

[附源码]SSM计算机毕业设计校园闲置物品租赁系统JAVA

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

Pytest接口测试框架实战项目搭建(二)

一、前言 业务系统的登录均要经过统一登录系统S,本篇演示统一登录处理,一个是内部业务系统C(其余内部业务系统AB用的都是相同账号密码),一个是外部用户使用的系统W,因为账号密码以及headers信息都不一样&am…

DCDC--Burst Mode和Pulse Skipping Mode

1、Burst Mode和Pulse Skipping Mode(PSM)的区别 Burst Mode ≠ Pulse Skipping Mode,论坛有人认为Burst Mode就是Pulse Skipping Mode,这是不对的。 以LTC3624为例: Burst Mode operation provides the highest ef…

大数据(9h)FlinkSQL双流JOIN、Lookup Join

文章目录1、环境2、Temporal Joins2.1、基于处理时间(重点)2.1.1、设置状态保留时间2.2、基于事件时间3、Lookup Join(重点)4、Interval Joins(基于间隔JOIN)重点是Lookup Join和Processing Time Temporal …

SpringBoot+Vue实现前后端分离的餐饮点餐系统

文末获取源码 开发语言:Java 使用框架:spring boot 前端技术:JavaScript、Vue.js 、css3 开发工具:IDEA/MyEclipse/Eclipse、Visual Studio Code 数据库:MySQL 5.7/8.0 数据库管理工具:phpstudy/Navicat JD…

线性表01- 数组与简易接口设计

线性表的定义 线性表: 具有n个相同类型元素的有限序列 n>0 线性表的元素特点是有索引, 可以通过索引快速查找到元素. a1是a2的前驱, a2是a1的后继 常见的线性表 数组链表栈队列哈希表 (散列表) 数组 数组是一种顺序存储的线性表, 所有的元素的内存地址是连续的. int arr…

Python用广义加性模型GAM进行时间序列分析

每当你发现一个与时间对应的趋势时,你就会看到一个时间序列。我们围绕广义加性模型GAM技术进行一些咨询,帮助客户解决独特的业务问题。研究金融市场表现和天气预报的事实上的选择,时间序列是最普遍的分析技术之一,因为它与时间有着…

matlab图像的运算有点运算、代数运算、逻辑运算和几何运算

1.图像的点运算 2.图像的代数运算 3.图像的逻辑运算 4.图像的几何运算 一、图像的点运算 图像的点运算:对图像中的每个像素值进行计算,从而改善图像显示效果的操作,常用于改变图像的灰度范围及分布,有时也被称为对比度增强和拉伸…

Arduino开发实例-DIY酒精浓度检测计

DIY酒精浓度检测计 在本文中,将详细介绍如何创建一个简单的酒精检测器。 它可以在各种应用领域中使用。市场上有许多先进的酒精传感器,价格合理,但我们在这里使用一些基本的微控制器来制作这个项目,如 Arduino、LED、蜂鸣器和 MQ3 酒精传感器。 1、MQ-3传感器介绍 MQ-3传…