当断言失败时继续 Python 的单元测试

2023-11-29

编辑:切换到一个更好的示例,并澄清为什么这是一个真正的问题。

我想用 Python 编写单元测试,当断言失败时继续执行,这样我就可以在单个测试中看到多个失败。例如:

class Car(object):
  def __init__(self, make, model):
    self.make = make
    self.model = make  # Copy and paste error: should be model.
    self.has_seats = True
    self.wheel_count = 3  # Typo: should be 4.

class CarTest(unittest.TestCase):
  def test_init(self):
    make = "Ford"
    model = "Model T"
    car = Car(make=make, model=model)
    self.assertEqual(car.make, make)
    self.assertEqual(car.model, model)  # Failure!
    self.assertTrue(car.has_seats)
    self.assertEqual(car.wheel_count, 4)  # Failure!

这里,测试的目的是确保Car的__init__正确设置其字段。我可以将其分成四个方法(这通常是一个好主意),但在这种情况下,我认为将其保留为测试单个概念(“对象已正确初始化”)的单个方法更具可读性。

如果我们假设最好不要分解该方法,那么我就会遇到一个新问题:我无法立即看到所有错误。当我修复model错误并重新运行测试,然后wheel_count出现错误。当我第一次运行测试时,这会节省我看到这两个错误的时间。

为了进行比较,Google 的 C++ 单元测试框架区分之间非致命EXPECT_*断言和致命的ASSERT_*断言:

这些断言成对出现,测试相同的事物,但对当前函数有不同的影响。 ASSERT_* 版本失败时会生成致命故障,并中止当前函数。 EXPECT_* 版本会生成非致命故障,不会中止当前函数。通常 EXPECT_* 是首选,因为它们允许在测试中报告多个失败。但是,如果当相关断言失败时继续没有意义,则应使用 ASSERT_*。

有没有办法得到EXPECT_*- 类似 Python 中的行为unittest?如果不在unittest,那么还有另一个Python单元测试框架支持这种行为吗?


顺便说一句,我很好奇有多少现实生活中的测试可以从非致命断言中受益,所以我研究了一些代码示例(于 2014 年 8 月 19 日编辑,使用 searchcode 而不是 Google 代码搜索,RIP)。从第一页随机选择的 10 个结果中,所有结果都包含在同一测试方法中做出多个独立断言的测试。所有人都将从非致命断言中受益。


获得非致命断言的另一种方法是捕获断言异常并将异常存储在列表中。然后在拆卸过程中断言该列表为空。

import unittest

class Car(object):
  def __init__(self, make, model):
    self.make = make
    self.model = make  # Copy and paste error: should be model.
    self.has_seats = True
    self.wheel_count = 3  # Typo: should be 4.

class CarTest(unittest.TestCase):
  def setUp(self):
    self.verificationErrors = []

  def tearDown(self):
    self.assertEqual([], self.verificationErrors)

  def test_init(self):
    make = "Ford"
    model = "Model T"
    car = Car(make=make, model=model)
    try: self.assertEqual(car.make, make)
    except AssertionError, e: self.verificationErrors.append(str(e))
    try: self.assertEqual(car.model, model)  # Failure!
    except AssertionError, e: self.verificationErrors.append(str(e))
    try: self.assertTrue(car.has_seats)
    except AssertionError, e: self.verificationErrors.append(str(e))
    try: self.assertEqual(car.wheel_count, 4)  # Failure!
    except AssertionError, e: self.verificationErrors.append(str(e))

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

