Python文件操作

步骤

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

1.打开文件

open(需要自己手动关闭文件)

1
2
3
4
5
6
打开文件:从磁盘读取到内盘
open(file, mode='r',encoding=None)
file:要打开的文件,类型是字符串,文件路径是绝对路径(根目录开始)或者相对路径,建议使用相对路径
mode: r是只读文件 w是只写文件 a是追加打开(末尾追加)
encoding: 编码方式 utf-8(3字节的二进制) gbk(2字节二进制)
返回值是文件的对象,后续对文件进行操作

with open(不需要书写手动关闭文件的代码)

1
2
3
with open (file,mode='r',encoding=None) as file
file.write()
出了缩进就会关闭

2.读或写文件

写文件

1
2
前提 mode=w 或者 a
文件对象.write('写入文件内容')

读文件

1
2
前提 mode=r
文件对象.read('写入文件内容')

按行读取

1
2
3
4
5
6
7
with open (b.txt,encoding='utf-8') as f:
while True:
buf = f.readline()
if len(buf)==0:
break;
else:
print(buf,end='')

3.关闭文件

1
对象.close()

JSON文件的处理

读取json文件

1
2
3
4
5
6
1.导包 import json
2.读打开文件
3.读文件
json.load(文件对象)

返回的是字典(单个对象)或者数组(多个对象)
1
2
3
4
5
6
7
8
# 
{
"name" : "张三"
}
import json
with open (b.txt,encoding='utf-8') as f:
buf = json.load(f)
buf.get('name') #张三

写入json数据

1
2
3
4
5
6
1.导包
2.写打开文件
3.准备好数据

json.dump(list,f,ensure_ascii=False,indent=4)
ensure_ascii:直接显示中文 indent:显示缩进
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import json

file = '1x.json'
arr = [
{
"name": "zhangsan",
"age": 18
},
{
"name": "zhangsan1",
"age": 19
}
]
with open(file,'w',encoding='utf-8') as f:
# buf = json.load(f)
# print(buf.get('age'))
json.dump(arr,f,ensure_ascii=False,indent=4)

异常

1
2
3
4
5
6
7
8
try:
可能出现异常的代码
except 异常类型1
(except Exception as 变量:)
发生其他类型的异常,执行代码
else: 没发生其他类型的代码
finally:
不管有没有发生都会执行

模块导入

1
2
import random  as rd
from random import randint from 模块名 import 工具名

UnitTest框架

断言:帮助我们查看实际结果和预期结果是否一致

UnitTest基本组成

1
2
3
4
5
TestCase:(测试用例)单个测试用例文件
TestSuite(测试套件):有多个测试用例文件,将多个TestCase一起打包、组装
TestRunner:用来执行TestSuite的
TestLoader:测试加载,对TestSuite增强
Fixture: 测试代码结构,将共同的操作放到这个代码里面

TestCase(测试用例)

是一个代码文件,来书写真正的用例代码

步骤

1
2
3
4
1.导包 import unitTest
2.自定义测试类(继承TestCase)
3.在测试类中书写测试方法(必须以test_开头)
4.执行测试用例

TestSuite & TestRunner

步骤

1
2
3
4
5
6
7
8
9
10
11
12
1.导包 import unittest
2.创建套件对象
suite = unittest.TestSuite()
3.使用套件对象添加用例方法 复制粘贴导包
方式一:
suite.addTest(测试类('测试方法')) # 一次只能添加一个测试方法
方式二:
suite.addTest(unittest.makeSuite(测试类名)) # 一次添加测试类中的所有测试方法 makeSuite可能会出错拼写
4.实例化运行对象
runner = unittest.TextTestRunner()
5.利用运行对象去执行套件对象
runner.run(suite)

案例

jw_01_test.py (TestCase)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import unittest
from tools import add


class TestAdd(unittest.TestCase):
def test_method01(self):
if add(1,2)==3: #判断实际结果和预期结果相同
print('测试通过')
else:
print('测试不通过')
def test_method02(self):
if add(2,2)==4: #判断实际结果和预期结果相同
print('测试通过')
else:
print('测试不通过')
def test_method03(self):
if add(1,3)==4: #判断实际结果和预期结果相同
print('测试通过')
else:
print('测试不通过')

tools.py

1
2
def add(a,b):
return a+b

jw_01_test_runner.py (TestSuite && TestRunner)

1
2
3
4
5
6
7
8
import unittest
from jw_01_test import TestAdd

unit = unittest.TestSuite()
unit.addTest(unittest.makeSuite(TestAdd))

runner = unittest.TextTestRunner()
runner.run(unit)

TestLocader(测试加载)

并对TestSUite功能补充;可以帮助我们指定加载哪些用例

步骤

