Python文件操作
步骤
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.关闭文件
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: 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
suite = unittest.TestLoader().discover('./case','jw*.py')
runner = unittest.TextTestRunner() runner.run(suite)
|
FixTure(测试夹具)
1 2 3
| 是一种将用例中,通用的代码逻辑进行封装
在某些特定情况下会自动执行
|
方法级别
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 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): 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.实例化第三方的运行对象,并运行套件对象
|
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: runner = HTMLTestRunner(f,2,'测试报告','python 3.6.8') runner.run(suite)
|
中文组装生成测试报告
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: runner = HTMLTestReportCN(f) runner.run(suite)
|
pytest流程
wb方式:二进制写的方式打开文件