介绍

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

测试用例如下图:
testcase

安装

环境要求

安装 sweetest

pip install sweetest

快速体验

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

sweetest
cd sweetest_sample
python start.py

install

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

目录结构

dir

目录 说明
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 必须一致

页面元素表

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

elements

目录 注释
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

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

  1. 页面标题

    页面的 title

  2. 页面 URL

    页面的 url

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

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

    用例中的写法:

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

测试用例

testcase

下拉菜单配置

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

maps

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

用例字段

必填字段:

前置条件:

注意事项:

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

测试数据:

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

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

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

输出数据:

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

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

步骤编号:

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

控制语句:

进阶

元素管理

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

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

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

窗口管理 (页面,frame)

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

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

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

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

“当前窗口” 规则为:

注意:

测试执行

python start.py

测试报告

见 report 目录

QQ 交流群:158755338 (验证码:python)

项目地址:https://github.com/tonglei100/sweetest


↙↙↙阅读原文可查看相关链接,并与作者交流