使用树状数据进行 pytest 嵌套参数化

2024-02-12

使用 pytest,我尝试测试像树一样的分层场景。 让我们以文档结构为例:

Document --- Chapter --- Paragraph
       1   n        1   n

当文档包含多个章节时;一章包含多个段落。

当开始测试新文档时,需要运行一些设置代码;当新的章节开始时,需要运行一些其他设置代码;段落也一样。

写成伪代码:

for doc in documents:
    setup_doc(doc)
    for chapter in doc.chapters:
        setup_chapter(chapter)
        for paragraph in chapter.paragraphs:
            setup_paragraph(paragraph)
            test_it(doc, chapter, paragraph)
            teardown_paragraph(paragraph)
        teardown_chapter(chapter)
    teardown_doc(doc)

如果我们有以下数据:

Document Alpha
   chapter A
      Paragraph A1
      Paragraph A2
   chapter B
      Paragraph B1

我希望收集的测试用例是:

test_it[Alpha, A, A1]
test_it[Alpha, A, A2]
test_it[Alpha, B, B1]

我尝试了 pytest_generate_tests、类场景、固定装置和参数化测试函数的不同组合,但未能实现这一点。

任何指示将不胜感激。


Pytest 装置应该是独立的。 因此,为了解决您的任务,您必须构建一个带有所有功能组合的简单列表(文档 - 章节 - 段落)的固定装置。

您可以使用返回此类列表的一个元素的简单固定装置来完成此操作,也可以在测试生成阶段生成此列表,如下面的代码所示。

documents = {
        'Alpha': {
            'A': {'A1': {},'A2': {}},
            'B': {'B1': {}}
        }
    }


def pytest_generate_tests(metafunc):
    """Documents tree from documents"""
    if 'document' in metafunc.fixturenames:
        documents_plain = []
        for document in documents.keys():
            for chapter in documents[document].keys():
                for paragraph in documents[document][chapter].keys():
                    documents_plain.append({'document': document, 'chapter': chapter, 'paragraph': paragraph})
        metafunc.parametrize(
            'document',
            documents_plain,
            scope='session')


def test_it(document):
    print('{}, {}, {}'.format(document['document'], document['chapter'], document['paragraph']))


py.test -s

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

使用树状数据进行 pytest 嵌套参数化 的相关文章

