有用的链接:
自动化Selenium的Java文档
http://www.jianshu.com/p/00616647ddae
自动化Selenium的源代码
https://coding.net/u/lintyleo/p/WeekendSelenium
建立自动化测试的组,理想状态下有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中的步骤如下
D:\SVN\XXProject\Trunck
硬件:
硬件的要求不高,主要需要独立的测试环境。另外测试人员用的电脑最好是Windows桌面操作系统,需要安装Firefox浏览器,避免47.0的最新版本。测试人员最好也使用Chrome浏览器辅助进行Web元素的定位。
C#
Nunit
WebDriverJava
Junit
/ testNG
WebDriverPython
unittest
WebDriverRuby
Test::Unit
WebDriver 定位方式
`by id`, `name`, `class_name`, `tag_name`, `css_selector`, `xpath`, `link_text`, `partial_link_text`
主要用的 是 id,name, css_selector, xpath, link_text
path
Path
我的电脑
属性 | 高级系统设置
| 环境变量
系统变量
| Path
并 双击 | Ctrl+C
| 编辑 | Ctrl+V
安装 Selenium
cmd | pip install -U selenium
-U
=--upgrade
升级安装
类似于linux命令
command -x param
容易出现的问题
cd C:\Python34\Scripts
管理员方式运行
实例化一个WebDriver的对象(使用默认的火狐浏览器 v46或者以下)
driver = webdriver.Firefox()
注意,一定要写括号,代表实例化对象
打开网址
driver.get("http://localhost/ranzhi/www")
查找元素
用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()
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
tag
.+class
CSS selector的获取
可以使用开发者工具,定位的元素,右键 | 复制 selector(复制CSS路径)
#langs > button
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
特定的元素的处理
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>
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()
需要掌握的知识点:
dict
类型
需要将每个用例都需要用的公共的功能,抽取出来,放到一个公共类中,作为模块化
创建一个Python Package "common",在里面创建一个ranzhi_common.py文件,里面添加RanzhiCommon类
创建测试用例的类,比如 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()
##....
unittest
,主要是用 TestCase
(测试用例)unittest
,主要用的是TestSuite
(测试套件)、和 TextTestRunner
(文本测试运行器)[或者HTMLTestRunner
]方案实现的具体步骤:
使用PyCharm
创建新的PurePython
项目
在项目中创建如下的文件夹(python package)
分别实现上述模块
在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
,作为测试项目的主入口,运行测试。
检查测试报告
有无问题?
a <iframe>
f1 = find_element_by_css_selector(frame)
switch_to.frame(f1)
b <select>
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