当断言失败时继续 Python 的单元测试 的相关文章

  • Python 中的 Lanczos 插值与 2D 图像

    我尝试重新缩放 2D 图像 灰度 图像大小为 256x256 所需输出为 224x224 像素值范围从 0 到 1300 我尝试了两种使用 Lanczos 插值来重新调整它们的方法 首先使用PIL图像 import numpy as np
  • Django 管理员在模型编辑时间歇性返回 404

    我们使用 Django Admin 来维护导出到我们的一些站点的一些数据 有时 当单击标准更改列表视图来获取模型编辑表单而不是路由到正确的页面时 我们会得到 Django 404 页面 模板 它是偶尔发生的 我们可以通过重新加载三次来重现它
  • SQLAlchemy 通过关联对象声明式多对多自连接

    我有一个用户表和一个朋友表 它将用户映射到其他用户 因为每个用户可以有很多朋友 这个关系显然是对称的 如果用户A是用户B的朋友 那么用户B也是用户A的朋友 我只存储这个关系一次 除了两个用户 ID 之外 Friends 表还有其他字段 因此
  • 通过最小元素比较对 5 个元素进行排序

    我必须在 python 中使用元素之间的最小比较次数来建模对 5 个元素的列表进行排序的执行计划 除此之外 复杂性是无关紧要的 结果是一个对的列表 表示在另一时间对列表进行排序所需的比较 我知道有一种算法可以通过 7 次比较 总是在元素之间
  • 从文件夹中删除文件的单元测试方法

    我们有一个方法 它将文件夹名称和天数作为参数 public void Delete string folder int days var files Directory GetFiles folder foreach var file in
  • 如何在 Python 中检索 for 循环中的剩余项目?

    我有一个简单的 for 循环迭代项目列表 在某些时候 我知道它会破裂 我该如何退回剩余的物品 for i in a b c d e f g try some func i except return remaining items if s
  • 使用 on_bad_lines 将 pandas.read_csv 中的无效行写入文件

    我有一个 CSV 文件 我正在使用 Python 来解析该文件 我发现文件中的某些行具有不同的列数 001 Snow Jon 19801201 002 Crom Jake 19920103 003 Wise Frank 19880303 l
  • Python pickle:腌制对象不等于源对象

    我认为这是预期的行为 但想检查一下 也许找出原因 因为我所做的研究结果是空白 我有一个函数可以提取数据 创建自定义类的新实例 然后将其附加到列表中 该类仅包含变量 然后 我使用协议 2 作为二进制文件将该列表腌制到文件中 稍后我重新运行脚本
  • 如何加速Python中的N维区间树?

    考虑以下问题 给定一组n间隔和一组m浮点数 对于每个浮点数 确定包含该浮点数的区间子集 这个问题已经通过构建一个解决区间树 https en wikipedia org wiki Interval tree 或称为范围树或线段树 已经针对一
  • BeautifulSoup 中的嵌套标签 - Python

    我在网站和 stackoverflow 上查看了许多示例 但找不到解决我的问题的通用解决方案 我正在处理一个非常混乱的网站 我想抓取一些数据 标记看起来像这样 table tbody tr tr tr td td td table tr t
  • 如何在ipywidget按钮中显示全文?

    我正在创建一个ipywidget带有一些文本的按钮 但按钮中未显示全文 我使用的代码如下 import ipywidgets as widgets from IPython display import display button wid
  • 在Python中获取文件描述符的位置

    比如说 我有一个原始数字文件描述符 我需要根据它获取文件中的当前位置 import os psutil some code that works with file lp lib open path to file p psutil Pro
  • IO 密集型任务中的 Python 多线程

    建议仅在 IO 密集型任务中使用 Python 多线程 因为 Python 有一个全局解释器锁 GIL 只允许一个线程持有 Python 解释器的控制权 然而 多线程对于 IO 密集型操作有意义吗 https stackoverflow c
  • Pandas:merge_asof() 对多行求和/不重复

    我正在处理两个数据集 每个数据集具有不同的关联日期 我想合并它们 但因为日期不完全匹配 我相信merge asof 是最好的方法 然而 有两件事发生merge asof 不理想的 数字重复 数字丢失 以下代码是一个示例 df a pd Da
  • 如何在Python中对类别进行加权随机抽样

    给定一个元组列表 其中每个元组都包含一个概率和一个项目 我想根据其概率对项目进行采样 例如 给出列表 3 a 4 b 3 c 我想在 40 的时间内对 b 进行采样 在 python 中执行此操作的规范方法是什么 我查看了 random 模
  • 每个 X 具有多个 Y 值的 Python 散点图

    我正在尝试使用 Python 创建一个散点图 其中包含两个 X 类别 cat1 cat2 每个类别都有多个 Y 值 如果每个 X 值的 Y 值的数量相同 我可以使用以下代码使其工作 import numpy as np import mat
  • 有没有办法检测正在运行的代码是否正在上下文管理器内执行?

    正如标题所述 有没有办法做到这样的事情 def call back if called inside context print running in context else print called outside context 这将
  • 发送用户注册密码,django-allauth

    我在 django 应用程序上使用 django alluth 进行身份验证 注册 我需要创建一个自定义注册表单 其中只有一个字段 电子邮件 密码将在服务器上生成 这是我创建的表格 from django import forms from
  • Rocket UniData/UniVerse:ODBC 无法分配足够的内存

    每当我尝试使用pyodbc连接到 Rocket UniData UniVerse 数据时我不断遇到错误 pyodbc Error 00000 00000 Rocket U2 U2ODBC 0302810 Unable to allocate
  • Python 类继承 - 诡异的动作

    我观察到类继承有一个奇怪的效果 对于我正在处理的项目 我正在创建一个类来充当另一个模块的类的包装器 我正在使用第 3 方 aeidon 模块 用于操作字幕文件 但问题可能不太具体 以下是您通常如何使用该模块 project aeidon P

