项目开源: https://github.com/tonglei100/sweetest

文章转载:https://segmentfault.com/a/1190000011612061

介绍

sweetest 是一款 Web 自动化测试框架,或者说是解决方案,名字取 Selenium, Web UI, Excel, Element, Test 含义。
特点:

  1. 简单快速,轻松上手
  2. 无需编码能力
  3. 在 Excel 中以文本编写测试用例
  4. 维护成本低
  5. 支持千、万级别的用例规模
  6. 拥抱变化,支持敏捷

背景

目前,Web 自动化测试基本上是以 Selenium 为接口来编写测试代码,但效果往往不是很好,普遍遇到如下问题:

  1. 用例设计人员的编码能力很弱,测试代码编写和维护成本高,效果差;
  2. 测试代码量大,测试意图不直观,无法支撑千、万级别的用例规模;
  3. Web 页面元素的定位非常繁琐,且页面结构经常变动,导致用例失效。

我们知道,传统的测试用例一般是在 Excel 中用文本编写的,如果自动化测试用例也这么写,是不是就可以解决问题1和2?
对于问题3,我想是时候对开发提出一些要求了,同时我们的元素定位也要优化,让页面自由的去变化,而我们的定位只做最小适用。

实现思路

  1. Selenium 为底层接口;
  2. 在 Excel 中用文本编写测试用例;
  3. 元素定位表格化,且优先使用“板块通用定位法”;
  4. 要求开发提供必要的、统一的元素属性;
  5. 框架负责解析测试用例,执行用例,记录日志,输出测试结果。

方案

  1. 开发语言:Python
  2. 底层接口:Selenium
  3. 用例工具:Excel

测试用例如下图:

安装

环境要求

  • 系统要求:Windows
  • Python 版本:3.6+
  • Selenium
  • 浏览器:Chrome
  • Chrome 驱动: chromedriver

安装 sweetest

pip install sweetest

快速体验

打开 cmd 命令窗口,切换到某个目录,如:D:Autotest

sweetest
cd sweetest_sample
python start.py

OK,如果一切顺利的话,sweetest 已经跑起来了

目录结构

目录 说明
element\ 页面元素表目录
Baidu-Elements.xlsx 页面元素表,名称格式:project_name + "-Elements.xlsx"
junit\ junit格式测试结果目录
log\ 自动化测试运行日志目录
report\ Excel 格式测试结果目录
snapshot\ 错误截图目录
testcase\ 测试用例目录
Baidu-TestCase.xlsx 测试用例,名称格式:project_name + "-TestCase.xlsx"
start.py 启动脚本,test = Autotest(project_name, sheet_name)

备注:以上3处的 project_name 必须一致

页面元素表

页面元素表的作用主要是把元素定位独立出来,一是方便维护定位信息,二是测试用例中用元素名称书写,可读性更高。

目录 注释
page element 所在的页面,在所有页面都可用的 element 放在“通用”下面,如 title
frame element 所在的 frame id,如果是顶层 frame,可为空。
name element 名称,在不同的 page 下面可以同名
by Selenium 定义方式
value Selenium 定义的值
备注 注释作用

元素定位

  1. id, link_text, partial_link_text, xpath, class_name

    如:

    page name by value
    百度搜索页面 搜索框 id kw

    则自动化运行时会以 find_element_by_id('kw') 来定位

  2. 带变量的定位方式

    如示例中:

    page name by value
    百度搜索页面 搜索结果# xpath //*[@id="#"]/h3/a

    写用例时,需要在 搜索结果# 后面带上变量,如: 搜索结果#1

    操作 页面 元素
    点击 百度搜索页面 搜索结果#1

    则自动化运行时会以 find_element_by_xpath('//*[@id="1"]/h3/a') 来定位

    已定义好的常用变量定位方式:

    • id#
    • link#
    • *link#
    • xpath#
    • class#
    • name#
    • url#

    如:url#www.baidu.com

    当然,如果#后面的变量不够直观的话,不建议太多使用这几个变量方式。

  3. 页面标题

    页面的 title

  4. 页面URL

    页面的 url

    一般来讲,导航栏在所有页面都存在,应该把导航栏放在“通用”下面,做成变量定位方式,如示例中的:

    page name by value
    通用 搜索页导航栏# xpath //*[@class="s_tab"]//a[text()="#"]

    用例中的写法:

    操作 页面 元素
    点击 通用 搜索页导航栏#新闻