1
2
3
4
1.导包
2.实例化测试加载对象并添加用例 -->得到的是suite对象
3.实例化运行对象
4.运行对象执行

可以将用例放到case文件夹中,通过loader加载路径中的文件(可以用通配符)

1
2
3
4
5
6
7
8
9
10
"TestLoader的使用"
import unittest

# 实例化加载对象并添加用例
# unittest.TestLoader().discover('用例所在的路径','用例的代码文件名') 相对路径 *
suite = unittest.TestLoader().discover('./case','jw*.py') #suite

# 实例化运行对象
runner = unittest.TextTestRunner()
runner.run(suite)

FixTure(测试夹具)

1
2
3
是一种将用例中,通用的代码逻辑进行封装

在某些特定情况下会自动执行

方法级别

1
每个测试方法执行前后都会自动调用的调用
1
2
3
4
5
6
7
8
#方法之前
def setUp(self):
每个测试方法执行之前执行
pass
#方法之后
def tearDown(self):
每个测试方法执行之后执行
pass

类级别

1
2
3
4
5
6
7
8
9
10
11
每个类执行前后被调用

#方法之前
@classmethod
def setUpClass(self):
每个类执行之前执行
pass
#方法之后
def tearDownClass(self):
每个类执行之后执行
pass

模块级别(了解)

1
2
模块:代码文件
在每个代码文件执行前后执行结构
1
2
3
4
5
6
7
#模块级别需要在类的外面直接定义函数
#代码文件之前
def setUpMoudle(self):
pass
#方法之后
def tearDownMoudle(self):
pass

断言

1
断言:让程序来代替人工去判断测试程序执行结果是否和预期一致

assertEqual

1
2
3
self.assertEqual(预期结果,实际结果) # 判断两者是否相等
1.相等,用例通过
2.不想等,用例不通过,抛出异常

assertIn

1
2
3
4
5
6
7
self.assertIn(预期结果,实际结果) #预期结果是否包含在实际结果中
1.包含,用例通过 连续
2.不包含,不通过,抛出异常

assertIn('admin','admin') √
assertIn('admin','adminnnnn') √

参数化

1
2
3
4
5
6
7
8
9
在测试方法中,使用变量来代替具体的测试数据,然后使用传参的方法将测试数据传递给方法的变量
好处:相似的代码不需要多次书写

场景:
1.测试数据在json中
2.使用代码读取json文件,提取我们想要的数据 -->[(),()]

安装插件
pip install parameterized
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import unittest
from parameterized import parameterized

from tools import add

# 组织测试数据
data = [
(3, 4, 7),
(4, 2, 6),
(3, 2, 5)
]

class TestLogin(unittest.TestCase):
# 使用装饰器的形式传参,在不改变原有方法对其进行改变
@parameterized.expand(data)
def test_login(self, a, b, expect): #参数要和data中的数据顺序保持一致
self.assertEqual(expect, add(a, b))

跳过测试用例

1
2
跳过:@unittest.skip('跳过原因')
条件跳过:@unittest.skipIf(满足跳过条件,'跳过原因')

测试报告

1
2
3
4
5
6
7
8
9
TextTestRunner (自带的) 只有单独运行TestCase的代码,才会生成测试报告

HTMLTestRunner (第三方运行对象)

步骤:
1.获取测试运行类模块,将其放在代码的目录中
2.导包 unittest
3.使用套件对象,加载对象,去添加用例方法
4.实例化第三方的运行对象,并运行套件对象

image-20240528190435058

1
2
3
4
5
6
7
8
9
10
11
import unittest

from HTMLTestRunner import HTMLTestRunner

suite = unittest.defaultTestLoader.discover('.','jw_01_test.py')

file = 'f1.html'
with open(file, 'wb') as f:
# 2:详细 标题:测试报告 python版本
runner = HTMLTestRunner(f,2,'测试报告','python 3.6.8')
runner.run(suite)

中文组装生成测试报告

image-20240528190623532

1
2
3
4
5
6
7
8
9
10
11
import unittest

from HTMLTestRunnerCN import HTMLTestReportCN

suite = unittest.defaultTestLoader.discover('.','jw_01_test.py')

file = 'f1.html'
with open(file, 'wb') as f:
# 2:详细 标题:测试报告 python版本
runner = HTMLTestReportCN(f)
runner.run(suite)

pytest流程

image-20240528190531039

wb方式:二进制写的方式打开文件


文章作者: 是小康呀~
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 是小康呀~ !
评论
 上一篇
2024-05-28 是小康呀~
下一篇 
Freemarker和MinIO存储博客文章 Freemarker和MinIO存储博客文章
运用 Freemarker 模板引擎为文章生成静态文件,将文件存放在分布式文件系统 MinIO 中,以及 Non-XML response from server问题的解决
2024-05-20
  目录