首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Python :如何指定自定义相等谓词?

Python :如何指定自定义相等谓词?
EN

Stack Overflow用户
提问于 2017-02-23 10:20:35
回答 4查看 3.4K关注 0票数 6

这可能是一个简单的问题;我想在Python测试用例中使用自定义的相等操作符。例如,假设我想测试一个“数字到字符串”函数,并且我想执行一个不区分大小写的字符串比较。

我想写的是:

代码语言:javascript
运行
AI代码解释
复制
class MyTest(unittest.TestCase):
    def testFoo(self):
        self.assertCheck(ci_string_eq,i2s(24),"Twenty-Four")

问题是,assertCheck不是一件事。

一些明显的解决办法是:

  • 使用assertTrue;问题是这样一个测试用例失败就变得不透明和毫无帮助;“预期的真,得到了假”。布利亚。
  • 深入研究统一,自己扩展;我希望避免这种情况:)

我希望我错过了一些明显的东西?

事先非常感谢!

编辑:有人建议我重写__eq__。这不是我想要的。具体来说,我的代码的客户端使用__eq__方法来确定两个对象是否应该被认为是“相同的”(cf )。“扩大平等”)。不过,为了测试的目的,我想使用不同的谓词进行测试。所以覆盖__eq__并不能解决我的问题。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-03-01 19:31:39

好消息是,没有任何复杂的连接可以使用您自己的规则进行自定义断言。只需进行比较,收集任何有用的信息,然后在需要时调用fail(msg)。能处理你需要的任何报告。

当然,我太懒了,甚至不喜欢收集有用的信息。我经常发现有用的是从预期数据和实际数据中删除不相关的内容,然后使用常规的assertEquals(expected, actual)

下面是这两种技术的一个例子,另外还有一个使用longMessage来包含上下文的额外技术:

代码语言:javascript
运行
AI代码解释
复制
# file scratch.py

from unittest import TestCase
import sys

def convert(i):
    results = 'ONE TOO THREE'.split()
    return results[i-1]


class FooTest(TestCase):
    def assertResultEqual(self, expected, actual):
        expected_lower = expected.lower()
        actual_lower = actual.lower()
        if expected_lower != actual_lower:
            self.fail('Results did not match: {!r}, {!r}, comparing {!r}, {!r}'.format(
                expected,
                actual,
                expected_lower,
                actual_lower))

    def assertLazyResultEqual(self, expected, actual):
        self.assertEqual(expected.lower(), actual.lower())

    def assertLongLazyResultEqual(self, expected, actual):
        self.longMessage = True
        self.assertEqual(expected.lower(),
                         actual.lower(),
                         'originals: {!r}, {!r}'.format(expected, actual))

    def test_good_convert(self):
        expected = 'One'

        s = convert(1)

        self.assertResultEqual(expected, s)
        self.assertLazyResultEqual(expected, s)
        self.assertLongLazyResultEqual(expected, s)

    def test_bad_convert(self):
        expected = 'Two'

        s = convert(2)

        self.assertResultEqual(expected, s)

    def test_lazy_bad_convert(self):
        expected = 'Two'

        s = convert(2)

        self.assertLazyResultEqual(expected, s)

    def test_long_lazy_bad_convert(self):
        expected = 'Two'

        s = convert(2)

        self.assertLongLazyResultEqual(expected, s)

这将生成以下输出,包括上下文以及传递和失败计数的报告。

代码语言:javascript
运行
AI代码解释
复制
$ python -m unittest scratch
F.FF
======================================================================
FAIL: test_bad_convert (scratch.FooTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/don/workspace/scratch/scratch.py", line 43, in test_bad_convert
    self.assertResultEqual(expected, s)
  File "/home/don/workspace/scratch/scratch.py", line 18, in assertResultEqual
    actual_lower))
AssertionError: Results did not match: 'Two', 'TOO', comparing 'two', 'too'

