前言
在平常测试当中,可能会有一些临时数据,比如输出信息、token、临时密码等数据需要临时保存和读取。那么pytest也提供了一个fixture来支持这种情况。
能够创建临时目录文件的有以下4个fixture:tmp_path、tmp_path_factory、tmpdir、tmpdir_factory
那么下面来介绍下
fixture示例
1、用例级的临时路径fixture:tmp_path
tmp_path是一个testcase级别的fixture,返回的是pathlib.path类型值,可以创建一个临时目录,主要用于一些临时文件或者临时数据的存放,同时创建pytest-N的目录,随着不断执行,N是会不断的自加1,但同时只保留最新的3个目录
保证之前执行的临时数据将被删除。tmp_path可以通过 "/" 来直接拼接临时目录和文件,但拼接的临时目录需要使用mkdir()方法进行创建。write_text()方法:创建临时文件并写入内容,read_text()方法:读取临时文件的内容
示例代码:
def test_create_file(tmp_path): print(f'tmp_path:{tmp_path}') #拼接临时文件目录路径 tmp_dir = tmp_path / 'test1' #创建临时路径文件夹 tmp_dir.mkdir() file = tmp_dir/ 'hello.txt' #创建临时文件并写入内容 file.write_text('hi,world') txt = file.read_text() assert file.read_text() == 'hi,world' assert len(list(tmp_path.iterdir())) == 1
输出结果:
打印出临时目录地址可以复制到文件管理器中进行访问查看临时文件的内容
2、测试会话级的临时路径fixture:tmp_path_factory
tmp_path_factory是一个session级别的fixture,返回的对象是TempPathFactory,可以设置session级别作用域的fixture上,每次执行只会创建一个临时目录,临时目录文件夹后也会自增+1。
在function级别的作用域下,每调用一次tmp_path_factory创建临时目录,就会自增,每个测试用例的临时目录互不影响。
tmp_path_factory.mktemp('文件夹名')创建临时目录,但支持单层目录创建,因为底层调用的也是mkdir()
临时文件则是通过 "/" 进行拼接,write_text():创建临时文件并写入内容,read_text()方法:读取临时文件的内容
示例代码:
def test_create_file1(tmp_path_factory): print(f'tmp_path:{tmp_path_factory}') #拼接临时文件目录路径 file = tmp_path_factory.mktemp('test1') / 'hello.txt' print(file) #创建临时文件并写入内容 file.write_text('hi,world') txt = file.read_text() assert file.read_text() == 'hi,world'
输出结果:
3、测试用例级的临时路径fixture:tmpdir
tmpdir和tmppath的功能是一样的,唯一区别的是tmpdir返回的是py.path.local类型,而tmp_path返回的是pathlib.Path类型,tmpdir返回的值可以支持os.path的一些操作,同时tmpdir是一个testcase级别的fixture
mkdir():创建临时目录 join():拼接临时文件路径 write():向临时文件写入内容
示例代码:
def test_create_file(tmpdir): print(tmpdir) #拼接临时文件路径 p = tmpdir.mkdir('tmpdir').join('hello.txt') print(f'临时文件路径:{p}') p.write('hi,world') assert p.read() == 'hi,world' assert len(tmpdir.listdir()) == 1
输出结果:
4、测试会话级的临时路径fixture:tmpdir_factory
tmpdir_factory和tmp_path_factory功能也是一样的,返回的对象也是TempPathFactory,可以设置session级别作用域的fixture上,是一个session级别的fixture,一次执行只会创建一个临时文件夹
创建临时目录和创建临时文件等方法也和tmp_path_factory一样,但它比tmp_path_factory,既可以使用os.path.join()来拼接路径,也可以只是"/"来拼接路径
示例代码:
def test_create_file(tmpdir_factory): p = tmpdir_factory.mktemp('test1') / 'hello.txt' #p = tmpdir_factory.mktemp('demo01').join('hello.txt') print(f'临时文件路径:{p}') p.write('hi,world') assert p.read() == 'hi,world'
输出结果:
session作用域创建临时目录
既然都是fixture,那么肯定也可以设置在自定义的fixture中使用,像tmpdir_factory和tmp_path_factory这2个session级别fixture,通常设置在session作用域的自定义fixture中(全局配置conftest.py中)
示例代码:
import pytest @pytest.fixture(scope='session') def create_file2(tmp_path_factory): p = tmp_path_factory.mktemp('demo') / 'a.txt' print(f'tmp_file:{p}') p.write_text('hi,a') return p def test_01(create_file2): print(f'test_01的临时文件路径:{create_file2}') print(create_file2.read_text()) def test_02(create_file2): print(f'test_02的临时文件路径:{create_file2}') print(create_file2.read_text())
输出结果:
从打印可以看到,test_01和test_02读取的临时文件是一致的,表明session作用域的create_file2(fixture)在执行测试用例前只调用了tmp_path_factory的fixture一次,并返回TempPathFactory对象
注意:如果以上session作用域的fixture也只能用对应session级别的tmpdir_factory和tmp_path_factory。如果使用tmpdir和tmp_path两个function级别的fixture,则会报错,报错如下:
总结
标签:tmp,--,fixture,factory,pytest,临时文件,path,目录,tmpdir From: https://www.cnblogs.com/trystudy/p/17203287.html