使用 pytest 在子文件夹中进行测试

2024-03-26

我正在使用 python pytest 来运行我的单元测试。 我的项目文件夹是:

Main- 包含数据文件:A.txt

Main\Tests- 我运行 pytest 的文件夹

Main\Tests\A_test- 包含测试文件的文件夹

A_test文件夹中的测试使用该文件A.txt(位于主文件夹中)。

我的问题是,当我运行 py.test 时,测试失败,因为它找不到A.txt.

我发现是因为pytest使用了路径Main\Test运行测试时而不是将路径更改为Main\Tests\A_test(我打开时使用相对路径A.txt在测试文件内)

我的问题:有没有办法让 pytest 将目录更改为它为每个测试执行的测试的文件夹?这样测试中的相对路径仍然有效?

还有其他通用方法可以解决吗? (我不想将所有内容更改为绝对路径或类似的东西,这也是一个例子,在现实生活中我有数百个测试)。

谢谢你,

Noam


选项 A — 最小解决方案

在项目的根目录下,创建一个名为tests.py其中包含以下内容

import os, pathlib
import pytest

os.chdir( pathlib.Path.cwd() / 'Tests' )

pytest.main()

然后你可以使用命令python tests.py运行测试。


选项 B — 使用批处理/bash 测试运行程序

对于那些喜欢使用batch/bash运行脚本的人,我们可以更改batch/bash中的目录,然后调用运行pytest框架的Python脚本。为此,请在项目文件夹中创建以下脚本。

test.bat(适用于 Windows)

@echo off

cd /d %~dp0Tests
python %~dp0Tests/runner.py %*
cd /d %~dp0

test.sh(对于Linux)

cd $PWD/Tests
python runner.py $@
cd $PWD

然后在 Tests 文件夹中创建一个名为跑步者.py与以下

import pathlib, sys
import pytest

cwd = pathlib.Path.cwd()

# Add the project's root directory to the system path
sys.path.append(str( cwd.parent ))

# This is optional, but you can add a lib directory 
# To the system path for tests to be able to use
sys.path.append(str( cwd / 'lib' ))

pytest.main()

如果您的目录结构在 Tests 文件夹中包含某种类型的 lib 文件夹,我们可以通过创建一个pytest.ini配置文件包含以下内容。

[pytest]
norecursedirs = lib

在这种情况下,您的目录/文件结构最终将是:

root
├── test.bat
├── test.sh
├── Main
└── Tests
    ├── runner.py
    ├── pytest.ini # Optional pytest config file
    ├── lib # Optional, contains helper modules for the tests
    ├── tests # Tests go here
    └── # Or, in the OPs case, you could also place all of your tests here

补充评论

上面的方法不是运行 pytest 的典型方法,但我更喜欢使用pytest.main()因为它使我们能够:

  • 有任何目录结构。
  • 在测试运行程序启动之前执行代码。
  • 您仍然可以传入命令行选项,它的行为与您运行pytest直接命令。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 pytest 在子文件夹中进行测试 的相关文章