随机推荐

  • 精灵套件保存最高分

    我使用 Sprite Kit 带有 swift xCode 6 beta 4 构建了一个游戏 我需要保留玩家达到的最高分数 所以只有一个 Int 我知道有一种方法可以使用 NSCoding 来做到这一点 我用 google 搜索了一下 只找
  • cassandra快照没有nodetool但仅通过java api

    如何在不使用nodetool而仅通过java api的情况下拍摄cassandra快照 我需要不使用 nodetool 实用程序来拍摄 cassandra 中键空间的快照 我必须通过java api来完成 如果有人知道怎么做 请回答 我必须
  • 检查 A 列的值是否存在于 B 列的同一行或前一行中

    我有这个数据框 df lt structure list A 1 5 B c 1L 5L 2L 3L 3L class data frame row names c NA 5L A B 1 1 1 2 2 5 3 3 2 4 4 3 5 5
  • 缩放和缩放

    我需要实现缩放JDesktopPane包含在一个JScrollPane 我之前已经通过覆盖成功缩放paintComponent 方法及调用scale double double 这不能正常工作 JInternalFrame s and JP
  • 重复后台任务[关闭]

    Closed 这个问题需要细节或清晰度 目前不接受答案 我刚刚开始尝试使用 任务 而不是线程 并尝试实现一个具有后台 清理 任务的对象 只要该对象正在使用 该任务每 5 分钟运行一次 但不应阻止垃圾收集 粗略地说 这显然行不通 public
  • selenium python webscrape 在第一次迭代后失败

    我正在通过到到网保存评论 未翻译 原始 和翻译评论 从葡萄牙语到英语 因此 抓取工具首先选择要显示的葡萄牙语评论 然后像往常一样将它们一一转换为英语 并将翻译后的评论保存在com 中 而扩展的非翻译评论则保存在expanded commen
  • 如何在不使用新图像的情况下减小Android单选按钮上显示的图像大小

    我设计了一个活动 其中有两个单选按钮 但这些尺寸已经足够了 我想减小它 我使用的文本大小仅减小文本 如果布局尺寸减小 则仅减小视图而不是单选按钮圆圈
  • 当我只使用 LinqToSql 和 Ado.Net 时,为什么 TransactionScope 使用分布式事务

    我们在一台机器上遇到问题 并显示错误消息 服务器 XXX 上的 MSDTC 不可用 该代码使用的是交易范围包装一些 LingToSql 数据库代码 交易内部还有一些原始的 Ado net 由于仅访问单个 SQL 数据库 2005 为什么要使
  • C#,从TextBox和TextArea获取其他应用程序文本?

    早上好 我希望能够分析我正在编写的文本 无论我是什么应用程序 例如 如果我在这里输入此文本区域 我希望能够获取文本 就像在 Outlook 的主题文本框中一样 我在Google上搜索没有成功 也许是因为它需要Win32API调用 目标是开始
  • 使用指针参数从 C# 调用 C++ 方法 (WCT)

    我对从 C 调用 C 方法的概念很陌生 假设我想调用一个C 函数GetThreadWaitChain来自 C https msdn microsoft com en us library windows desktop ms679364 v
  • 将 python 函数的输出从 STDOUT 重定向到 Python 中的变量

    这就是我想要实现的目标 def fun runner InteractiveConsole while True code raw input code rstrip n I want to achieve the following By
  • vue-router 可以在新选项卡中打开链接吗?

    我有一个摘要页面和一个详细子页面 所有路线均通过以下方式实现vue router v 0 7 x 使用如下编程导航 this router go path link to page 但是 当我从摘要页面路由到子页面时 我需要在新选项卡中打开
  • 如何等待Linux内核线程(kthread)退出?

    我刚刚开始在 Linux 内核线程上编程 我有一个问题想与大家分享 我的代码是 void do big things void data do some really big things struct task struct t1 str
  • 在 Java 中运行构造函数代码之前字段是否已初始化?

    谁能解释一下以下程序的输出 我认为构造函数是在实例变量之前初始化的 所以我期望输出是 XZYY class X Y b new Y X System out print X class Y Y System out print Y publ
  • python - 查找用户的“下载”文件夹

    我已经找到了这个问题建议使用os path expanduser path 获取用户的主目录 我想通过 下载 文件夹实现相同的目的 我知道这在 C 中是可能的 但我是 Python 新手 不知道这是否也可能在这里 最好是独立于平台 Wind
  • 使用应用程序脚本在过滤器视图之间切换

    我想创建一个自定义菜单 其中包含可在特定工作表上的过滤器视图之间切换的项目 有什么办法吗 我需要过滤视图 因为需要排序和过滤 但仍保留编辑选项 由于这个事实 过滤器功能不起作用 筛选视图尚不支持应用程序脚本 这是一个旧的功能要求
  • 通过在特定日期范围之间插入其他列来在数据框中创建新列 - Pandas

    我有一个 df 如下所示 数据是这样的 Date y 0 2020 06 14 127 1 2020 06 15 216 2 2020 06 16 4 3 2020 06 17 90 4 2020 06 18 82 5 2020 06 19
  • 使用 Python 和 Regex 查找字符串中的所有中文文本

    今天我需要从一堆字符串中去掉中文 并且正在寻找一个简单的 Python 正则表达式 有什么建议么 Python 2 usr bin env python encoding utf8 import re sample u I am from
  • StreamReader.ReadLine 和 CR

    我在这里很密集吗 StreamReader ReadLine指出 行定义为一系列字符 后跟换行符 n 回车符 r 或回车符后紧跟换行符 r n 那么 为什么这没有按预期工作呢 Server Dim tcpL as New TcpListen
  • 当断言失败时继续 Python 的单元测试

    编辑 切换到一个更好的示例 并澄清为什么这是一个真正的问题 我想用 Python 编写单元测试 当断言失败时继续执行 这样我就可以在单个测试中看到多个失败 例如 class Car object def init self make mod