随机推荐

  • 如何将子 SKSpriteNode 放置在其父级内部

    我不太明白定位子节点的逻辑 假设我有一个矩形 如果我没有改变它的锚点 子节点默认会出现在中间 但例如如何将其放置在矩形的左上角呢 还是右下角 我试过 child zPosition 1 child position y rect size
  • Xcode 中的存档显示在“其他项目”下

    我正在尝试使用 存档 选项将应用程序提交到 iTunes Connect 为通用 iOS 设备构建 它通常显示在管理器中的 iOS 应用程序下 然而 现在它显示在 其他项目 下 但没有更整洁的版本和想法 我最后一次构建是在 10 月 28
  • 在 GWT 单元格表中添加超链接

    我正在尝试在单元格表中添加一个超链接 然后单击该链接我想调用一个方法 使用下面的代码 我在单元格表中正确获得了超链接 但我无法通过单击链接来调用方法 当我单击链接时 它会将我带到上一页 任何解决方案 Hyperlink link new H
  • Excel VBA - 将子菜单添加到自定义右键菜单

    看了很久了 第一次发海报 我有一个带有右键单击功能的表单 可以正常工作 我试图在主右键菜单中添加一个子菜单来分隔一些功能 命令 我需要 想要插入 选择案例 所在的部分 但是 它只显示顶部菜单 不知道从这里去哪里 任何帮助都是极好的 谢谢 附
  • Python读取DOT格式的文件并返回城市名称列表

    嘿大家好 问题是这样的 说实话 这是家庭作业问题 但我只是被困住了 而且已经永远了 我的问题是 由于城市在每行中都有不同的索引位置 我们如何逐行迭代并将城市名称返回到列表中 任何可以让我开始的帮助将不胜感激 我并不懒惰 我已经为此工作了几个
  • 如何从视频中提取方向信息?

    在网上浏览了大量文档后 iPhone 似乎总是以 480x360 的宽高比拍摄视频 并在视频轨道上应用变换矩阵 480x360 可能会改变 但对于给定设备来说始终相同 这是在 iOS 项目中修改 ffmpeg 源并访问矩阵的方法http w
  • python中pandas系列的地板还是天花板?

    我有一个熊猫系列series 如果我想获得元素级下限或上限 是否有内置方法或者我是否必须编写函数并使用 apply 我问是因为数据很大所以我很看重效率 此外 还没有针对 Pandas 包提出这个问题 您可以使用 NumPy 的内置方法来执行
  • App Engine Java API 页面大小

    为什么谷歌决定忽略pageSize参数以及为什么使用不同的页面大小时收集的项目的总体大小不同 这是一个例子 Appsactivity Activities List request service activities list setDr
  • 如何更改 UIView zPosition?

    我不明白如何更改视图的位置 我尝试这样做 但没有任何反应 void viewDidLoad super viewDidLoad UIView view UIView alloc initWithFrame CGRectMake 100 10
  • 如何使用 Clang 从 C++ 字符串生成 AST?

    我正在尝试使用 Clang 操作 C 源代码 但在发现 API 时遇到问题 我想获取一串 C 源代码并从中生成 AST 就像是 auto myAst clang parse auto x 1 1 有一个最小的工作示例吗 您可以尝试下一个代码
  • 为什么添加的子图层没有显示在屏幕截图中?

    我正在尝试找出 iPad 应用程序的某些 iOS 代码中的错误 在我们的一个视图中 我们添加了子图层以产生阴影并确保视图的底部具有圆角边缘 这是我们添加子层的代码 UIBezierPath maskPath UIBezierPath bez
  • 无效的路由名称,已在使用中:“admin_root”(ArgumentError)- ActiveAdmin 安装失败

    I ran rails g active admin install 并得到这个错误 Invalid route name already in use admin root ArgumentError You may have defin
  • 为什么java中所有对象都是动态创建的? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 在一次采访中我被问到为什么java中的对象是动态创建的 我不明白这个问题 有人可以解释一下吗 此人可能指的是 Java 不像 C 那样知道堆
  • PHP $_SESSION 变量键中的保留字符

    我正在查看 PHP 会话文件的内部表示 我注意到会话密钥由管道字符分隔 在讨论我遇到的问题之前 让我先快速介绍一下会话文件的格式 至少 这是它在我的 Mac 上的格式化方式 10 9 4 PHP 5 4 24 会话文件格式 假设我有以下代码
  • 使用 Javascript 平均时间

    我正在使用 Phonegap 和 JQuery 构建一个应用程序 该应用程序以该格式存储 使用 window localStorage 一组时间 不超过 10 个 HH MM SS mm 列表中有许多 零 时间 例如 00 00 00 00
  • extjs - 自动加载 true 的存储不应在应用程序启动时加载

    我有一个链接到商店的网格autoLoad true 问题是商店会在应用程序启动时加载 即使视图是稍后通过菜单访问时创建的 我已在 Application js 和视图中引用了该存储 但我没有显式地实例化存储或视图 我不知道如何实现仅在视图需
  • 将 TabActivity 菜单与包含的 Activity 菜单合并

    我的应用程序的主要活动是 TabActivity 它包含一个 OptionsMenu 我定义了一些其他活动 进入选项卡 并且我想在每个活动中定义一个菜单 并将其菜单与主菜单合并 是否可以 是的 这是可能的 基本上 您只需将多个 xml 文件
  • 一种用子类组织和加载文件的干净方法

    我有一个父类 它提供用于操作硬件的抽象函数 以及一个充满类的目录 该类是该父类的子类 并提供特定于硬件的实现 例如 x86 函数 ARM 函数 我正在寻找一种 Pythonic 方式来导入目录中的文件并实例化它们 目前 父类位于顶级目录中
  • TensorFlow RuntimeError:在 SavedModel 中找不到与标签服务关联的 MetaGraphDef

    当我使用 simple save 保存模型时 当我尝试加载模型时出现运行时错误 保存的代码是 session Session inputs tf placeholder dtype tf float32 shape None height
  • 使用树状数据进行 pytest 嵌套参数化

    使用 pytest 我尝试测试像树一样的分层场景 让我们以文档结构为例 Document Chapter Paragraph 1 n 1 n 当文档包含多个章节时 一章包含多个段落 当开始测试新文档时 需要运行一些设置代码 当新的章节开始时