测试框架就是一个集成的体系,包括测试功能的函数库(如导入的包),测试数据源(测试数据),测试对象识别标准(webdriver的各个api),以及可充用的模块(结构优化),自动化测试框架主要经过 模块驱动测试--》数据驱动测试--》对象驱动测试几个过程。
一.模块驱动测试
模块驱动主要发展过程:线性测试(一个用例对应一个脚本,数据和脚本混合)---》模块化与类库(重复的部分写成公共的模块,需要的时候进行调用)
模块化多用于登录和退出模块,或者多处共用的模块
好处:1.提高了开发效率,一处写,多处用 2.方便脚本维护,不必改一处,处处动,类似与环境变量设置的 %home%
下面我们进行登录和退出的模块化,在这之前先了解一下 python的类和方法
def关键字用来创建函数,add为方法名。a和b为参数;class关键字用来创建类,Counter为方法名,特别注意,类下创建方法第一个参数必须为self,但是使用时不必赋值
self:self指对象本身,创建类和方法时实例化得到对象 self,调用时自动执行 类.方法(对象self,参数a,参数b)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
>>>
def
add(a,b):
c
=
a
+
b
print
c
>>> add(
2
,
3
)
5
>>>
def
add1(a
=
1
,b
=
12
):
c
=
a
+
b
return
c
>>> d
=
add1()
>>>
print
d
13
>>>
class
Counter:
def
add(
self
,a,b):
c
=
a
+
b
print
c
def
subtract(
self
,a,b):
c
=
a
-
b
print
c
>>> d
=
Counter()
>>> d.subtract(
7
,
2
)
5
|
登录输入用户名,密码的操作单独放到一个脚本中 login.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
#coding=utf-8
from
selenium
import
webdriver
from
selenium.common.exceptions
import
NoSuchElementException
import
unittest
from
time
import
sleep
#登录网址
def
login(
self
):
driver
=
self
.driver()
dr.maxmize_window()
dr.find_element_by_name(
"username"
).send_keys(
"dingxin"
)
dr.find_element_by_name(
"password"
).send_keys(
"admin"
)
dr.find_element_by_id(
"loginInBtn"
).click()
sleep(
3
)
|
登录后进行其他操作放到 test_login.py中得到:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
#coding=utf-8
from
selenium
import
webdriver
from
time
import
sleep
from
selenium.common.exceptions
import
NoSuchElementException
import
unittest
import
login
#Login类继承TestCase类,告诉unittest,这是一个案例
class
Login(unittest.TestCase):
#初始化数据
def
setUp(
self
):
self
.driver
=
webdriver.Chrome()
self
.driver.implcitly_wait(
30
)
self
.url
=
"http://dhw.lxhbysn.com/pages/E02/login.jsp"
self
.verificationErrors
=
[]
self
.accept_next_alert
=
True
#登录
def
test_login(
self
):
driver
=
self
.driver
driver.get(
self
.url)
#调用登录模块
login.login(
self
)
sleep(
3
)
lis
=
driver.find_elements_by_class_name(
"li"
)
for
li
in
lis:
if
li.get_attribute(
"role"
)
=
=
"presentation"
:
print
li.text
#
def
tearDown(
self
):
self
.driver.quit()
self
.assertEqual([],
self
.verificationErrors)
if
_name_
=
=
"_main_"
:
unittest.main()
|
(注意缩进,要不然调试不出来)
二.数据驱动测试(即参数化,输入数据的不同导致结果也不同)
实例1:百度搜索逐个多个字段
创建data.txt
1
2
3
4
|
selenium
go die
WFU
appium
|
创建search.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
#coding=utf-8
from
selenium
import
webdriver
from
time
import
sleep
import
os
#打开数据文件并读取
source
=
open
(
"C:\\Users\\DELL\\Desktop\\data.txt"
,
"r"
)
values
=
source.readlines()
source.close()
#登录网址
for
search
in
values:
dr
=
webdriver.Chrome()
dr.get(
"http://www.baidu.com"
)
dr.find_element_by_id(
"kw"
).send_keys(search)
dr.find_element_by_id(
"su"
).click()
sleep(
3
)
|
open是以只读方式打开,readlines()逐行读取文件内容
实例2:登录时多个用户名和密码
python读取文件只有整个读取,逐行,逐个字节进行读取,没有一次读取两条数据
(1)思路:可以创建两个txt,一个放登录名,一个放密码,缺点是无法实现循环
(2)使用函数
1
2
3
4
5
|
def
fun(name
=
"admin"
,
pass
=
123
"):
return
name,
pass
#正式的登录页面调用该函数
us,pw
=
info.fun()
|
(3)python字典(键值对)创建字典用{},keys()返回键值列表,values()返回值列表,
1
2
3
4
5
6
7
8
9
|
>>> data
=
{
'user'
:
'dong'
,
'apassword'
:
'489330019'
}
>>>
print
data
{
'user'
:
'dong'
,
'apassword'
:
'489330019'
}
>>> data.keys()
[
'user'
,
'apassword'
]
>>> data.values()
[
'dong'
,
'489330019'
]
>>> data.items()
[(
'user'
,
'dong'
), (
'apassword'
,
'489330019'
)]
|
函数获取data(整个文件)后期可以用以下循环取出:
1
2
|
for
user,
pass
in
info.items():
# (将user,pass传入到send_keys()中)
|
实例三:表单参数化,多条表单信息(姓名,性别,邮箱,号码),保存成excel,转为csv,可用于创建订单或添加联系人
具体实现:
创建xls文件转化为csv格式,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
#coding=utf-8
#导入csv包
import
csv
#csv.reader读取csv文件
w_file
=
'C:\\Users\\DELL\\Desktop\\info.csv'
data
=
csv.reader(
file
(w_file,
'rb'
))
#循环输出每一行信息
for
user
in
data:
print
user[
0
]
print
user[
1
]
print
user[
2
]
print
user[
3
]
|
结果如下:user[0]表示第一列的数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
>>>
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
RESTART
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
>>>
test
test@
163.com
18
男
test2
test2@
163.com
21
女
test3
test3@
163.com
11
女
|
实例四:可以通过xml文件进行参数化,一般来说 csv和xml比较灵活。
三.对象驱动测试
对象驱动测试其实包括数据和关键字驱动测试,关键字驱动即类似与selenium IDE 的 command,target 和value 组合进行测试。