关于自动化测试:WebUI自动化测试框架搭建之需求整理详细设计和框架设计

11次阅读

共计 6254 个字符,预计需要花费 16 分钟才能阅读完成。

1 总体需要

1.1 实现目标

  • 基于 BS 架构,模仿用户(鼠标、键盘)操作,达到疾速、反复执行测试用例;
  • 便于回归测试,疾速笼罩主线用例或性能;
  • 线上或线下巡检测试,联合继续集成,及时发现运行环境存在的问题;
  • 晋升集体自动化测试技术能力,为业务提供强有力的测试伎俩。

1.2 性能需要

  • 基于 Unittest,封装、调用和组织所有的测试用例,进行批量或指定用例运行;
  • 反对邮件服务,可增加任意团队成员邮箱,及时告诉团队成员自动化运行后果;
  • 反对 log 日志,保留运行过程所有或须要记录的数据;
  • 反对 HTML 测试报告,直观展现测试后果和数据;
  • 反对用例设计和测试后果拆散,便于数据管理;
  • 反对 Json、conf、excel 等配置文件读取,提供灵便的配置文件操作方法;
  • 反对用户登录封装,后续所有的用例登录专用一个办法;
  • 反对任意批改 HTMLTestRuner,可定制测试报告模板;
  • 反对测试报告多语言(英文和中文);
  • 反对截图性能;
  • 反对 Jenkins 继续集成。

1.3 其余要求

  • 实用所有 bs 架构自动化测试;
  • 模块化设计,我的项目框架模式组织代码;
  • 公共办法封装,对立调用;
  • 数据和后果离开,清晰明了;
  • 反对邮件自定义;
  • 代码正文清晰。

1.4 实用人员

  • 有肯定测试根底的软件测试人员;
  • 有肯定的代码(Python/Java)功底;
  • 致力于学习 web UI 自动化测试的所有人员。

1.5 学习周期

  • 两个星期到一个月,可达到独立进行 web UI 自动化测试;

1.6 学习倡议

  • 倡议依照文章程序,一步一步进行学习和实际;
  • 文章是从根本的环境搭建到最终框架齐全搭建的一个过程,相对来说还是比拟具体的;
  • 文章偏差于我的项目实战,未有太多的实践介绍和名词解释,所以对 0 根底的人员来说,可能须要额定的工夫去补充一下常识。

2 具体设计

2.1 需要剖析

对 实现需求 进行详细分析,次要有下:

性能 阐明
应用 Unittest 框架 开源自动化测试框架,间接应用
批量或指定用例运行 Unittest 框架可反对此性能
log 日志 应用 Python 的 logging 库即可
生成 HTML 测试报告 应用 HtmlTestRunner.py 模块可实现此性能
用例设计和后果拆散 应用配置文件如 excel、json 等组织用例数据
反对 Json、conf、excel 等配置文件读取 这里先应用 excel 进行页面元素的驱动
用户登录封装 间接把登录性能模块化,应用 Unittest 框架中的 setup,teardown 即可
定制测试报告模板 应用 HTMLTestRuner.py 模块
报告多语言 应用 HTMLTestRuner.py 模块
截图性能 应用 Selenium 的 save_screenshot 办法

2.2 技术栈

技术 版本及阐明
Python V3.x(本文为 3.7)=== 编程语言撑持
Selenium V3.141.0 ===UI 元素、控件的辨认、定位,以及浏览器管制等
HtmlTestRunner Python3 版本 === 生成 Html 测试报告
Logging Python 自带 === 生成 log 日志
Xlrd V1.2.0===excel 读取办法
Unittest Python 自带 === 自动化测试框架
Smtplib Python 自带 === 邮件服务
email Python 自带 === 邮件服务
os Python 自带 === 零碎模块
PyCharm Community 2020.2 汉化版
操作系统 Windows10 旗舰版 64 位
其它 后续补充

3 框架设计

3.1 框架阐明

3.2 框架执行流程

4 预期后果

4.1 测试过程 log 日志

4.2 测试报告 html 格局

4.3 测试报告邮件格局

5 特地阐明

代码根本实现,如果有好的倡议,可交换学习心得。

6 第一个 WebUI 自动化测试程序


在开始自动化框架搭建之前,咱们先写一个简略的自动化测试脚本,来领会一下什么是 web UI 自动化测试,以及元素的基本操作,为后续的框架搭建鉴定根底。


6.1 Selenium 根本实践

6.1.1 Selenium 装置

  • 间接关上 cmd 窗口,输出以下命令在线装置:
pip3 install selenium

  • 装置完后,在 cmd 窗口中输出以下命令,能够看到 selenium 曾经装置了
pip list

6.1.2 WebDriverAPI

selenium 提供了很多的 WebDriverAPI,能够来进行:

  • 元素的辨认、定位
  • 元素的单击、双击
  • 滚动条的拖动
  • 浏览器管制如窗口大小、后退后退、刷新、表单切换、多窗口切换、文件双传下载、cookie 操作、验证码等等
  • 详情请参考以下:
    Selenium WebDriver API 学习笔记(一):元素定位
    Selenium WebDriver API 学习笔记(二):浏览器管制
    Selenium WebDriver API 学习笔记(三):浏览器管制

6.2 浏览器驱动装置

  • 要想应用 selenium 来操作浏览器上的元素,必须装置浏览器驱动;
  • 这个要依据具体的浏览器版本来定义;
  • 本文应用的是 Chrome 浏览器,版本为 88.0.4324.182(正式版本)(32 位);

6.2.1 Chromedriver 下载

  • 下载地址:Chrome 浏览器各版本对应的驱动

6.2.2 Chromedriver 装置

  • 下载下来后是一个 chromedriver.exe,如果是 w7 零碎须要把 chromedriver.exe 放在 chrome 浏览器的装置目录,而后在零碎环境变量中退出 chrome 浏览器的装置目录即可;如果是 w10 零碎,须要 chromedriver.exe 放在 Python 的装置目录即可,如本文是:

6.3 代码设计思路

6.3.1 pycharm 新建脚本

  • 关上之前创立的我的项目【Automated-UITest-demo】,在我的项目上右键,新建 python 文件即可,这里新建一个名为 test_baidu 的 python 文件

  • 创立完后,如下多了一个 test_baidu 的 py 文件

6.3.2 自动化需要

这里咱们做以下 UI 自动化测试:
1、主动关上 chrome 浏览器
2、输出百度网址
3、关上百度首页,输出 helloworld
4、最大化浏览器窗口
5、搜寻 helloworld. 并回车
6、浏览器窗口大小放大为 640*480
7、先进行浏览器后退,再次输出 csdn 进行搜寻
8、清空输出的内容
9、判断是否进入 csdn 官网

6.3.3 需要剖析

需要 剖析
主动关上 chrome 浏览器 须要用到 webdriver.Chrome()
输出百度网址 用到 driver.get() 办法
关上百度首页,输出 helloworld 用到 send_keys() 办法
最大化浏览器窗口 应用 maximize_window() 办法
搜寻 helloworld. 并回车 用到 send_keys() 办法
浏览器窗口大小放大为 640*480 用到 set_window_size() 办法
浏览器后退 back() 办法
清空输出的内容 clear() 办法
判断 driver.current_url 办法来判断以后的网址
  • 以上办法具体应用,参考【1.2 WebDriverAPI】

6.3.4 元素定位

  • 以上需要曾经搞清楚了,那么接下来要进行元素定位,这里大略能够对需要再拆解下,须要哪些元素?
元素 阐明 定位形式
百度输入框 用来输出 helooworld find_element_by_id
搜寻 csdn 后点击 csdn 官网 用来模仿点击进入到 csdn 官网 find_element_by_xpath
  • 那如何定位元素,晓得应用哪种定位形式?

A、咱们关上百度首页,而后按【F12】关上浏览器的调试模式

B、点击调试模式窗口左上角的小三角

C、鼠标挪动到百度搜寻输入框

D、点击一下即可,而后看到搜寻输入框的元素属性,即要应用的元素定位办法

6.4 代码实现

6.4.1 包 / 模块的引入

  • 关上方才新建的 test_baidu.py 文件
  • 而后输出以下内容:
from selenium import webdriver  # 引入 selenium 模块的 webdriver
from selenium.webdriver.common.keys import Keys  # 键盘输入,所以要用到 Keys  
import time  # 元素等待时间,所以引入 time 模块 

6.4.2 关上百度

driver = webdriver.Chrome()  # 关上 Chrome 浏览器
driver.get("http://www.baidu.com")  # 输出百度网址

print("============ 验证浏览器的根本管制 ==========")

6.4.3 定位搜寻框输出 helloworld,窗口最大化

def search():
    print("1、搜寻 helloworld. 并回车......")
    time.sleep(2)
    driver.find_element_by_id("kw").send_keys("helloworld")  # 输出“helloworld”time.sleep(2)
    driver.find_element_by_id("kw").send_keys(Keys.ENTER)  # 回车进行搜寻
    time.sleep(2)
    driver.maximize_window()  # 最大化以后窗口 

