Web项目的 UI 自动化测试方案

有用的链接:

项目讨论

项目中符合自动化测试的部分有哪些?(目标和范围 scope, 准入准出标准)

稳定的需求点、变动较少的页面

每日构建后的测试验证 daily build

比较频繁的回归测试

需要在多平台上运行的相同测试案例、组合遍历型的测试、大量的重复任务

自动化用例在整个项目的测试用例的覆盖率

一般的要求 50% +

重点的要求 80% +

根据项目的具体要求,变动特别大的项目需要额外单独考虑覆盖率

团队建设

建立自动化测试的组,理想状态下有4个人员,测试开发、中高级自动化测试工程师、2个初级自动化工程师;非理想的情况下,可能只有一个人。

测试开发:

基础答案:自动化框架的建设,确定自动化框架的设计模式、第三方代码工具的封装、中间公共模块的设计和调用、测试用例、测试套件的管理和执行、测试报告和测试结果的输出(文件输出和邮件通知)

可选高级:如果可能的话,需要搭建持续集成服务器(CI,Continuous Integration Server)的环境,进行持续交付和自动化的冒烟测试等。

培训的任务,需要将设计的框架以及封装的驱动,对其他成员进行培训。

有自动化方案的实施经验、有开发背景、以及持续集成的背景等。

中高级自动化测试工程师:

配合测试开发人员,实施测试框架的建设。主要负责中间公共模块的实现和实例化等,以及部分高难度和流程复杂的自动化用例脚本编写和调试等工作。

有参与过自动化方案的建设、脚本编写经验丰富、会代码调试、懂Web测试等。

初级自动化测试工程师:

根据中间公共模块的设计,进行实例化公共模块、方法组合,实现自动化用例脚本的编写。

有计算机编程思维、有代码经验、可以读懂脚本和HTML等。

若只有我一个人:

首先实现自动化用例的维护和执行。在这个基础上不断的抽取实现公共模块的设计以及测试报告的生成等工作。通过经验的积累,以及后续人员的补充,早日做好自动化框架的建设工作。

技术方案

Selenium WebDriver、Python(unittest) Java(JUnit)、CI Server

技术方案:

选择Python + Selenium 的技术方案。

首先技术工具是免费的,Python的工具用PyCharm社区版,Selenium的WebDriver是开源工具。利用比较简洁的Python语言进行自动化测试,对于人员的学习成本来讲比较实用,学习时间短,有优势。

另外Python自带的unittest单元测试框架可以很方便的实现自动化用例的设计和执行以及自动化用例套件的管理等任务。Python是纯面向对象的语言,后续也可以过渡到Java + Selenium进行更加丰富的自动化测试。

此外,可以选择Jenkins作为持续集成服务器,配合Python+Selenium的方案进行自动化冒烟测试。

源代码管理工具(VCS, version control system)

选择SVN(git)作为代码的源代码管理工具。集成在PyCharm中的步骤如下

把代码放到SVN在本地签出(check out)的文件夹目录中,例如 D:\SVN\XXProject\Trunck

用PyCharm打开 刚刚部署的代码

选择PyCharm的 VCS|Enable VCS integration,选择 Subversion(svn) 或者 Git

右键项目文件的根目录,选择 Subversion | add to VCS

右键项目文件的根目录,或者选 VCS | Commit Directory...

每天打开代码后,首先 Subversion | update project

硬件:

硬件的要求不高,主要需要独立的测试环境。另外测试人员用的电脑最好是Windows桌面操作系统,需要安装Firefox浏览器,避免47.0的最新版本。测试人员最好也使用Chrome浏览器辅助进行Web元素的定位。

Selenium 学习总结

Selenium IDE (火狐的插件)

Selenium IDE

一个基于火狐浏览器的插件

录制(需要确保右上角的录制按钮是按下去的),为了我们熟悉Selenium WebDriver/ RC

保存和另存为测试用例

无论是否保存用例,都可以直接回放

