自动化测试之数据文件的读取
虽然此前文章中提到了参数化,但大多数测试更倾向于把测试数据放到数据文件中。所以这里介绍下常见的读取数据文件的方法。
这里继续之前用户登录的例子,将用户信息拆分到单独的数据文件中,在需要时进行读取,来进一步的参数化。
01 TXT文件的读取
txt文件是我们经常操作的文件类型,Python为我们提供了以下几种读取方法:
read()
读取整个文件readline()
读取一行数据readlines()
读取所有行的数据
现在假设我们准备了一个用户信息的txt文件命名为user_info.txt,内容如下:
:
:password
username:
user_error:passwd_error
admin:admin
我们可以使用以下方式对其读取:
# 读取文件
with(open("./user_info.txt", "r")) as user_data:
data = user_data.readlines()
# 格式化处理
users = []
for line in data:
user = line[:-1].split(":")
users.append(user)
注意:在上述代码中,我们使用[:-1]
方式对拿到的每一行数据,进行切片操作,以忽略每行中最后一个字符,因为读取的每一行数据结尾都有一个换行符\n
。split()方法则是通过指定的分割符对数据进行拆分。
这里我们可以打印出users的二维数据,如下
[['', ''], ['', 'password'], ['username', ''], ['user_error', 'passwd_error'], ['admin', 'admin']]
于是,我们用户登录的测试用例,就可以进一步的参数化。
# 调用Mail类并接收driver驱动
mail = Mail(driver)
# 登录账户为空
mail.login(users[0][0], users[0][1])
# 用户名为空的情况下登录邮箱
mail.login(users[1][0], users[1][1])
# 密码为空的情况下登录邮箱
mail.login(users[2][0], users[2][1])
# 用户名或密码错误的情况下登录邮箱
mail.login(users[3][0], users[3][1])
# 管理员账户登录
mail.login(users[4][0], users[4][1])
02 CSV文件的读取
CSV文件可用来存放固定字段的数据,这次我们把用户信息保存在CSV文件中,如下所示:
Python中对CSV文件的读取,可以借助csv
模块,具体代码如下:
import csv
import codecs
from itertools import islice
# 读取本地CSV文件
data = csv.reader(codecs.open("./user_info.csv", "r", "utf_8_sig"))
# 存放用户数据
users = []
# 循环输出每行信息
for line in islice(data, 1, None):
users.append(line)
通过Python读取CSV文件比较简单,但有两类问题值得注意下。
中文乱码问题
在数据文件中我们不可避免地会使用中文,上述代码中用到的codecs
模块,是Python标准的模块编码/解码器。
首先通过codecs
提供的open()方法,在打开时可以指定编码类型,如utf_8_sig,接下来导入csv模块,通过reader()方法读取文件,这样就可以避免中文乱码问题。跳过CSV文件的表头进行读取
因为我们一般会在第一行测试字段名,所以在读取数据时需要跳过。Python的内建模块itertools
提供了用于操作迭代对象的函数,即islice()函数,它可以返回一个迭代器,第一个参数用于指定迭代对象,第二个参数指定开始迭代的位置,第三个参数表示结束位。
这里我们同样可以打印出users的二维数据,如下
[['', '', '请输入账号'], ['', 'password', '请输入账号'], ['username', '', '请输入密码'], ['user_error', 'passwd_error', '账号或密码错误'], ['admin', 'admin', '管理员您好'], ['guest', 'guest', 'Guest您好']]
03 XML文件的读取
有时我们需要数据是不规则的。例如,我们需要用一个配置文件来配置当前自动化测试平台、浏览器、URL、登录的用户名密码等内容,这时就可以使用XML文件来存放这些测试数据。
以下这个xml文件的示例,是我们工作用到一个配置文件。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<appSettings>
<!--UI Test Data-->
<BaseUrl>https://10.10.32.105</BaseUrl>
<login UserName="Jeffrey.Zhao" UserPassword="Zhao1234##"/>
<login UserName="admin" UserPassword="admin"/>
<AdminURL>/admin.html</AdminURL>
<AppURL>/desktop.html</AppURL>
<AppURL>/#/</AppURL>
<DOWNLOADPATH>C:\Automation\Qs</DOWNLOADPATH>
<Browsers>
<Browser>chrome</Browser>
<Browser>Firefox</Browser>
<Browser>Edge</Browser>
</Browsers>
<!-- DB Server Setting-->
<MONGODB_USER>admin</MONGODB_USER>
<MONGODB_PWD>admin</MONGODB_PWD>
<ReplicaSetName>rs1</ReplicaSetName>
<MongoDBStr>mongodb://admin:admin@10.10.32.106:27017</MongoDBStr>
<MONGODB_IP>10.10.32.106</MONGODB_IP>
<MONGODB_PORT>27017</MONGODB_PORT>
</appSettings>
</configuration>
通过这个文件,不难看出,数据主要存放在标签对之间。有时数据也会作为标签的属性存放。
接下来看看,如何读取它。
3.1 获取标签对之间的数据
from xml.dom.minidom import parse
# 打开XML文件
dom = parse('./config.xml')
# 得到文档元素对象
root = dom.documentElement
# 获取(一组)标签
tag_name = root.getElementsByTagName('Browser')
print(tag_name[0].firstChild.data)
print(tag_name[1].firstChild.data)
print(tag_name[2].firstChild.data)
Python自带读取XML文件的模块,通过parse()方法可读取XML文件。documentElement()方法用于获取文档元素对象,getElementsByTagName()方法用于获取文件中的标签。我们不需要指定标签的层级关系,即获取的标签可以是层级的,之所以在定义XML文件时设置层级,仅仅是为了方便阅读。
获取标签数组中的某个元素。firstChild属性可返回被选节点的第一个子节点,data表示获取该节点的数据,它与WebDriver中的text语句的作用相似。
3.2 获得标签的属性值
from xml.dom.minidom import parse
# 打开XML文件
dom = parse('./config.xml')
# 得到文档元素对象
root = dom.documentElement
# 获取(一组)标签
login_user = root.getElementsByTagName('login')
# 获得login标签的UserName属性值、UserPassword属性值
print("user1_name:", login_user[0].getAttribute("UserName"))
print("user1_passwd:", login_user[0].getAttribute("UserPassword"))
print("user2_name:", login_user[1].getAttribute("UserName"))
print("user2_passwd:", login_user[1].getAttribute("UserPassword"))
执行结果如下:
user1_name: Jeffrey.Zhao
user1_passwd: Zhao1234##
user2_name: admin
user2_passwd: admin
这里主要使用了getAttribute()
方法获取元素的属性值,它和WebDriver中的get_attribute()
方法作用相似。
04 JSON文件的读取
JSON是一种轻量级的数据交换格式,清晰的层次结构使用JSON文件被广泛使用。
在Python中读取JSON文件同样很方便,在这里我们准备一个uesr_info.json文件。
[
{"username":"", "password":""},
{"username":"", "password":"password"},
{"username":"username", "password":""},
{"username":"user_error", "password":"passwd_error"},
{"username":"admin", "password":"admin"}
]
接下来,我们进行json文件内容的读取。
import json
with open('./user_info.json', "r") as f:
data = f.read()
user_list = json.loads(data)
print(user_list)