6.4.4 窗口放大为 640*480

def windows_size():
    print("2、浏览器窗口大小放大为 640*480......")
    time.sleep(2)
    driver.set_window_size(640, 480)  # 管制浏览器显示尺寸为 640*480
    time.sleep(0.5)
    driver.maximize_window()  # 最大化以后窗口
    time.sleep(2)

6.4.5 窗口刷新

ef back_refresh():
    print("3、先进行浏览器后退,再次输出 csdn 进行搜寻")
    driver.back()
    driver.find_element_by_id("kw").send_keys("csdn")  # 输出 csdn
    time.sleep(1)
    driver.refresh() # 刷新 

6.4.6 清空输出内容

def serach_clear():
    print("4、清空输出的内容......")
    driver.find_element_by_id("kw").send_keys("csdn")  # 输出 csdn
    time.sleep(2)
    driver.find_element_by_id("kw").clear()
    time.sleep(0.5)

6.4.7 进入 csdn 官网并判断

def csdn():
    print("5、进入 csdn 官网")
    driver.find_element_by_id("kw").send_keys("csdn")  # 输出 csdn
    time.sleep(2)
    driver.find_element_by_id("kw").send_keys(Keys.ENTER)  # 回车进行搜寻
    time.sleep(2)
    driver.find_element_by_xpath("//*[@id='1']/h3/a[1]").click()
    time.sleep(2)
    windows = driver.window_handles
    driver.switch_to.window(windows[-1])
    now_url = driver.current_url
    m_get_url = "https://www.csdn.net/"
    if now_url == m_get_url:
        print("通过判断,曾经进入 csdn 官网!!")
    else:
        print("未进入到 csdn 官网,请查看代码!")

6.4.8 调用办法

search()
windows_size()
back_refresh()
serach_clear()
csdn()

driver.quit()  # 敞开浏览器 

6.5 残缺源码

# 作者:Administrator
# 日期:2021/2/24 15:15
# 文件名称:test_baidu.py
# Function:关上百度网主页,在搜寻栏输出“helloworld”from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time

driver = webdriver.Chrome()  # 关上 Chrome 浏览器
driver.get("http://www.baidu.com")  # 输出百度网址

print("============ 验证浏览器的根本管制 ==========")

def search():
    print("1、搜寻 helloworld. 并回车......")
    time.sleep(2)
    driver.find_element_by_id("kw").send_keys("helloworld")  # 输出“helloworld”time.sleep(2)
    driver.find_element_by_id("kw").send_keys(Keys.ENTER)  # 回车进行搜寻
    time.sleep(2)
    driver.maximize_window()  # 最大化以后窗口


def windows_size():
    print("2、浏览器窗口大小放大为 640*480......")
    time.sleep(2)
    driver.set_window_size(640, 480)  # 管制浏览器显示尺寸为 640*480
    time.sleep(0.5)
    driver.maximize_window()  # 最大化以后窗口
    time.sleep(2)

def back_refresh():
    print("3、先进行浏览器后退,再次输出 csdn 进行搜寻")
    driver.back()
    driver.find_element_by_id("kw").send_keys("csdn")  # 输出 csdn
    time.sleep(1)
    driver.refresh() # 刷新

def serach_clear():
    print("4、清空输出的内容......")
    driver.find_element_by_id("kw").send_keys("csdn")  # 输出 csdn
    time.sleep(2)
    driver.find_element_by_id("kw").clear()
    time.sleep(0.5)

def csdn():
    print("5、进入 csdn 官网")
    driver.find_element_by_id("kw").send_keys("csdn")  # 输出 csdn
    time.sleep(2)
    driver.find_element_by_id("kw").send_keys(Keys.ENTER)  # 回车进行搜寻
    time.sleep(2)
    driver.find_element_by_xpath("//*[@id='1']/h3/a[1]").click()
    time.sleep(2)
    windows = driver.window_handles
    driver.switch_to.window(windows[-1])
    now_url = driver.current_url
    m_get_url = "https://www.csdn.net/"
    if now_url == m_get_url:
        print("通过判断,曾经进入 csdn 官网!!")
    else:
        print("未进入到 csdn 官网,请查看代码!")

search()
windows_size()
back_refresh()
serach_clear()
csdn()

driver.quit()  # 敞开浏览器 

正文完
 0