如何将命令行参数从 pytest 传递到代码

2024-03-03

我正在尝试将参数从 pytest 测试用例传递到正在测试的模块。例如,使用 main.pyPython 样板 https://www.python-boilerplate.com/py3+argparse+pytest,我可以从命令行运行它:

$ python3 main.py
usage: main.py [-h] [-f] [-n NAME] [-v] [--version] arg
main.py: error: the following arguments are required: arg
$ python3 main.py xx
hello world
Namespace(arg='xx', flag=False, name=None, verbose=0)

现在我尝试用 pytest 做同样的事情,使用以下 test_sample.py

(NOTE:main.py 需要命令行参数。但这些参数需要在特定测试中进行硬编码,它们不应该是 pytest 的命令行参数。 pytest 测试用例只需将这些值作为命令行参数发送给 main.main()。)

import main
def test_case01():
    main.main()
    # I dont know how to pass 'xx' to main.py,
    # so for now I just have one test with no arguments

并运行测试:

pytest -vs test_sample.py

此操作失败并显示错误消息。我尝试查看其他答案以寻求解决方案,但无法使用它们。例如,42778124 https://stackoverflow.com/questions/42778124建议创建一个单独的文件 run.py 这不是一个可取的事情。和48359957 https://stackoverflow.com/questions/48359957 and 40880259 https://stackoverflow.com/questions/40880259似乎更多地处理 pytest 的命令行参数,而不是将命令行参数传递给主代码。

我不需要 pytest 来获取命令行参数,这些参数可以在特定测试中进行硬编码。但这些参数需要作为参数传递给主代码。你能给我一个 test_sample.py,它用一些参数调用 main.main() 吗?


如果您无法修改签名main方法,您可以使用猴子补丁 https://docs.pytest.org/en/latest/monkeypatch.html用测试数据暂时替换参数的技术。示例:想象一下为以下程序编写测试:

import argparse


def main():
    parser = argparse.ArgumentParser(description='Greeter')
    parser.add_argument('name')
    args = parser.parse_args()
    return f'hello {args.name}'


if __name__ == '__main__':
    print(main())

从命令行运行它时:

$ python greeter.py world
hello world

测试main带有一些自定义数据的函数,monkeypatchsys.argv:

import sys
import greeter

def test_greeter(monkeypatch):
    with monkeypatch.context() as m:
        m.setattr(sys, 'argv', ['greeter', 'spam'])
        assert greeter.main() == 'hello spam'

当与参数化 https://docs.pytest.org/en/latest/parametrize.html技术,这允许轻松测试不同的参数而无需修改测试函数:

import sys
import pytest
import greeter

@pytest.mark.parametrize('name', ['spam', 'eggs', 'bacon'])
def test_greeter(monkeypatch, name):
    with monkeypatch.context() as m:
        m.setattr(sys, 'argv', ['greeter', name])
        assert greeter.main() == 'hello ' + name

现在您将获得三个测试,每个测试对应一个参数:

$ pytest -v test_greeter.py

...