导出测试用例的对应的编程脚本

C# Nunit WebDriver

Java Junit / testNG WebDriver

Python unittest WebDriver

Ruby Test::Unit WebDriver

插入、编辑、删除命令

学习Selenium的WebDriver/ RC

Python + Selenium WebDriver

搭建环境步骤

a 安装 python3.x (windows xp 不支持 python3.5+)

b 设置环境变量 path(安装时候也可以解决 勾上 add python.ext to path)

c 安装Selenium 用pip命令安装 pip install -U selenium

有无问题?

路径,pip可能定位不到,pip也可能定位到别的文件夹(perl)

方案:cd c:\python34\scripts

外网ip问题。交换机的原因,局域网里面是同一个ip,造成安装超时

火狐的版本 46.0以及以下

windows 7 x64以上的系统,需要用管理员模式运行cmd,否则会安装失败。

普通的使用

定位方式

by id, name, class_name, tag_name, css_selector, xpath, link_text, partial_link_text

主要用的 是 id,name, css_selector, xpath, link_text

Selenium 基本使用

Python + Selenium 环境搭建

安装Python,3.x(3.4 3.5 3.6)

注意:环境变量path

需要添加 "C:\Python34;C:\Python34\Scripts;"到Path

步骤:

右键 我的电脑 属性 | 高级系统设置 | 环境变量

找 系统变量 | Path 并 双击 | Ctrl+C | 编辑 | Ctrl+V

安装 Selenium

cmd | pip install -U selenium

-U = --upgrade 升级安装

类似于linux命令

command -x param

容易出现的问题

环境变量

cd C:\Python34\Scripts

再安装

管理员权限

右键 管理员方式运行

WebDriver的基本使用

实例化一个WebDriver的对象(使用默认的火狐浏览器 v46或者以下)

driver = webdriver.Firefox()

注意,一定要写括号,代表实例化对象

查找元素

用id : driver.find_element_by_id("account")

用name: driver.find_element_by_name("password")

用xpath css_selector

对元素的操作

clear()

click()

send_keys()

使用python的休眠,给浏览器留出时间加载页面

sleep(2)

关闭退出火狐

driver.quit()

selenium WebDriver的进阶操作

unittest 单元测试框架的使用

验证:断言 self.assertEqual(expected, actual, msg)

管理测试用例: 每一个以 test_ 开头的方法

可以在自动化测试用例中忽略的部分:

编号 名称 优先级 模块(项目) ## 忽略

必须在自动化用例中强调的部分:

前置条件 setUp()

输入数据

步骤 test_ 开头的方法

预期结果 test_ 开头的方法

清理 tearDown()

新增的一个知识点: 测试的初始化 以及 测试的结束

setUpClass() 和 tearDownClass()

注意 上述方法 与 setUp() 和 tearDown() 的调用顺序

定位方式的使用

css_selector

方法调用:

driver.find_element_by_css_selector("#langs > button")

CSS的3种选择器:

id: 使用#+id

tag: 使用tag

class: 使用.+class

CSS selector的获取

可以使用开发者工具,定位的元素,右键 | 复制 selector(复制CSS路径)

Chrome使用了相对路径 #langs > button

Firefox(firebug)使用了绝对路径 html.screen-desktop-wide.device-desktop body.m-user-login div.container div#login div.panel-head div.panel-actions div#langs.dropdown.open button.btn

class_name

通过 class定位元素,必须保持 class唯一,否则定位会失败

driver.find_element_by_class_name("btn")

link_text 和 partial_link_text

文字选择正确就行了

xpath

chrome内核的开发者工具,复制的是相对的xpath

firefox内核的开发者工具(firebug),复制的绝对的xpath

特定的元素的处理

frame

上述代码中,我们需要定位的元素,处于 一个frame中:我们需要先切换到对应的frame中,然之操作,之后再退出

## 我们需要先切换到对应的frame中

## 切换frame

driver.switch_to.frame("frame_name")

