21.软件测试python中的文件和异常

今日内容

  • 文件操作
    – 普通文件的操作
    – json文件的操作【重点】
  • 异常处理(程序代码运行时的报错处理)

文件介绍

计算机的文件,就是存储在某种 长期存储设备 上的一段数据。

作用:
    将数据长期报错下来,在需要的时候使用

  1. 计算机只认识 二进制 0 1
  2. 文件中存储的数据都是以二进制 0 1 的形势去存储的

我们可以通过记事本打开文件,看看它是否能显示为文字,来判断这个文件是文本文件还是二进制文件。如果能正常显示文字,就是文本文件;如果显示乱码,就是二进制文件。

  • 文本文件
    1. 能够使用记事本打开,并可以正确地将这些内容显示为文字。
    2. 常见文本文件:txt、md、py、html、css、js、json
  • 二进制文件
    1. 不能使用记事本打开的文件,记事本打开后会显示一堆乱码,无法直接看懂。
    2. 常见二进制文件:exe、mp3、mp4、png

我们操作的基本都是文本文件

文件操作

1.文件操作的步骤

  1. 打开文件
  2. 读 或者 写 文件
  3. 关闭文件
打开文件

将文件从磁盘(电脑硬盘)中,读取到内存中。

语法:
    open(file,mode=’r’,encoding=None)
        > 参数 file:表示需要代开的文件,类型为字符串,打开文件的路径可以是相对路径,也可以是绝对路径(从根目录开始书写的路径),使用该参数时,建议使用相对路径(就是相对于代码文件所在的路径,例如:./ ../)
        > 参数 mode:表示默认参数(也就是所谓的缺省参数),它表示的是打开文件的方式。
            > r:read 为只读打开
            > w:wirte 为只写打开
            > a:append 表示追加打开,在文件的末尾写入内容
        > 参数 encoding:为编码方式(也就是二进制如何转换的)
            > gbk:表示将一个汉字转换为 2 个字节的二进制
            > utf-8:为常用参数,表示将一个汉字转换为 3 个字节的二进制
        > 返回值:返回的是 文件对象,后续对文件的操作,都需要这个对象

2.读或者写文件
  • 写文件
    向文件中写入指定的内容。
    使用的前提:文件的打开方式需要是w或者a
  • 语法
    文件对象.write(’写入文件的内容’)
    # 返回值为写入文件的字符数,我们一般不做关注
    # 注意使用 w 方式 打开文件
    1. 如果文件不存在,该语法会直接创建文件
    2. 如果文件存在,运行该语法会覆盖原文件(将原文件中的内容清空)
  • 代码
# 1. 打开文件
f = open('a.txt','w',encoding='utf-8')
# 2.写文件
f.write('好好学习\n')
f.write('天天向上')
# 3.关闭文件
f.close()
  • 读文件
    将文件中的内容读取出来。
    使用的前提:文件的打开方式需要时 r
  • 语法
    文件对象.read(n)
    # 这里的参数 n 表示读取多少个字符,我们一般不写,表示读取全部内容
    # 该语法的返回值为读取到的文件内容,类型是 字符串
  • 代码
# 1. 打开文件
f.open('a.txt','r',encoding='utf-8')
# 2. 读文件
buf = f.read()
print(buf) # 打印读取到的文件
# 3.关闭文件
f.close()

# 使用 r 方式打开文件,如果文件不存在,代码会报错
3.关闭文件

关闭文件就是将文件占用的资源进行清理,同时会保存文件,文件关闭之后,这个文件对象就不能使用了。

  • 语法
    文件对象.close()

使用 with open 打开文件

with open(file,mode,encoding=’utf-8′) as 变量:
    # 在缩进中去读取或者写入文件

# 缩进中的代码执行结束,出缩进之后,文件会自动关闭

  • 代码
with open('a.txt','a',encoding='utf-8') as f:
    f.write('good good study')

# a 的作用是打开文件的方式,文件不存在会创建文件,文件存在,则在文件的末尾写入内容

按行读取文件内容

按行读取文件内容,就是一次读取一行内容

  • 语法
    文件对象.readline()
  • 代码
# # 使用with语句打开文件,确保文件在操作完成后自动关闭
# with open('b.txt', encoding='utf-8') as f:
#     # 读取文件的第一行内容,并将其存储在变量but中
#     but = f.readline() # 111
#     # 打印第一行内容
#     print(but)
#     # 读取并打印文件的第二行内容
#     print(f.readline()) # 222




# # 使用with语句打开文件,确保文件在操作完成后自动关闭
with open('b.txt', encoding='utf-8') as f:
    # 按行读取文件内容,直到文件末尾
    for i in f:
        # 打印当前行内容,end=''参数表示不换行
        print(i, end='')



# read() 和 readline() 读到文件末尾,返回一个空字符串,长度为 0


# 使用with语句打开文件,确保文件在操作完成后自动关闭
with open('b.txt', encoding='utf-8') as f:
    # 循环读取文件的每一行
    while True:
        # 读取文件的一行内容,存储在变量buf中
        buf = f.readline()
        # 如果读取到的行内容为空(即长度为0),则跳出循环
        if len(buf) == 0:
            break
        else:
            buf = buf.strip() # 强制去除末尾的换行符
            # 打印当前行内容,end=''参数表示不换行
            print(buf, end='')