测试用例

下拉菜单配置

操作、页面、元素这些列其实都是选项列表,利用 Excel 的下拉菜单功能,能够让书写用例更方便,且不易笔误。
下图是测试用例文件中的 ElementsMap 页面:

我们可以通过 Excel 的菜单栏“公式-名称管理器”来配置这些菜单,同时在用例页面通过“数据-数据有效性”配置好“操作”的下拉菜单,以及“页面-元素”的二级联动下拉菜单。

用例字段

必填字段:

  • 用例编号
  • 步骤编号
  • 操作
  • 页面
  • 元素

前置条件:

  • BASE: 整个测试套件的基础,必须通过才会执行下一步,如:登录;如果有的话应该为第一个测试用例。
  • SETUP:每个测试用例执行前需要执行的用例,只有 SETUP 执行成功才会执行该用例,如:返回首页。
  • MAIN:一组用例的第一用例,和 SUB 一起使用,一个 MAIN 后面可以带多个连续的 SUB 用例。此用例需要先执行 SETUP 用例。
  • SUB:和 MAIN 一起使用,当前一个用例(MAIN or SUB)执行结果为通过时才会执行,否则测试结果置为 Blocked;且执行此用例前不会执行 SETUP 用例。
  • SNIPPET:用例片段,运行到此用例时不会立即执行,需要在其他用例中使用“执行”关键字调用此“用例片段”,才会执行;配合“执行”关键字的变量赋值功能,可以实现用例复用。

注意事项:

  • 一般必须有 SETUP 用例。当执行 SETUP 失败,会尝试执行一次 BASE->SETUP 作为 SETUP 的执行结果。
  • BASE 用例可以有 0 到多个,但作为 SETUP 中 BASE->SETUP 的 BASE 只有最后一个 BASE 用例。
  • SETUP 用例只能有 1 条,如果写了多条,只有最后一条起作用。

操作(关键字)及对应的测试数据

  • 打开

    即 get 方法,打开一个链接。

    打开操作,一般要在测试数据中指定新窗口名称,如:新窗口=百度搜索窗口。

  • 检查

    取页面元素的值、属性和预期结果对比。

    测试数据中如果没有写“k=v”的方式,则默认是取元素的 text。

    • 检查 text:
    操作 页面 元素 测试数据
    检查 百度搜索页面 搜索按钮 百度一下

    等价于

    操作 页面 元素 测试数据
    检查 百度搜索页面 搜索按钮 text=百度一下
    • 检查属性:
    操作 页面 元素 测试数据
    检查 百度搜索页面 搜索框 name=wd
    • “页面标题”和“页面URL”直接在测试数据中写预期结果即可。
    操作 页面 元素 测试数据
    检查 百度搜索页面 页面标题 百度一下,你就知道

    注意:测试数据中,由于逗号(,or ,)是多个“k=v”的分隔符,所以如果 v 中有逗号,要用反斜杠(\)转义;但等号(=)无需转义。

  • 输入

    在输入框中输入文本。

    测试数据列为要输入的内容。

  • 点击

    点击按钮或者链接等(一切可点击操作的)元素。此关键字支持在同一个页面上顺序点击多个元素,在元素列以竖杠(|)分割即可,如:

    操作 页面 元素
    点击 百度搜索页面 搜索按钮|搜索结果#1
  • 移动到

    有些页面元素,当鼠标移动到上面时,会弹出下拉菜单等。此操作同关键字“点击”类似。

  • 执行

    即执行测试用例片段,支持在测试数据中给变量赋值,如我们有用例片段 SNIPPET_001,则测试用例 BAIDU_002 中,步骤1如下:

    操作 页面 元素 测试数据
    执行 用例片段 SNIPPET_001 keywords=搜狗

    把变量 keyswords 赋值为“搜狗”,此步骤会执行用例片段 SNIPPET_001,其搜索的关键字为“搜狗”。

  • 检查

    把检查结果反向,此关键字暂时未完整实现。