test_greeter.py::test_greeter[spam] PASSED
test_greeter.py::test_greeter[eggs] PASSED
test_greeter.py::test_greeter[bacon] PASSED
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将命令行参数从 pytest 传递到代码 的相关文章

  • python37.dll 未链接到可执行文件中

    我用 python 扩展了 c 但可执行文件无法在未安装 python 的系统上运行 include C python h int main Py Initialize PyRun SimpleString print hello worl
  • 更改 Mac 上的默认 python 版本 - 安装 Biopython

    我的 Mac 预装了 python 2 7 作为默认的 python 版本 但是 许多软件包和软件不再支持该版本 我搜索了几个在线论坛 了解如何更改 mac 上的默认 python 版本 但是 它们似乎都不起作用 我还安装了最新版本的 py
  • re.findall结果的顺序有保证吗?

    返回的匹配列表是否为re findall总是与源文本中的顺序相同 是的 正如中所述re module docs https docs python org 2 library re html module contents 以字符串列表的形
  • 从数据框中删除所有非唯一行

    抱歉 这是我的第二篇文章 如果有什么不明白的地方请告诉我 我正在尝试删除所有有重复项的行 我已经尝试过keep False参数为drop duplicates 它只是没有做正确的事情 假设我的数据框看起来像这样 ORDER ID ITEM
  • 如何使用python中的turtle模块绘制颜色环

    我有下面的代码 它应该在一个圆圈周围绘制一圈颜色 但如果在移动到下一个之前打印和更改 8 次 则只有一种颜色 import turtle def drawCircle colorList radius for color in colorL
  • 如何在Python中将字符串转换为复数?

    我正在尝试将输入字符串转换为浮点数 但是当我这样做时 我不断收到某种错误 如下面的示例所示 gt gt gt a 3 3j gt gt gt b complex a Traceback most recent call last File
  • 安装pipenv导致pip3无法使用

    我安装了pipenv using pip3 install pipenv 这给了我错误ImportError cannot import name main 为了解决这个错误我遵循这些说明 https stackoverflow com q
  • python lxml 我如何在项目名称中使用标签?

    我需要使用项目的特殊名称构建 xml 文件 这是我当前的代码 from lxml import etree import lxml from lxml builder import E wp E wp tmp wp title print
  • 如何确定通过“from m import *”导入了什么?

    我正在对导入语句进行一些修补 我需要确切地知道哪些成员是由from m import 该文档似乎表明 当 all 不存在时 将导入所有不以下划线开头的成员 这在所有情况下都是正确的吗 我知道inspect getmembers dir an
  • 带参数和不带参数的 super() 有什么区别?

    我遇到了一个使用的代码super 方法有两种不同的方式 我不明白逻辑上有什么区别 我现在正在学习pygame模块 我有一个任务来创建一个类Ball它继承自Sprite这是一个来自pygame模块 如果我没记错的话 我遇到了这段代码 impo
  • Python 滚动文本模块

    我想使用scrolledtext模块创建一个ScrolledText小部件 以便在python中创建GUI 我已经成功创建了 ScrolledText 小部件 但是我无法向其添加水平滚动条 e3 ScrolledText window3 w
  • 使用 python 从 XSD 文件创建特定的 XML 文件

    我有一个现有的 xsd 架构 并且需要创建 希望使用 Python 带有一些特定输入的 XML 文件 最好的方法是什么 我尝试了 Element Tree 和 xmlschema 但我无法判断它们是否允许从已知的 XSD 架构开始生成 XM
  • 尝试导入 cv2(opencv-python) 包时出错

    我正在尝试使用 cv2 opencv python 包访问我的网络摄像头 当我尝试导入它时 出现此错误 Traceback most recent call last File server py line 6 in
  • 如何在文件中的行和列位置插入文本?

    我想在文件中特定行的特定列插入字符串 而不读取和重写整个文件 假设我有一个文件file txt How was the English test How was the Math test How was the Chemistry tes
  • 在 virtualenv 中通过 pip 安装 PyGObject [重复]

    这个问题在这里已经有答案了 我实际上正在将旧的 django 应用程序从 python2 7 升级到 python3 4 通过 pip 安装 pygobject 时 出现此错误 Collecting pygobject Using cach
  • Pygame 简单循环在 Mac 上运行速度非常慢

    E 在 OS X 和 Linux 上进行相同的测试后 我可以确认以下情况仅发生在 OS X 上 在 Linux 上 它实际上以 1000 fps 的速度运行 正如我碰巧想知道的那样 有什么解释吗 感谢 TextMate 我更喜欢在 Mac
  • 查找其他列表项中列表项的列表索引

    我有一个长字符串列表 我想获取与另一个列表中的字符串子字符串匹配的列表元素的索引 使用列表理解可以轻松检查列表项是否包含列表中的单个字符串 例如这个问题 https stackoverflow com questions 4843158 c
  • 用户在对话框中输入

    python 中是否有任何库可用于图形用户输入 我知道关于tk但我相信需要一些代码才能做到这一点 我正在寻找最短的解决方案 a input Enter your string here 取而代之的是 我想要一个对话框 以便用户可以在那里输入
  • Python 中字典的 enumerate()

    我知道我们用enumerate用于迭代列表 但我在字典上尝试过 但没有给出错误 CODE enumm 0 1 1 2 2 3 4 4 5 5 6 6 7 7 for i key in enumerate enumm print i key
  • 如何将目录导入为 python 模块

    如果有目录 home project aaa 我知道它是一个Python包 那么 我如何通过知道它的路径来导入这个模块 这意味着 我希望代码能够正常工作 aaa load module home project aaa 我知道的唯一方法是