# 在容器中,容器为空,即容器中的数据的个数为 0,表示false, 其余情况都是true

# 打开文件 'b.txt',并指定编码为 'utf-8'
with open('b.txt', encoding='utf-8') as f:
    # 开始一个无限循环
    while True:
        # 从文件中读取一行内容到变量 buf
        buf = f.readline()
        # 如果 buf 不为空(即 len(buf) != 0),表示还有内容未读取
        if buf:
            # 打印当前读取的行内容
            print(buf)
        else:
            # 如果 buf 为空,表示文件已经读取完毕
            break

json文件的处理

json文件,也是一个文本文件,它可以直接使用 read() 和 write() 方法 去操作文件。

只是使用这两个方法,不方便,所以对于 json 文件有自己独特的读取和写入的方法

该方法常用在做测试的时候,将测试数据定义为json文件的格式,使用 代码读取 json 文件,即读取测试数据,进行传参(也就是参数化)

1.json的介绍

json 是一个基于文本,独立于语言的轻量级的数据交换格式

  • 基于文本:就是他是一个文本文件,但是不能包含图片,音视频等
  • 独立语言:就是不是某个语言特有的,每种编程语言都可以使用它
  • 轻量级:就是相同的数据,和其他格式相比,占用的大小比较小
  • 数据交换格式:作为后端程序员,给前端的数据(常见的有json、html、xml)

2.json文件的语法

  1. json文件的后缀是 .json
  2. json中的主要数据类型为 对象({}类似于python中的字典)和数组([]类似于python中的列表),json中的对象和数组可以互相嵌套。
  3. 一个json 文件是一个对象或者数组(即 json 文件的最外层要么是一个{},要么是一个[])。
  4. json中的对象是由键值对组成的,每个数据之间使用逗号隔开,但是最后一个数据后边不要写英文逗号
  5. json中的字符串 必须使用英文双引号包起来
  6. json中的其他数据类型
    > 数字类型int float——>int 
    > 字符串 string——>str
    > 布尔类型 true、false——> True、False
    > 空类型 null ——> None

3.json 文件的书写

  • 例如
    我叫小明,我今年18岁,性别男,爱好:听歌、游戏、购物、吃饭、睡觉、打豆豆
    我的居住地址为 国家:中国,城市:上海
  • 代码案例
{
 "name" : "小明",
  "age" : 18,
   "isMen" : true,
   "like" : [
        "听歌",
        "游戏",
        "购物",
        "吃饭",
        "睡觉",
        "打豆豆"
 ],
"address" : {
    "countre" : "中国",
    "city" : "上海"
}
}

20250318205055113-jsonimage-20210630113916354-tic

4.读取json文件

  1. 导报 import json
  2. 读-打开文件
  3. 读文件

json.load(文件对象)

注意:
该代码返回的是 字典(文件中是对象)或者列表(文件中是数组)

  • 代码案例
# 1.导入json模块
import json
# 导入Python的json模块,这个模块提供了处理JSON数据的函数,包括将JSON数据转换为Python对象和将Python对象转换为JSON数据。

# 2.打开json文件
with open('1.json', encoding='utf-8') as f:
    # 使用with语句打开文件,确保文件在使用完毕后自动关闭,避免资源泄露。
    # '1.json'是文件名,'utf-8'是文件的编码格式,确保能够正确处理包含非ASCII字符的数据。
    
    # 3.读取json文件
    result = json.load(f)
    # 使用json.load()函数从打开的文件对象f中读取JSON数据,并将其解析为Python字典。
    # result变量现在包含了解析后的JSON数据,可以像操作普通Python字典一样操作它。
    
    print(type(result))
    # 打印result变量的类型,由于result是一个字典,所以输出将是<class 'dict'>。
    
    print(result.get('name'))
    # 使用字典的get方法尝试获取键为'name'的值,如果键不存在,则返回None。
    
    print(result.get('age'))
    # 使用字典的get方法尝试获取键为'age'的值,如果键不存在,则返回None。
    
    print(result.get('address').get('city'))
    # 首先尝试获取键为'address'的值,如果键不存在,则返回None。
    # 然后尝试从返回的对象中获取键为'city'的值,如果键不存在,则返回None。

5.练习

我叫小明,我今年 18 岁,性别男, 爱好 听歌, 游戏,吃饭,睡觉,打豆豆,
我的居住地址为 国家中国, 城市上海.
我叫小红,我今年 17 岁,性别女, 爱好 听歌, 学习,购物
我的居住地址为 国家 中国, 城市北京.
  • info2.json

[
{
“name”: “小明”,
“age”: 18,
“isMen”: true,
“like”: [
“听歌”,
“游戏”,
“购物”,
“吃饭”,
“睡觉”,
“打豆豆”
],
“address”: {
“country”: “中国”,
“city”: “上海”
}
},
{
“name”: “小红”,
“age”: 17,
“isMen”: false,
“like”: [
“听歌”,
“购物”,
“学习”
],
“address”: {
“country”: “中国”,
“city”: “北京”
}
}
]

  • 代码文件