## 或者用保险的办法切换frame

frame_element = driver.find_element_by_css_selector("#frame_id")

driver.switch_to.frame(frame_element)

## 开始做定位操作

##

## 结束做定位操作

## 切换frame必须成对的出现。

## 退出切换的frame到默认的网页html中

driver.switch_to.default_content()

select

select定位有个前提,元素标签必须是 select

## 部门是个 select 元素

## 需要3步骤:

## 1. 找到 select 的元素,赋值给变量 dept_select

## 2. 实例化 dept_select 为 Select()的对象 为 user_adding_dept

## 3. 调用 user_adding_dept 的方法 select_by_index()给元素赋值

示例代码

# 找到 select 的元素,赋值给变量 dept_select

dept_select = driver.find_element_by_id("dept")

# 实例化 dept_select 为 Select()的对象 为 user_adding_dept

user_adding_dept = Select(dept_select)

# 调用 user_adding_dept 的方法 select_by_index()给元素赋值

user_adding_dept.select_by_index(2)

清除 cookie

在打开浏览器的时候,需要清理cookie。

from selenium import webdriver

driver = webdriver.Firefox()

driver.delete_all_cookies()

driver.get("...")

数据驱动的方式编写用例

主要有两种形式进行数据驱动

数据驱动:用外部数据来驱动测试用例的执行

数据库驱动:MySQL、Oracle、PostgreSQL、SQL Server

import pymysql

connect = pymysql.connect(host="xx", port=3306, user="root", passwd="xxx", db="xx")

cur = connect.cursor()

cur.execute("SELECT...")

mysql_data = cur.fetchall()

for row in mysql_data:

# 进行测试

# 使用字典类型

data_to_test = {

"key1": row[0],

"key2": row[1]

}

cur.close()

connect.close()

数据文件驱动:csv文件最典型、xml文件、txt文件

import csv

csv_file = open("xxx.csv", "r", encoding="utf8")

csv_data = csv.reader(csv_file)

for row in csv_data:

# 进行测试

# 使用字典类型

data_to_test = {

"key1": row[0],

"key2": row[1]

}

csv_file.close()

需要掌握的知识点:

python的字典类型 dict 类型

python的读写文件

python的读写数据库

for循环

注意资源的释放

关闭数据库游标和连接

关闭文件

模块化的方式编写用例

需要将每个用例都需要用的公共的功能,抽取出来,放到一个公共类中,作为模块化

创建一个Python Package "common",在里面创建一个ranzhi_common.py文件,里面添加RanzhiCommon类

login() : 普通登录,默认用admin/123456登录

logout():退出系统

login_by_dict(user_to_login):使用字典类型的参数进行登录,user_to_login 是一个字典类型 dict

change_language(lang):zh_CN, en_US, zh_TW 切换语言,需要参数传递要切换的语言

select_app(app):crm, admin, oa, cash, team 选择App,需要传递选择 后台管理 | 客户管理 。。。

select_menu_for_admin(menu): organization 选择了后台管理以后,选择菜单 组织

add_user(user_to_add): 使用字典类型的参数进行添加

创建测试用例的类,比如 ranzhi_test_01.py ranzhi_test_02.py ranzhi_test_03.py... 在这些类中调用上面创建的类,一般会放到setUp() 中

import unittest

from common.ranzhi_common import RanzhiCommon

class RanzhiTest01(unittest.TestCase):

def setUp(self):

ranzhi_common = RanzhiCommon()

def test_xxx(self):

ranzhi_common.login()

##....

Selenium 自动化测试方案

基础方案

使用unittest,主要是用 TestCase(测试用例)

使用模块化(基本的模块化,抽取公共模块)

使用数据驱动的方式(主要包括 数据库的形式 和文件读取 )

定制执行需要测试的用例,使用unittest,主要用的是TestSuite(测试套件)、和 TextTestRunner(文本测试运行器)[或者HTMLTestRunner]

生成测试报告(发送报告到指定邮箱)