随机推荐

  • Swift switch 语句中使用 `let` 时出现编译错误

    在 Swift 中 您可以使用范围运算符获取数组的切片 如下所示 let list String first middle last let cdr list 1 list endIndex assert cdr middle last 我
  • 如何从 JSON 对象流中获取第一个元素?

    Example name bar thing true new key 0 name baz thing false new key 0 如果我跑 name我得到的输出为 bar baz 我想要的只是bar 您可以使用first 1 htt
  • 带有文档的 Maven 发布

    我正在尝试将文档包含到 Maven 发布中 该出版物本身运作良好 我还可以使用以下设置将源和 javadoc 发布到 gitlab 包 我可以下载并打开包含这些类的注释 文档的javadoc jar 和sources jar 然而 当我将该
  • 如何使用 FXML 在 JavaFX 中动态创建选项卡?

    如何使用 JavaFX FXML 创建新选项卡 我已经在 FXML 中创建了一个选项卡 但我想单击一个按钮来显示一个新选项卡 这是我的 FXML
  • MySQL如何更改innodb日志文件大小

    根据mysql文档 Docs http dev mysql com doc refman 5 5 en innodb data log reconfiguration html 为了在步骤 4中更改innodb log file size
  • 一个普通的类可以实现多个接口吗?

    我知道接口之间的多重继承是可能的 例如 public interface C extends A B Where A B and C are Interfaces 但是是否可以让一个常规类继承多个接口 如下所示 public class A
  • 有什么方法可以区分未设置的属性和设置为未定义的属性吗? [复制]

    这个问题在这里已经有答案了 说我有对象testObject a undefined 如果我那么console log testObject a 我变得不确定 但如果我也会发生同样的情况console log testObject b 它不存
  • Excel - 多列求和

    如果同一行中的其他单元格符合预定义的条件 我需要对几列的值求和 仅 3 列的工作公式如下 SUM SUMIFS Sheet1 W W Sheet1 B B Sales Sheet1 C C gt 4 SUMIFS Sheet1 X X Sh
  • Plupload - 仅限一个文件

    我在 plupload API 文档中没有看到有关将上传文件数量限制为任意数量 甚至是 1 的选项 博士失败了 或功能失败 如果它不存在 如果有人需要它 我会努力实现这一点 这是一个功能失败 我围绕 jQuery API 做了一个包装器 这
  • GNU Awk 4.2 中 FS = " " 的行为是什么?

    The first week of October Arnold Robbins announced Beta release of gawk 4 2 0 now available in the GNU announce bug gawk
  • Rails,如何在绝对最低级别访问原始请求数据?

    铁轨什么时候出request请求生命周期中最早可用的对象 本质上 请求何时首次作为请求对象可用 以及在哪个对象中 ActionDispatch 您可以从以下位置访问请求参数吗Tester Application 如果是这样 怎么办 如果没有
  • 在 docker 容器中导入 keycloak 的领域配置时出错

    我通过以下命令在 docker 上部署了 keycloak docker run e KEYCLOAK ADMIN admin e KEYCLOAK ADMIN PASSWORD admin p 8080 8080 quay io keyc
  • ReferenceError:Rx 未定义

    我刚刚开始学习 Angular2 我正在尝试使用 Angular2 做 RxJ 示例 如果有人帮助我 我将不胜感激 RxJs 代码 var obs Rx Observable interval 500 take 5 do i gt cons
  • Linq 到对象

    我有两个来自不同服务器的数据库 我无法链接数据库 从数据库中检索数据如下 DB1 Client ID Engagement ID 启用说明 600 10 真实公司1 600 20 虚假公司2 700 10 真实公司3 DB2 Client
  • Fortran 95 数组中具有一维变量的二维数组

    我想在代码中将一些内容存储在二维数组中 然后想扫描该数组 有N 1 行 第一个索引的数量 比如说i 在数组中 然而 对于给定值i 数量j尽管我知道最大可能值 但值不是固定的j 说它是N 2 我当然可以创建大小的数组 N 1 N 2 来存储我
  • IIS会回收asp.net core进程吗?

    我需要在我的 asp net core 应用程序中运行长时间运行的后台任务 我了解 Azure Webjobs 和其他进程外技术 但我宁愿保持解决方案简单并直接在 asp net core 进程中运行这些任务 我使用 Kestrel 该应用
  • 使 VSCodium 的 python 代码突出显示等于 VSCode

    因为 微软不好 而从 VSCode 迁移到 VSCodium 发展python应用程序似乎缺少一些代码颜色 例如 Dark 主题中绿松石色的模块或浅蓝色的局部变量 在下面的比较中可见 Left VSCodium Right VSCode 正
  • 如何在Android中读取彩信数据?

    我想读取彩信数据 我已经在中看到了零件表mmssms db彩信条目的存储位置 我正在使用光标 我想知道合适的URI 我正在使用 content mms sms conversations 并且列名称图像的 地址 发送至 文本 或 主题 和
  • 在 C# 中比较两个结构体的值

    我不是在寻找返回 bool 的两个结构的比较 我想知道是否有一种方法可以获取两个结构的哪些字段 相同的结构 但可能不同的值 是不同的 基本上我想要一种更简单的方法来执行以下操作 public class Diff public String
  • 如何将命令行参数从 pytest 传递到代码

    我正在尝试将参数从 pytest 测试用例传递到正在测试的模块 例如 使用 main pyPython 样板 https www python boilerplate com py3 argparse pytest 我可以从命令行运行它 p