测试数据:

测试数据支持模糊匹配,如下:

操作 页面 元素 测试数据
检查 通用 页面标题 *知乎

则,页面标题中含有“知乎”即为通过。注意星号(*)要写在开头。

输出数据:

在运行时,把元素的值或属性赋值给变量,此变量可以在之后的步骤中使用"<>"引用变量名。

操作 页面 元素 测试数据 输出数据
点击 百度搜索页面 搜索结果#1   title=text
检查 通用 页面标题 <title>

步骤编号:

除了控制语句符号外,步骤编号必须为数字,建议在 Excel 中设置为文本格式。

控制语句:

  • if then else

    步骤编号 操作 页面 元素 测试数据
    ^3 检查 通用 页面标题 *知乎
    >4 点击 通用 link#登录
    <5 点击 通用 link#注册机构号

    ^ 表示 if 语句

    > 表示 then 语句

    < 表示 else 语句

    if(^) 语句为真时,执行 then(>) 语句,为否时执行 else(<) 语句。无论后面有没有 then 或者 else 语句,不影响后续步骤执行。

    then 语句 或者 else 语句,当不被执行时,测试结果为 '-',不影响测试用例结果和后续步骤执行。当执行时,和正常步骤一样,成功则继续,失败则该用例失败。

进阶

元素管理

测试用例中元素是以 page + name 为唯一标识,来页面元素表中查找定位信息的。因此,不同 page 下的元素 name 可以相同,但不能和“通用”下的相同。

测试用例中,如果 page 不为“通用”,当 <page> + name 查找不到,会继续以 “通用” + name 为标识符来查找。

“通用”是方便我们写页面元素表的,写用例时我们建议还是用 <page> 来代替“通用”,甚至有时候我们必须这么做。

窗口管理(页面,frame)

在浏览器中,有可能会打开多个标签页,我们叫它为窗口。当你新打开一个标签页时,你可以在测试数据中给它起个名字,格式为:新窗口=<window_name>, 如:

操作 页面 元素 测试数据
打开 通用 百度搜索链接 新窗口=百度搜索窗口
检查 百度搜索页面 页面标题 百度一下,你就知道

当你给新的标签页起了窗口名字,它之后步骤的页面("通用"除外)就会绑定到这个窗口。如上面第 2 步,“百度搜索页面”会绑定到“百度搜索窗口”。那么之后的步骤或用例中,即使打开了多个标签页,只要页面是“百度搜索页面”,就会切换到“百度搜索窗口”这个标签页上操作。

注意:“通用”是不绑定到任何窗口的,也不做窗口切换,它直接在“当前窗口”操作。

“当前窗口”规则为:

  • 执行到某个步骤时,“当前窗口”是浏览器焦点所在的窗口,也就是上个步骤执行操作的窗口。
  • 如果此步骤的页面已绑定到其他窗口,则“当前窗口”会切换过去。
  • 如果此步骤的页面尚未捆定任何窗口,则会捆定到“当前窗口”。
  • 上个步骤如果是新打开的窗口,则“当前窗口”是新打开的窗口。

注意:

  • 如果打开了 2 个或以上窗口,没有起名字的窗口,在执行到切换窗口的步骤时,会自动被关掉。
  • 起了名字的窗口不会被关掉。
  • 但如果起了同样的名字,则原先的那个窗口会被关掉,绑定在其上面的页面也会被注销。

测试执行

python start.py

测试报告

见 report 目录

