1. 相关的fixture

1.1. tmp_path

tmp_path是一个用例级别的fixture,其作用是返回一个唯一的临时目录对象(pathlib.Path);

我们看下面的例子:

# src/chapter-6/test_tmp_path.py

CONTENT = "content"

def test_create_file(tmp_path):
d = tmp_path / "sub"
d.mkdir() # 创建一个子目录
p = d / "hello.txt"
p.write_text(CONTENT)
assert p.read_text() == CONTENT
assert len(list(tmp_path.iterdir())) == 1 # iterdir() 迭代目录,返回迭代器
assert 0 # 为了展示,强制置为失败

执行:

λ pipenv run pytest -q -s src/chapter-6/test_tmp_path.py
F
==================================== FAILURES =====================================
________________________________ test_create_file _________________________________ tmp_path = WindowsPath('C:/Users/luyao/AppData/Local/Temp/pytest-of-luyao/pytest-4/test_create_file0') def test_create_file(tmp_path):
d = tmp_path / "sub"
d.mkdir() # 创建一个子目录
p = d / "hello.txt"
p.write_text(CONTENT)
assert p.read_text() == CONTENT
assert len(list(tmp_path.iterdir())) == 1 # iterdir() 迭代目录,返回迭代器
> assert 0 # 为了展示,强制置为失败
E assert 0 src\chapter-6\test_tmp_path.py:32: AssertionError
1 failed in 0.06s

可以看出:

  • tmp_path在不同的操作系统中,返回的是不同类型的pathlib.Path对象,这里Windows系统下返回的是WindowsPath对象,它是Path的子类对象;
  • Path对象可以使用/操作符代替常用的os.path.join()的方法;更多关于pathlib的使用方法可以查看:https://docs.python.org/3.7/library/pathlib.html

1.2. tmp_path_factory

tmp_path_factory是一个会话级别的fixture,其作用是在其它fixture或者用例中创建任意的临时目录;

查看上一章tmp_path fixture的源码,我们能够看到tmp_path就是使用tmp_path_factory的一个例子:

# _pytest.tmpdir

@pytest.fixture
def tmp_path(request, tmp_path_factory):
"""Return a temporary directory path object
which is unique to each test function invocation,
created as a sub directory of the base temporary
directory. The returned object is a :class:`pathlib.Path`
object. .. note:: in python < 3.6 this is a pathlib2.Path
""" return _mk_tmp(request, tmp_path_factory) @pytest.fixture(scope="session")
def tmp_path_factory(request):
"""Return a :class:`_pytest.tmpdir.TempPathFactory` instance for the test session.
"""
return request.config._tmp_path_factory

可以看出:

  • tmp_path调用了tmp_path_factory

  • tmp_path_factory返回一个_pytest.tmpdir.TempPathFactory对象;

  • 进一步查看_mk_tmp的源码:

    def _mk_tmp(request, factory):
    name = request.node.name
    name = re.sub(r"[\W]", "_", name)
    MAXVAL = 30
    name = name[:MAXVAL]
    return factory.mktemp(name, numbered=True)

    可以看出,tmp_path最终调用了TempPathFactory.mktemp()方法,它返回的是一个pathlib.Path对象;

1.3. tmpdir

tmp_path是一个用例级别的fixture,其作用是返回一个唯一的临时目录对象(py.path.local),它提供os.path的方法;

上面的例子也可以修改成如下这样:

# src/chapter-6/test_tmpdir.py

CONTENT = "content"

def test_create_file(tmpdir):
p = tmpdir.mkdir("sub").join("hello.txt") # 创建子文件夹,并新建文件
p.write(CONTENT)
assert p.read() == CONTENT
assert len(tmpdir.listdir()) == 1 # iterdir() 迭代目录,返回列表
assert 0 # 为了展示,强制置为失败

执行:

