🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] ## **5.4 读取数据文件** 虽然前面的例子中用到了参数化,但大多数测试更倾向于把测试数据放到数据文件中。 下面介绍几种常见的读取数据文件的方法。 ### **5.4.1 读取 txt 文件** txt 文件是我们经常操作的文件类型,Python 提供了以下几种读取 txt 文件的方法。 * read():读取整个文件。 * readline():读取一行数据。 * readlines():读取所有行的数据。 回到前面登录的例子,现在把用户名和密码存放到 txt 文件,然后读取该 txt 文件中的数据作为测试用例的数据。创建./data_file/user_info.txt 文件。 ``` :123 zjut_cheng: cc:1 ``` 这里将用户名和密码按行写入 txt 文件中,用户名和密码之间用冒号“:”隔开。创建read_txt.py 文件,用于读取 txt 文件。 ``` with(open("./data_file/user_info.txt", "r")) as user_file: data = user_file.readlines() # 格式化处理 users = [] for line in data: user = line[:-1].split(":") users.append(user) # 打印users二维数组 print(users) ``` 运行结果如下: ``` [['', '123'], ['zjut_cheng', ''], ['cc', '']] ``` 首先通过 open()以读(“r”)的方式打开 user_info.txt 文件,readlines()可读取文件中的所有行并赋值给变量 data。 接下来循环 data 中的每一行数据,[:-1] 可对字符串进行切片,以省略最后一个字符,因为读取的每一行数据结尾都有一个换行符“\n”。split()通过冒号(:)对每行数据进行拆分,会得到数组['', '123'] 。 最后使用 append()把每一组用户名和密码追加到 users 数组中。 取 users 数组中的数据,将得到的数组用不同的用户名/密码进行登录,代码如下。 ``` # 调用 Mail 类 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]) … ``` ### **5.4.2 读取 CSV 文件** CSV 文件可用来存放固定字段的数据,下面我们把用户名、密码和断言保存到 CSV文件中,如图 5-2 所示。 ![](https://img.kancloud.cn/bf/f7/bff77d4c1bcd60ef8d866a86f310bd4c_392x149.png) **注意:** 可以把 WPS 表格或 Excel 表格通过文件“另存为”保存为 CSV 类型的文 件,但不要直接修改文件的后缀名来创建 CSV 文件,因为这样的文件并非真正的 CSV 类型的文件。 <br /> 下面编写 read_csv.py 文件进行循环读取。 ``` # coding:utf-8 import csv from itertools import islice # 读取本地 CSV 文件 data = csv.reader(open('./data_file/user_info.csv', 'r', encoding='utf-8')) # 存放用户数据 users = [] # 循环输出每行信息 for line in islice(data, 1, None): users.append(line) # 打印 print(users) ``` 运行结果如下。 ``` [['', '123', '请输入账号'], ['user', '', '请输入密码'], ['error', 'error', '账号错误'],] ``` 通过 Python 读取 CSV 文件比较简单,但会遇到两个问题。 (1)中文乱码问题。在数据文件中我们不可避免地会使用中文,codecs 是 Python 标准的模块编码和解码器。首先,通过 codecs 提供的 open()方法,在打开文件时可以指定编码类型,如 utf_8_sig;然后,导入 csv 模块,通过 reader()方法读取文件,即避免中文乱码问题。 (2)跳过 CSV 文件的第一行。因为我们一般会在第一行定义测试字段名,所以在读取数据时需要跳过。Python 的内建模块 itertools 提供了用于操作迭代对象的函数,即 islice()函数,它可以返回一个迭代器,第一个参数指定迭代对象,第二个参数指定开始迭代的位置,第三个参数表示结束位。 <br /> ### **5.4.3 读取 XML 文件** 有时我们需要读取的数据是不规则的。例如,我们需要用一个配置文件来配置当前自动化测试平台、浏览器、URL、登录的用户名和密码等,这时就可以使用 XML 文件来存放这些测试数据。 创建 config.xml 文件,代码如下。 ``` <?xml version="1.0" encoding="utf-8" ?> <info> <platforms> <platfprm>Windows</platfprm> <platfprm>Linux</platfprm> <platfprm>macOS</platfprm> </platforms> <browsers> <browser>Firefox</browser> <browser>Chrome</browser> <browser>Edge</browser> </browsers> <url>https://email.163.com/</url> <login username="admin" password="123456"/> <login username="guest" password="123"/> </info> ``` 通过代码可以看出,数据主要存放在标签对之间,如`<platform>Windows</platform>`。或者是作为标签的属性存放,如`<login username="admin" password="123456"/>`。 下面以 config.xml 文件为例,介绍读取 XML 文件的方法。 <br /> **1.获得标签对之间的数据** ``` from xml.dom.minidom import parse # 打开xml文件 dom = parse('./data_file/config.xml') # 得到文档元素对象 root = dom.documentElement # 获取(一组)标签 tag_name = root.getElementsByTagName('os') print(tag_name[0].firstChild.data) print(tag_name[1].firstChild.data) print(tag_name[2].firstChild.data) ``` 运行结果如下。 ``` Windows Linux macOS ``` Python 自 带 读 取 XML 文件的模块,通过 parse() 方 法 可 读 取 XML 文件。 documentElement()方法用于获取文档元素对象,getElementsByTagName()方法用于获取文件中的标签。我们不需要指定标签的层级关系,即获取的标签可以是任意层级的,之所以在定义 XML 文件时设置层级,仅仅是为了方便阅读。 接下来,获取标签数组中的某个元素。firstChild 属性可返回被选节点的第一个子节点,data 表示获取该节点的数据,它和 WebDriver 中的 text 语句作用相似。 <br /> **2.获得标签的属性值** ``` from xml.dom.minidom import parse # 打开xml文件 dom = parse('./data_file/config.xml') root = dom.documentElement login_info = root.getElementsByTagName('login') # 获得login标签的username属性值 username = login_info[0].getAttribute("username") print(username) # 获得login标签的password属性值 password = login_info[0].getAttribute("password") print(password) # 获得第二个login标签的username属性值 username = login_info[1].getAttribute("username") print(username) # 获得第二个login标签的password属性值 password = login_info[1].getAttribute("password") print(password) ``` 运行结果如下。 ``` admin 123456 guest 123 ``` <br /> ### **5.4.4 读取 JSON 文件** JSON 是一种轻量级的数据交换格式,清晰的层次结构使得 JSON 文件被广泛使用。 Python 同样可以读取 JSON 文件,下面创建 user_info.json 文件。 ``` [ {"username":"", "password":""}, {"username":"", "password":"123"}, {"username":"user", "password":""}, {"username":"error", "password":"error"} ] ``` 创建 read_json.py 文件。 ``` import json with open("./data_file/user_info.json", "r") as f: data = f.read() user_list = json.loads(data) print(user_list) ``` 通过 open()方法即可读取 user_info.json 文件。因为测试数据本身是以列表和字典格式存放的,所以读取整个文件内容后,通过 JSON 提供的表将 str 类型转换为 list 类型即可。