随机推荐

  • typeorm - 如何向“多对多”表添加额外字段?

    例如 3 tables user user business lines business line business line 那些创建者typeorm与声明User ManyToMany type gt BusinessLine Joi
  • Firebase 仅部署函数流程

    如果我有两个 Firebase 函数 fire1 and fire2 共享一个辅助函数 doSum 将部署firebase deploy only functions fire1改变环境fire2 不 每个功能彼此完全独立 每个已部署的函数
  • 如何使用 grpc 修复 python 中的“类型错误:不允许位置参数”

    我正在使用 Ubuntu 18 04 3 LTS x64 在 python 中使用 grpc 设置微服务 我尝试改变分配参数的方式 从我的 protoc 文件重新生成代码 客户代码 class Cliente def IniciarClie
  • ie6中缺少div高度的解决办法

    我正在使用一个空 div 通过设置来显示一行高度 3 像素 它在所有浏览器中都能正常工作 但在ie6显示的高度 div20 像素高度 即使对于 height 0px 它也保持不变 但其他属性的变化反映但不反映高度 并且没有重复的 CSS 条
  • 总结树上的值

    我使用树控件来查看一些基于嵌套 父子 表的分层项目 每个节点都有一个 NameValue 格式 接受 name 和 value 但只有叶子 最后一个节点 具有整数值 并且父节点的值保留为空 仅是它们具有的名称 我想总结值 以便每个父节点都保
  • 获取 PostgreSQL 中一个月前的时间戳

    我有一个 PostgreSQL 数据库 其中一个表快速增长得非常大 大约每月几百万行 因此我想定期将该表的内容存档到一个单独的表中 我打算使用 cron 作业每晚执行 sql 文件 将超 过一个月的所有行存档到另一个表中 我的查询工作正常
  • 如何使用 iOS WKWebView 注入 JavaScript 回调来检测 onclick 事件?

    我正在使用一个WKWebView显示一个包含三个按钮的 HTML 的网站 我想在单击特定按钮时在本机应用程序中运行一些 Swift 代码 关于 HTML 这三个按钮如下所示
  • 如何使用node.js从蓝牙设备接收数据

    我是 javascript 和 node js 的新手 目前从事医疗项目 首先我将解释我的工作 我必须从蓝牙设备接收数据 正常血压率 脉搏率 并使用 node js 在 Web 应用程序中显示读数 我不知道如何从蓝牙设备 病人监护仪 接收数
  • 管理用户对 ASP.NET 中页面的访问

    我正在使用 MembershipProvider 目前有 3 个角色 用户 超级用户 管理员 另外 我还有只有管理员和超级用户才能看到的页面 对于这些页面 我使用 Web 配置中的配置
  • 如果第一个“return”之后有一个“else”,那么性能是否重要?

    我现在看到了两种不同的方法来创建布尔返回方法 bool Case1 if A return true else return false bool Case2 if A return true return false 哪一个更快 不写还有
  • Symfony2:动态生成嵌入表单

    Symfony2 有可能表格动态生成 http symfony com doc current cookbook form dynamic form modification html cookbook form events submit
  • 八叉树邻居搜索

    我有一个八叉树 它存储基于体素的流体 当我模拟流体时 我需要访问当前节点周围的叶子 如何实现这样的搜索 您可以假设该节点存储了一个指向其父节点的指针 也许还需要其他数据 假设每个八叉树节点还保存其在八叉树中的 3D 索引 1 及其深度 生成
  • kube proxy日志无法打开服务Nodeport

    服务类型 节点端口 问题 无法访问 clusterIP Nodeport 并找到 kube proxy pod 日志 如下所示 无法打开端口 跳过它 err listen tcp4 32060 bind 地址已在使用中 port Descr
  • 当我尝试通过 CLI 部署 Azure 云服务时,“对象引用未设置为对象的实例”

    我在 Azure PowerShell 中运行以下命令来部署我的节点项目 Publish AzureServiceProject ServiceName
  • 移动没有历史记录的 Subversion 存储库

    有很多关于使用版本历史记录移动 Subversion 历史记录的帖子 但我想做一些不同的事情 基本上 我们有一个已用作概念证明的存储库 我们希望将其存档 然而 我们想要创建一个新的存储库 其中包含一些代码的最新版本 但保存了作者历史记录 但
  • 使用 ref 并拥有 ProxyComponent 时如何访问实际组件

    我们有一个对 React 组件的引用 并且想要调用该组件的方法 当使用 ref 时 它是一个 ProxyComponent 对象 我如何将它用作我的实际组件 或者如何才能做到这一点 我看到 有属性 renderedElement 并且在属性
  • 如果选择“图像/文件”,Laravel 会验证字段吗?

    我有一个 图像 字段 类型是file并且只需要验证是否选择了图像 这意味着它也可以为空 我试过这样 avatar gt mimes jpeg jpg png gif max 100000 但这也是必需的 我仍然尝试使用参数present a
  • EF 4.3.1 与 VS 2011

    我需要知道是否可以开始在 VS 2011 中使用最新版本的 EF 4 3 1 而无需按照所述安装这些 CTP 组件here http blogs msdn com b adonet archive 2011 06 30 announcing
  • postgis如何处理使用不同SRID发送的坐标

    我正在运行 django 应用程序 并且我正在为我的数据库使用 PostGis 扩展 我试图更好地了解发送坐标时幕后发生的情况 特别是因为我正在使用转换为不同 SRID 的不同坐标系 我的问题有三个 在数据库中创建点或多边形时 django
  • 使用 pytest 在子文件夹中进行测试

    我正在使用 python pytest 来运行我的单元测试 我的项目文件夹是 Main 包含数据文件 A txt Main Tests 我运行 pytest 的文件夹 Main Tests A test 包含测试文件的文件夹 A test文