λ pipenv run pytest -q -s src/chapter-6/test_tmpdir.py
F
==================================== FAILURES =====================================
________________________________ test_create_file _________________________________
tmpdir = local('C:\\Users\\luyao\\AppData\\Local\\Temp\\pytest-of-luyao\\pytest-6\\test_create_file0') def test_create_file(tmpdir):
p = tmpdir.mkdir("sub").join("hello.txt") # 创建子文件夹,并新建文件
p.write(CONTENT)
assert p.read() == CONTENT
assert len(tmpdir.listdir()) == 1 # iterdir() 迭代目录,返回列表
> assert 0 # 为了展示,强制置为失败
E assert 0 src\chapter-6\test_tmpdir.py:30: AssertionError
1 failed in 0.06s

其实,tmpdir也调用了tmp_path,只是对返回值做了一次py.path.local()封装:

# _pytest.tmpdir

@pytest.fixture
def tmpdir(tmp_path):
"""Return a temporary directory path object
which is unique to each test function invocation,
created as a sub directory of the base temporary
directory. The returned object is a `py.path.local`_
path object. .. _`py.path.local`: https://py.readthedocs.io/en/latest/path.html
"""
return py.path.local(tmp_path)

1.4. tmpdir_factory

tmpdir_factory是一个会话级别的fixture,其作用是在其它fixture或者用例中创建任意的临时目录;

假设,一个测试会话需要使用到一个很大的由程序生成的图像文件,相比于每个测试用例生成一次文件,更好的做法是每个会话只生成一次:

import pytest

@pytest.fixture(scope="session")
def image_file(tmpdir_factory):
img = compute_expensive_image()
fn = tmpdir_factory.mktemp("data").join("img.png")
img.save(str(fn))
return fn def test_histogram(image_file):
img = load_image(image_file)
# compute and test histogram

1.5. 区别

fixture 作用域 返回值类型
tmp_path 用例级别(function) pathlib.Path
tmp_path_factory 会话级别(session) TempPathFactory
tmpdir 用例级别(function) py.local.path
tmpdir_factory 会话级别(session) TempDirFactory

2. 默认的基本临时目录

上述fixture在创建临时目录时,都是创建在系统默认的临时目录(例如:Windows系统的%temp%目录)下;你可以通过指定--basetemp=mydir选项自定义默认的基本临时目录;

λ pipenv run pytest -q -s --basetemp="/d/temp" src/chapter-6/test_tmpdir.py
F
==================================== FAILURES =====================================
________________________________ test_create_file _________________________________
tmpdir = local('D:\\temp\\test_create_file0') def test_create_file(tmpdir):
p = tmpdir.mkdir("sub").join("hello.txt") # 创建子文件夹,并新建文件
p.write(CONTENT)
assert p.read() == CONTENT
assert len(tmpdir.listdir()) == 1 # iterdir() 迭代目录,返回列表
> assert 0 # 为了展示,强制置为失败
E assert 0 src\chapter-6\test_tmpdir.py:30: AssertionError
1 failed in 0.04s

GitHub仓库地址:https://github.com/luizyao/pytest-chinese-doc