自动化测试方案(基础版).jpg

自动化测试方案(高阶版).jpg

方案实现的具体步骤:

使用PyCharm创建新的PurePython项目

在项目中创建如下的文件夹(python package)

TestCase

Data

Common

TestRunner

Report

分别实现上述模块

在Data中存放数据,CSV文件,或者也可以放到数据中,使用数据驱动

## 使用csv文件

csv.reader()

## 使用数据库(MySQL),可以参考www.imooc.com的python操作MySQL的视频

cur.fetchall()

在Common中,创建测试公共模块,实现模块化的操作

## __init__(self, driver: webdriver.Firefox, base_url)

self.common = RanzhiCommon(self.driver, self.base_url)

在TestCase创建自动化测试用例,注意使用unittest.TestCase

def setUp()

def tearDown()

det test_xxx()

在TestRunner创建测试执行器和测试套件,使用unittest.TestSuite和HTMLTestRunner(第三方)

test_suite = unittest.TestSuite()

test_suite.addTest(RanzhiLogonTc01("test_xxx"))

html_test_runner = HTMLTestRunner(stream=report_file, title="xxx", description="dddd")

html_test_runner.run(test_suite)

在项目根目录创建main.py,作为测试项目的主入口,运行测试。

检查测试报告

Selenium 可能遇到的问题

有无问题?

a

f1 = find_element_by_css_selector(frame)

switch_to.frame(f1)

b

s1 = find_element_by_css_selector(select)

ss1 = Select(s1)

ss1.select_by_index(0)

ss1.select_by_value("人事部")

c 编码问题 utf-8

d 时间等待问题 sleep(5)

单元测试框架

unittest

解决了什么问题?

unittest.TestCase

前置条件

清理

测试过程步骤

断言 assertEqual(期望值, 实际结果, 错误提示)

运行测试 test_开头的方法

unittest.TestSuite

addTest(xxx("test_batch_login"))

自定义的添加测试用例,并执行

unittest.TextTestRunner

run(suite)

执行创建并维护好的测试套件

test_runner test_suite test_case

测试运行器 测试套件 测试用例

模块化操作

面向对象的实践:

1. 编写一个类,类里面描述公共的方法

2. 实例化这个类,调用这个类的方法

有无问题?

类的构造方法,需要传递 webdriver.Firefox()

self.common = RanzhiCommon(self.browser, self.base_url)

数据驱动测试

读取csv,循环每一行数据进行操作

读取MySQL,用例存到MySQL中

1. 中文编码的问题。

# coding="utf-8"

读csv的时候,添加 encoding='utf-8'