======================================================================
FAIL: test_lazy_bad_convert (scratch.FooTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/don/workspace/scratch/scratch.py", line 50, in test_lazy_bad_convert
    self.assertLazyResultEqual(expected, s)
  File "/home/don/workspace/scratch/scratch.py", line 21, in assertLazyResultEqual
    self.assertEqual(expected.lower(), actual.lower())
AssertionError: 'two' != 'too'
- two
?  ^
+ too
?  ^


======================================================================
FAIL: test_long_lazy_bad_convert (scratch.FooTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/don/workspace/scratch/scratch.py", line 57, in test_long_lazy_bad_convert
    self.assertLongLazyResultEqual(expected, s)
  File "/home/don/workspace/scratch/scratch.py", line 27, in assertLongLazyResultEqual
    'originals: {!r}, {!r}'.format(expected, actual))
AssertionError: 'two' != 'too'
- two
?  ^
+ too
?  ^
 : originals: 'Two', 'TOO'

----------------------------------------------------------------------
Ran 4 tests in 0.002s

FAILED (failures=3)

如果自定义比较适用于特定类,则可以对该类进行添加自定义相等运算符。如果在setUp()方法中这样做,那么所有的测试方法都可以使用该类调用assertEquals(),并且您的自定义比较将被调用。

票数 3
EN

Stack Overflow用户

发布于 2018-09-20 02:16:46

内置的单元测试模块有一个特定的方法,称为addTypeEqualityFunc。你可以读到它,这里。您只需编写相等的函数并传递它,并像往常一样简单地使用assertEqual方法。

票数 3
EN

Stack Overflow用户

发布于 2017-02-23 10:31:09

模块。

如您所见,没有任何断言需要使用自定义谓词来计算,但是通过msg参数将自定义错误消息传递给断言方法可以获得更有用的错误消息。

例如:

代码语言:javascript
运行
AI代码解释
复制
class MyTest(unittest.TestCase):
  def testFoo(self):
    self.assertEqual(i2s(24),"Twenty-Four",msg="i2s(24) should be 'Twenty-Four'")

如果这对您来说还不够,那么您就不需要深入研究unittest:您可以定义一个用所需方法扩展unittest's TestCase的类,即:

代码语言:javascript
运行
AI代码解释
复制
class CustomTestCase(unittest.TestCase):
  def assertCheck(self):
    ...

然后将测试定义为:

代码语言:javascript
运行
AI代码解释
复制
class MyTest(CustomTestCase):
  def testFoo(self):
    self.assertCheck(...)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42423350

复制
相关文章
在.Net Core中记录日志
一个完善的系统,必然会有非常完善的日志记录,用户的操作、系统的运行状况等信息被完整的记录下来,方便我们对系统进行维护和改进。.net core 也为日志记录提供了内置的支持。
拓荒者IT
2019/09/23
1.3K0
在MySQL中查找重复记录
I want to pull out duplicate records in a MySQL Database. 我想在MySQL数据库中提取重复记录。 This can be done with: 这可以通过以下方式完成:
kirin
2021/04/30
3.9K0
记录GOPATH在GOLAND中的坑
这里的GOPATH已经出错了,所以编译找不到,我检查了go env也是正确的GOPATH....
超蛋lhy
2018/08/31
1.8K0
记录GOPATH在GOLAND中的坑
MySQL 在查询结果中记录行号
在其他的关系型数据库中,都有rownum这类型的内置函数来提供查询结果的行号,但是MySQL没有,阿福也一直觉得奇怪。
用户2353021
2020/05/09
6.7K0
[cloc]在Windows中配置cloc的记录
https://github.com/AlDanial/cloc/releases
逝水经年
2022/03/14
3K0
Canvas使用beginPath()绘画不同颜色的直线
从图中可以看到,在每条直线都设置上了颜色和宽度,那么会不会画出三条不同颜色的直线呢?
Devops海洋的渔夫
2019/12/26
2.1K0
Canvas使用beginPath()绘画不同颜色的直线
canvas绘制图形时beginPath应用
当我们在使用canvas绘制图形的时候,不免都会使用到beginPath这个方法。今天我们就来讲解一下这个函数的重要性以及应用。
小明爱学习
2020/01/21
7650
咖啡销售2.0
咖啡是美国乃至全世界消费最广泛的饮料之一。美国人每天消费4亿杯咖啡,使美国成为世界上最主要的咖啡消费国。
用户8128510
2021/01/28
8000
在 Azure Application Insights 中记录用户身份信息
Azure Application Insights 是一个非常强大的 APM 工具,用于监视 Web 应用程序。但是,并非我们需要的所有功能都是开箱即用的。例如,为了记录请求和响应正文,我们必须写一个自定义 ASP.NET Core 中间件,就像这篇文章说的那样。
Edi Wang
2021/08/23
1.1K0
在 Azure Application Insights 中记录用户身份信息
在日志中记录Java异常信息的正确姿势
今天遇到一个线上的BUG,在执行表单提交时失败,但是从程序日志中看不到任何异常信息。 在Review源代码时发现,当catch到异常时只是输出了e.getMessage(),如下所示:
编程随笔
2019/06/27
2.6K0
在日志中记录Java异常信息的正确姿势
【架构治理】在代码存储库中记录软件架构
Markdown 是一种标准的简单语法,用于创建具有专业外观的文档。它比 HTML 更简单,无需专门的编写编辑器即可进行管理。Git配置管理工具也支持markdown格式。在 Git 环境中,markdown 一般用于项目的简单介绍和构建说明。(自述文件)。本文介绍了如何将 Markdown 格式与模板一起用于架构文档。 带有 Markdown 的架构文档 与代码一起管理软件的架构设计和设计决策将为项目提供极大的便利。当我们的设计与代码一起保存在配置管理环境中时,我们可以一起进行设计变更和代码变更。当新
架构师研究会
2022/04/12
1.7K0
【架构治理】在代码存储库中记录软件架构
在Python中调用Java扩展包HanLP测试记录
最近在研究中文分词及自然语言相关的内容,关注到JAVA环境下的HanLP,HanLP是一个致力于向生产环境普及NLP技术的开源Java工具包,支持中文分词(N-最短路分词、CRF分词、索引分词、用户自定义词典、词性标注),命名实体识别(中国人名、音译人名、日本人名、地名、实体机构名识别),关键词提取,自动摘要,短语提取,拼音转换,简繁转换,文本推荐,依存句法分析(MaxEnt依存句法分析、神经网络依存句法分析)。
IT小白龙
2018/12/12
2K0
在Python中调用Java扩展包HanLP测试记录
10分钟带你读完《在星巴克要买大杯咖啡》
这是一本很有趣的关于生活中的经济学的小册子,日本人吉本佳生用一个个小故事为我们讲述了那些生活中隐藏的经济学知识。
100000798482
2018/08/20
1.5K0
10分钟带你读完《在星巴克要买大杯咖啡》
ROS1Noetic在Win11中安装记录
和Win10类似,windows系统安装和使用ROS的好处,几乎主流版本的ROS全部可以用,还能用WSL使用Ubuntu下原生ROS,非常方便。
zhangrelay
2022/06/27
6670
ROS1Noetic在Win11中安装记录
【实战记录】WebSocket在vue2中的使用
官方说, WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。但是我对网络协议并不了解,用实际用途去解释它就是,它支持服务端主动给客户端发送消息。
一尾流莺
2022/12/10
3.3K0
IOS内测记录:在自有App中运行小程序游戏
作为FinClip的老用户,很早就向官方提出了希望支持微信小游戏的建议。现如今,官方也把小游戏支持提上了日程,近期开启了公测通道。团队用小游戏进行了测试,在这里记录分享一下测试情况。
Lydiasq
2022/12/06
7830
IOS内测记录:在自有App中运行小程序游戏
在文章中插入超美的音乐播放插件开发记录
是不是有点复杂呢?而且鸡肋呢?没错下一款插件我就准备推出 mokplayer 实现 typecho 遗留问题 音乐播放
乔千
2020/04/16
1.6K0
在文章中插入超美的音乐播放插件开发记录
在Salesforce中动手创建页面布局和记录类型
通过官方的工作册和教程来学习Salesforce很好,但对于我个人来讲我很难抽出时间去看这些材料,因为它不是我的公司的需求,并且从中学到的并不是我在日常工作中可以使用的东西。
臭豆腐
2019/04/16
2.6K0
在Salesforce中动手创建页面布局和记录类型
理解DNS记录以及在渗透测试中的简单应用
DNS (Domain Name System, 域名系统 ),万维网上作为域名和IP地址相互映射的一个 分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。通过域名,最终得到该域名对应的IP地址的过程叫做域名解析(或主机名解析)。
FB客服
2018/12/26
2.3K0
用AR发福利,与初音未来邂逅在咖啡馆
初音未来坐在对面品尝咖啡、卖萌撒娇,你的小心脏能hold住吗? 与二次元偶像约会怎么样?想必很多宅男很乐意接下这波福利。据最新消息,在日本的一家名叫“BLUE FEAF CAFÉ”的咖啡厅就能邂逅初音未来。 听起来很梦幻吧,其实这是这家咖啡厅的线下联动活动,通过一款叫做“miku☆散步(ミク☆さんぽ)”的AR应用来实现。在活动中,顾客们将通过搭载AR技术“Tango”的安卓手机“Lenovo Phab 2 Pro”打开应用,就能看见坐在对面的初音未来,还穿着JK制服。 由于搭载最新的增强现实技术,可爱的初音
镁客网
2018/05/30
4810

相似问题

Tkinter动画-模拟模拟时钟

121

jQuery动画()平滑

112

平滑jQuery动画

11

Jquery/CSS -动画打开div盒容器平滑

10

CSS平滑文本动画

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档