Web 自动化测试框架 sweetest 介绍的更多相关文章

  1. webUI自动化测试框架---”pyswat“介绍

    webUI自动化测试框架---"pyswat"介绍 大家好我是lamecho 辣么丑,今天给大家介绍一款web自动化测试框架pyswat.  "pyswat"是 ...

  2. web自动化 基于python+Selenium+PHP+Ftp实现的轻量级web自动化测试框架

    基于python+Selenium+PHP+Ftp实现的轻量级web自动化测试框架   by:授客 QQ:1033553122     博客:http://blog.sina.com.cn/ishou ...

  3. Web自动化测试框架Watir(基于Ruby) - 第2章 使用Watir写自动化测试脚本

    一.先来看一个小DEMO 通过上一篇博文<Web自动化测试框架Watir(基于Ruby) - 第1章 Windows下安装与部署>的介绍,我们已经有了完整Watir运行环境,现在我们可以来 ...

  4. 基于Selenium+Python的web自动化测试框架

    一.什么是Selenium? Selenium是一个基于浏览器的自动化测试工具,它提供了一种跨平台.跨浏览器的端到端的web自动化解决方案.Selenium主要包括三部分:Selenium IDE.S ...

  5. Windows环境搭建Web自动化测试框架Watir

    Windows环境搭建Web自动化测试框架Watir 一.前言     Web自动化测试一直是一个比较迫切的问题,对于现在web开发的敏捷开发,却没有相对应的敏捷测试,故开此主题,一边研究,一边将We ...

  6. Web自动化测试框架Watir(基于Ruby) - 第1章 Windows下安装与部署

    一.前言 Web自动化测试一直是一个比较迫切的问题,对于现在web开发的敏捷开发,却没有相对应的敏捷测试,故开此主题,一边研究,一边将Web自动化测试应用于工作中,进而形成能够独立成章的博文,希望能够 ...

  7. web自动化测试框架总结

    web自动化测试框架总结: https://www.processon.com/mindmap/5bdab924e4b0878bf41e9e09

  8. Web自动化测试框架改进

    Web自动化测试框架(WebTestFramework)是基于Selenium框架且采用PageObject设计模式进行二次开发形成的框架. 一.适用范围:传统Web功能自动化测试.H5功能自动化测试 ...

  9. Web自动化测试框架-PO模式

    Web自动化测试框架(WebTestFramework)是基于Selenium框架且采用PageObject设计模式进行二次开发形成的框架. 一.适用范围:传统Web功能自动化测试.H5功能自动化测试 ...

随机推荐

  1. Unity3D学习笔记(三十):Lua

    Lua:是一个轻量级的脚本语句.不需要编译,直接运行的语言.   环境配置:   执行Lua有两种方式: 1.交互式编程(输入后能立即看到效果) 2.脚本式编程:运行lua文件,.lua为文件后缀   ...

  2. Lintcode455-StudentID-Easy

    Implement a class Class with the following attributes and methods: A public attribute students which ...

  3. HDU 5452 Minimum Cut(LCA)

    http://acm.hdu.edu.cn/showproblem.php?pid=5452 题意: 有一个连通的图G,先给出图中的一棵生成树,然后接着给出图中剩余的边,现在要删除最少的边使得G不连通 ...

  4. 线程间操作无效: 从不是创建控件“button2”的线程访问它

    在项目中经常遇到类似的问题,如何解决呢,报错的方法中添加  Control.CheckForIllegalCrossThreadCalls = false; 就可以解决了.

  5. R工具包一网打尽

    这里有很多非常不错的R包和工具. 该想法来自于awesome-machine-learning. 这里是包的导航清单,看起来更方便 >>>导航清单 通过这些翻译了解这些工具包,以后干 ...

  6. hdu 6169 Senior PanⅡ Miller_Rabin素数测试+容斥

    Senior PanⅡ Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others) Pr ...

  7. JDBC Connection Configuration

    如果在Jmeter 中想用到连接数据库的功能,必须下载jar包,常见的关系型数据库jar包见以下共享链接 链接:https://pan.baidu.com/s/1t-k9RW141lw0j_QSw53 ...

  8. yum的配置文件介绍

    yum 的配置文件分为两部分:main 和repository   main 部分定义了全局配置选项,整个yum 配置文件应该只有一个main.常位于/etc/yum.conf 中. reposito ...

  9. lua --- Module

    首先需要明白,一般情况下,我们的定义的lua模块的文件与模块名(其实就是table的名字)是一致的,当然,不一致代码也是可以编译的(亲测),之所以这样,本人认为是为了实际项目中管理的方便.以下是定义模 ...

  10. ggplot2画图

    早在N年前就听说这个包画图不错,一直没机会用,终于等到了.相比前面trendline这个包的可视化功能强大得多. ggplot2需要使用dataframe,其实就是一个N维数组, install.pa ...