csv.reader(open("xxx.csv", "r", -1, encoding="utf-8")

2. 循环放到最外层

3. 文件路径在控制台读取不到的问题,需要用绝对路径来指向文件

封装WebDriver

避免第三方代码的威胁,防止大批量修改测试用例

节约人力的成本(如果封装以后,不需要每个自动化测试工程师都会WebDriver)

标准化自动化用例的操作,只需要调用公共的标准模块就好。

python写ui自动化测试用例_自动化测试(6) | Web UI 自动化测试方案相关推荐

  1. python中什么是数据驱动_携程大牛谈自动化测试里的数据驱动和关键字驱动思路的理解...

    对于初次接触自动化测试时,对数据驱动和关键字驱动不甚理解,觉得有点故弄玄虚,不就是参数和函数嘛!其中也体现了测试所不同与开发的一些特点(主要指系统测试),以及和对技术发展的脉络的展现. 一.录制/回放 ...

  2. python编写接口自动化脚本_简单的python http接口自动化脚本

    摘抄:今天给大家分享一个简单的python脚本,使用python进行http的接口测试,脚本很简单,逻辑是:读取excel写好的测试用例,然后根据excel中的用例内容进行调用,判断预期结果中的返回值 ...

  3. python写一个笔记软件_科学网—python学习笔记(1)——创建应用 - 高雪峰的博文...

    创建应用的步骤打开命令行 进入manage.py的同级目录 命令行输入:python manage.py startapp blog 添加应用名到sittings.py中的Installed_apps ...

  4. 【总结】用pytest写接口自动化测试用例

    1.自动化用例怎么写? 概念问题: 1.功能覆盖率= 至少被执行一次的测试功能点数/ 测试功能点总数 (功能点) 2.需求覆盖率= 被验证到的需求数量 /总的需求数量 (需求) 3.覆盖率= 至少被执 ...

  5. UI自动化测试用例的编写

    1.  主要内容:   2.  手工测试用例与自动化测试用例区别 目前自动化测试更多的时候是定位在冒烟测试和回归测试: 冒烟测试执行的是主体功能点的用例. 回归测试执行全部或部分的测试用例. 3.   ...

  6. python写个礼物送人_送你个情人节礼物:Python版抖音同款表白神器

    又到了一年一度的情人节!大家都准备送什么给自己心仪的对象呢? 鲜花.巧克力都太俗套了,今天给大家带来一个抖音上看到的表白神器 - 用Python写一个告白程序,让她看到你满满的爱(tao)意(lu). ...

  7. python写一个表白程序_用Python写一个能算出自己年龄的小程序

    用Python写一个能算出自己年龄的小程序. 其实我连我今年多少岁都不知道,最近看到了python的datetime库里面有很多好用的方法,于是就写了这样一个程序作为练习,然后又写了这样一篇文章来梳理 ...

  8. 微信群总有人发广告?用Python写一个自动化机器人消灭他

    作者 | 刘早起 出品 | 早起Python(ID: zaoqi-python) 微信群牛皮癣,指的是在微信群里毫无下限的群发小广告的用户,是微信群主最痛恨的一波人.如果熟悉早起的读者可以知道我有一个 ...

  9. 用python写跑酷游戏脚本_用python写游戏之2D跑酷游戏(二)

    这篇文章介绍2D跑酷游戏中,添加地板资源, 给主角附加重力作用,以及添加游戏控制器和游戏场景的切换. 废话不多说,直接开始. 添加地板资源 定义地板类,继承自pygame.sprite.Sprite ...

最新文章

  1. UIBarButtonSystemItem 各种款式
  2. mysql多实例配置使用方法
  3. springcloud中config和bus的使用
  4. Android 屏幕适配资料汇总
  5. flex4的新数据类型ArrayList
  6. 算法导论第三版 第一章答案
  7. 雷达信号处理读书笔记
  8. 阿里云系统盘扩容及数据盘分区、格式化分区、挂载、取消挂载
  9. 经典作品推荐CLANNAD(含下载、汉化、周边和攻略,真正全语音)
  10. 程序员的“我爱你”表达方式
  11. 【GMS认证】关于GSI和VTS解锁刷镜像命令总结
  12. P2P穿透StunServer
  13. TSI系统测量参数之:轴向振动
  14. 新加坡风险投资公司将投资1000万美元建立加密货币区块链投资基金
  15. mysql 日期比较_详解Mysql中日期比较大小的方法
  16. office2016和office visio2016同时安装包你一次成功
  17. 【机器学习】线性回归(理论)
  18. rasp 系统_OpenRASP管理后台安装记录
  19. 房地产开发流程(详细)
  20. Allegro_根据已有BRD绘制新的BRD那些事

热门文章

  1. 使用脚手架应用做单元测试
  2. GraphQL一些hello world级别的例子
  3. enterprise search for Object is not enabled
  4. 获得某个organization unit下面的所有sales org id list
  5. SAP BSP同本地硬件的集成
  6. 研究SAP service order status存储字段
  7. SAP ABAP实用技巧介绍系列之 ABAP内存管理学习
  8. Java AOP研究之how is my aop2 method called
  9. canvas 文字颜色_canvas 中普通动效与粒子动效的实现
  10. php dvld.active 1,PHP的字符串