自动化测试之数据文件的读取

自动化测试之数据文件的读取

虽然此前文章中提到了参数化,但大多数测试更倾向于把测试数据放到数据文件中。所以这里介绍下常见的读取数据文件的方法。

这里继续之前用户登录的例子,将用户信息拆分到单独的数据文件中,在需要时进行读取,来进一步的参数化。

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)

文章作者: &娴敲棋子&
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 &娴敲棋子& !
评论
  目录