这一小节我们就通过一些例子来展示数据驱动在自动化测试中的应用。
126 邮箱登录
我们同样有以 126 邮箱的登录为例了,现在我们的需求是测试登录。那么在测试登录的用例中我们需
求通过不同的用户名与密码进行验证。对于测试脚本来说,不变的是登录的步骤,变化的是每次所输入的
用户名和密码不同,这种情况下就需求用到数据驱动方式来完成这个需求。
mail126.py
#coding=utf-8
from selenium import webdriver
driver = webdriver.Firefox()
driver.implicitly_wait(10)
class Account(object):
"""docstring for Account"""
def __init__(self,username ='', password = ''):
self.username = username
self.password = password
def do_login_as(user_info):
driver.find_element_by_id("idInput").clear()
driver.find_element_by_id("idInput").send_keys(user_info.username)
driver.find_element_by_id("pwdInput").clear()
driver.find_element_by_id("pwdInput").send_keys(user_info.password)
driver.find_element_by_id("loginBtn").click()
#实例化登陆信息
admin = Account(username='admin',password='123')
guset = Account(username='guset',password='321')
#调用登陆函数
do_login_as(admin)
do_login_as(guset)
首先创建表 Account 类,对用户名密码进行初始化设置,紧接着创建 do_login_as()函数用于实现用
户的登录操作,它需要一个 user_info 参数用于接收用户的登录信息。取 user_info 中的 username 输入
到用户名输入框,取 user_info 中的 password 输入密码输入框。
紧接着下面的操作就是通过调用 Account 实例化用户 admin 和 guset,进行个性化的参数设置。最后
分别调用 do_login_as()函数来实现不同用户的登录。
百度搜索
如果 126 邮箱登录的例子对于理解数据驱动概念不够清晰,那么我们再看一个百度搜索的例子,对于
这个例子前面已经出现过多次。我们每个上网的人每天都要用很多次百度,那么我们每一次使用的步骤都
是一样的,不一样的是每一次搜索的“关键字”不同,从而会得到不同的搜索结果。
info.txt
selenium
webdriver
Python
创建 info.txt 文件,每一行写上需要搜索的“关键字”。
baidu.py
#coding=utf-8
from selenium import webdriver
file_info = open('info.txt','r')
values = file_info.readlines()
file_info.close()
for serch in values:
driver = webdriver.Firefox()
driver.implicitly_wait(10)
driver.get("http://www.baidu.com")
driver.find_element_by_id('kw').send_keys(serch)
driver.find_element_by_id('su').click()
driver.quit()
首先通过 open()方法以读(‘r’)的方式打开当前目录下的 info.txt 文件,通过 readlines()获取
文件中所有行的数据,并赋值给变量 values。通过 close()关闭文件。
接下来的步骤就是循环的执行百度搜索的脚本,每一次取 vlaues 中的一行数据做为“搜索关键字”
传递给百度输入框。通过这个例子更充分的体现有数据驱动的概念。
读取 txt 文件
上面的例子中我们已经使用到了 txt 文件的读取。Python 提供了以下几种读取文件的方式。
read() 读取整个文件。
readline() 读取一行数据。
readlines() 读取所有行的数据。
readlines()方法我们通过上面的列子已经了解了它使用,那么问题来了,现在有一个新需求需求第
次读取一个用户名和一个密码,上面所提供的几个读取文件数据的方法并不能解决这个需求。这个需求如何通过读取 txt 文件实现呢?看下面的例子。
user_info.txt
zhangsan,123
lisi,456
wangwu,789
首先在数据的存放上做了调整,每一行存放用户名和密码,它们之间用逗号隔开。
user_info.txt
#coding=utf-8
from selenium import webdriver
user_file = open('user_info.txt','r')
values = user_file.readlines()
user_file.close()
for serch in values:
username = serch.split(',')[0]
print username
password = serch.split(',')[1]
print password
运行结果:
>>> ========================= RESTART ==============================
>>> zhangsan
123
lisi
456
wangwu
678
在读取 user_info.txt 文件的时候,同样使用 readlines()方法读取所有行的数据,那么获取到的一
行数据如何拆分出用户名和密码是关键,这里我们使用 split()进行拆分,它可将一个字符符串通过某一
符号拆分成左右两部分,这里逗号(,)为分割点。split()拆分出来的左右两部分以数据的形式存放,
所用[0]可以取到左半部分的字符串,[1]可以取到右半部分的字符串。
这样就可以方便有使用 txt 文件来存放用户名和密码数据了,或者其它必须成对调用的数据。
读取 csv 文件
那么新的问题来了,假如,现在要读取的是一组用户数据,这一组数据包括用户名、邮箱、年龄、性别等信息。这个时候再使用 aplit()方法拆分就可不那么方便了,因为它一次只能将字符串拆分成左右两
部分。
下面通过读取 csv 文件的方法来解决这个每次要读取多个信息的问题。
首先创建 userinfo.csv 文件,通过 WPS 表格 或 Excel 创建表格,文件另存为选择 CSV 格式进行保存,
注意不要直接修改 Excel 的后缀名来创建 CSV 文件,这样创建出来的并非真正的 CSV 文件。
下面修改 loop_reader.py 文件进行循环读取:
user_info.txt
#coding=utf-8
import csv #导入 csv 包
#读取本地 CSV 文件
my_file='info.csv'
date=csv.reader(file(my_file,'rb'))
#循环输出每一行信息
for user in date:
print user
运行结果:
>>> ========================= RESTART ==============================
>>>
['testing', '123456@126.com', '23', 'man']
['testing2', '123456@qq.com', '18', 'woman']
['testing3', '123456@128.com', '29', 'woman']
首先表导入 csv 模块,通过 reader()方法读取 csv 文件。然后通过 for 循环遍历文件中的每一行数据。
从打印结果可以看出是以数组的形式存的。那么如果想取用户的某一列信息,只需要指定下标即可。
user_info.txt
#coding=utf-8
import csv
my_file='info.csv'
date=csv.reader(file(my_file,'rb'))
#取用户的邮箱地址
for user in date:
print user[1]
运行结果:
>>> ========================= RESTART ==============================
>>>
123456@126.com
123456@qq.com
123456@128.com
在上面的例子中只需要取所有用户的邮箱地址,那么只需要指定邮箱地址的所在例即可。数组下标是
以 0 开始的,取第二例的信息下标为 1。
通过这种方式就解决读取多列数据的问题,在本中是以读取 CSV 文件为例,读取 Excel 文件的方式也
类似,只是所调用的模块就需要从 csv 切换为 xlrd,真对 Excel 文件操作的方法也有所不同。