6、pytest -- 临时目录和文件的更多相关文章

  1. QTemporaryDir及QTemporaryFile建立临时目录及文件夹

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:QTemporaryDir及QTemporaryFile建立临时目录及文件夹     本文地址 ...

  2. QTemporaryDir及QTemporaryFile建立临时目录及文件夹(创建一个随机名称的目录或文件,两者均能保证不会覆盖已有文件)

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址:本文标题:QTemporaryDir及QTemporaryFile建立临时目录及文件夹     本文地址: ...

  3. UWP开发之Template10实践二:拍照功能你合理使用了吗?(TempState临时目录问题)

    最近在忙Asp.Net MVC开发一直没空更新UWP这块,不过有时间的话还是需要将自己的经验和大家分享下,以求共同进步. 在上章[UWP开发之Template10实践:本地文件与照相机文件操作的MVV ...

  4. Pytest权威教程08-使用tmp目录和文件

    目录 使用tmp目录和文件 tmp_path Fixture方法 tmp_path_factory Fixture方法 tmpdir Fixture方法 tmpdir_factory Fixture方 ...

  5. File根据inputstream复制文件到临时目录,使用完之后删除

    项目中有这个需求: 1)上传文件通过公司平台的校验,校验成功后,通过接口,返回文件流: 2)我们根据这个文件流进行操作.这里,先将文件流复制文件到项目临时目录WEB-INF/temp;文件使用完毕,删 ...

  6. Springboot上传文件临时目录无效

    一个奇葩问题,虽然解决了,但还是没弄清楚,小记一笔. 年后回来,测试人员对年前的3次迭代的功能进行了回归测试,然后发现所有excel导入的功能都失效了.作为后台开发人员,当然是第一时间打开运行日志排查 ...

  7. npm下载文件临时目录、实际存放目录路劲

    npm 下载文件临时存放目录 路劲:C:\Users\xxxxxx\AppData\Roaming\npm\node_modules ( C:\Users\dihongwanyan\AppData\R ...

  8. Spring boot内置Tomcat的临时目录被删除导致文件上传不了-问题解析

    目录 1.问题 2.1. 为什么需要使用这个/tmp/tomcat*? 2.2.那个 /tmp/tomcat* 目录为什么不存在? 三.解决办法 修改 springboot 配置,不要在/tmp 下创 ...

  9. 【Visual Lisp】驱动器、目录、文件和注册表

    ;;驱动器.目录.文件.和注册表;;★★★01.获取并创建驱动器盘符组成的表★★★(setq Drives (vlax-get-property (vlax-create-object "S ...

随机推荐

  1. 基于hap的文件上传和下载

    序言 现在,绝大部分的应用程序在很多的情况下都需要使用到文件上传与下载的功能,在本文中结合hap利用spirng mvc实现文件的上传和下载,包括上传下载图片.上传下载文档.前端所使用的技术不限,本文 ...

  2. Kubernetes 系列(四):使用Traefik访问.net core api

    一. 准备 本篇的要求是在前三篇的基础上已经搭建好的本地k8s以及部署了Traefik,我们将会使用Traefik Ingress来访问.net core api,比较简单,做个记录,如果还没有搭建k ...

  3. latex转word公式 java (latextoword,latex_word,latex2word,latex_omml)

    latex_word 主要目的:     给大家分享一个我的原创作品:latex转为word公式(omml)工具 [java] 此工具主要用于将含有latex公式的文本下载成word时,将latex转 ...

  4. 设计模式----创建型型模式之单件模式(Singleton pattern)

    单件模式,又称单例模式,确保一个类只有一个实例,并提供全局访问点. 单件模式是比较简单且容易理解的一种设计模式.只有一个实例,通常的做法...TODO 类图比较简单,如下所示: 示例代码: 懒汉模式( ...

  5. Cocos2d-x入门之旅[2]精灵

    精灵就是cocos是屏幕上移动的对象,能被我们控制,比如我们HelloWorld场景的这个图片就是精灵(Sprite) 怎么才算精灵?你能控制它的,就是一个精灵,否则就只是一个节点(Node) 准确的 ...

  6. Java基础-开篇

    之前在新浪博客写了不少springmvc的相关技术,但新浪博客毕竟不是专业的技术博客,添加代码很不方便,就开始在博客园试试了. 使用java开发也不少年了,准备再次整理一些java基础知识,当然,这次 ...

  7. App元素定位

    1.元素定位(采用Appium-desktop自带的工具) 1.1将初始化参数复制进去校验json格式正确且保存后,点击start session 初始化参数来源如下: # 定义启动设备需要的参数 d ...

  8. Spring Boot Actuator 整合 Prometheus

    简介 Spring Boot 自带监控功能 Actuator,可以帮助实现对程序内部运行情况监控,比如监控状况.Bean加载情况.环境变量.日志信息.线程信息等.这一节结合 Prometheus .G ...

  9. Java编程思想——第17章 容器深入研究 读书笔记(二)

    五.List的功能方法 排除Collection已包含的方法外还增加了 boolean addAll(int index, Collection<? extends E> c);从索引位置 ...

  10. 机器学习:不平衡信息有序平均加权最近邻算法IFROWANN

    一 背景介绍 不平衡信息,特点是少数信息更珍贵,多数信息没有代表性.所以一般的分类算法会被多数信息影响,而忽略少数信息的重要性. 解决策略: 1.数据级别 (1)上采样:增加稀有类成本数 (2)下采样 ...