# 导入json模块,用于处理JSON数据
import json

# 使用with语句打开名为'info2.json'的文件,并指定编码为utf-8
# 'with'语句确保文件在使用后自动关闭,即使在处理过程中发生异常
with open('info2.json', encoding='utf-8') as f:
    # 使用json.load()方法将文件中的JSON数据解析为Python对象(通常是列表或字典)
    # 这里假设'info2.json'文件包含一个JSON数组,解析后存储在info_list变量中
    info_list = json.load(f)
    
    # 遍历info_list中的每个元素,info代表列表中的每个字典
    for info in info_list:
        # 使用info.get('name')获取当前字典中'name'键对应的值
        # get()方法在键不存在时返回None,避免引发KeyError异常
        name = info.get('name')
        
        # 使用info.get('age')获取当前字典中'age'键对应的值
        age = info.get('age')
        
        # 使用info.get('address')获取当前字典中'address'键对应的值(假设是一个字典)
        # 然后使用.get('city')获取'address'字典中'city'键对应的值
        city = info.get('address').get('city')
        
        # 打印当前字典中的'name'、'age'和'address'中的'city'值
        print(name, age, city)

练习2

某网站的测试数据如下 data.json, 需求,提取 json 文件中的 用户名,密码和预期结果, 组成如下格式: [(), (), ()] (自动化参数化需要的数据格式)

[
{
“desc”: “正确的用户名密码”,
“username”: “admin”,
“password”: “123456”,
“expect”: “登录成功”
},
{
“desc”: “错误的用户名”,
“username”: “root”,
“password”: “123456”,
“expect”: “登录失败”
},
{
“desc”: “错误的密码”,
“username”: “admin”,
“password”: “123123”,
“expect”: “登录失败”
}
]

  • 代码练习
# 导入json模块,用于处理JSON数据
import json

# 定义一个函数read_data,用于从JSON文件中读取数据并返回处理后的列表
def read_data():
    # 创建一个空列表new_list,用于存储处理后的数据
    new_list = []
    
    # 使用with语句打开名为'info3.json'的文件,并指定编码为utf-8
    # 'with'语句确保文件在使用后自动关闭,即使在处理过程中发生异常
    with open('info3.json', encoding='utf-8') as f:
        # 使用json.load()方法将文件中的JSON数据解析为Python对象(通常是列表或字典)
        # 这里假设'info3.json'文件包含一个JSON数组,解析后存储在data变量中
        data = json.load(f)
        
        # 遍历data中的每个元素,i代表列表中的每个字典
        for i in data:
            # 使用i.get('username')获取当前字典中'username'键对应的值
            username = i.get('username')
            
            # 使用i.get('password')获取当前字典中'password'键对应的值
            password = i.get('password')
            
            # 使用i.get('expect')获取当前字典中'expect'键对应的值
            expect = i.get('expect')
            
            # 将username、password和expect组成一个元组,并使用append()方法将其添加到new_list中
            new_list.append((username, password, expect))
    
    # 返回处理后的new_list
    return new_list

json的写入

文件对象.write(字符串) 是不能直接将python  的列表和字典作为 参数传递的。

如果想要将python 中的数据类型存为 json 文件,需要使用 json 提供的方法,所以我们在写入json文件时不再使用write。

  • 步骤
    1. 导报 import json
    2. 使用 (w)方式打开文件
    3. 写入内容,使用json.dump(python中的数据类型,也就是文件对象)

代码案例:

# 导入json模块,用于处理JSON数据
import json

# 定义一个包含元组的列表my_list,每个元组包含用户名、密码和登录结果
my_list = [('admin', '123456', '登录成功'), ('root', '123456', '登录失败'), ('admin', '123123', '登录失败')]

# 使用with语句打开名为'info4.json'的文件,模式为写入模式('w'),并指定编码为utf-8
# 'with'语句确保文件在使用后自动关闭,即使在处理过程中发生异常
with open('info4.json', 'w', encoding='utf-8') as f:
    # 将my_list列表写入JSON文件中
    # 以下是几种不同的json.dump()方法的使用方式:

    # 1. 最基本的写入方式
    # json.dump(my_list, f)
    # 这种方法会将my_list直接写入文件,但中文字符会以ASCII编码显示(如\u767b\u5f55\u6210\u529f)

    # 2. 确保中文字符直接显示,而不是以ASCII编码显示
    # json.dump(my_list, f, ensure_ascii=False)
    # 这种方法会将中文字符直接写入文件(如"登录成功"),而不是以ASCII编码显示

    # 3. 添加缩进,使JSON文件更具可读性
    # json.dump(my_list, f, ensure_ascii=False, indent=2)
    # 这种方法会将JSON数据格式化,每层缩进2个空格

    # 4. 添加缩进,每层缩进4个空格
    json.dump(my_list, f, ensure_ascii=False, indent=4)
    # 这种方法会将JSON数据格式化,每层缩进4个空格,使文件更易于阅读

异常

THE END
喜欢就支持一下吧
赞赏 分享