【问题标题】:Wildcard assertions with python unittest使用 python unittest 进行通配符断言
【发布时间】:2022-11-17 19:36:39
【问题描述】:

检查是否有 assertEqual 一个对象,其中一些键/值被通配符。

我有一个函数,它返回一个对象,其中一个键是以纳秒为单位的当前时间戳。因为每次我运行测试时这个纳秒都会改变,所以我不能期望基于任何输入。我想要做的是能够调用类似下面的内容

self.assertEqual(returnedObject, {'key1' : 'val1', 'timestampkey' : '*'} #where * being the value is wildcarded, hence dont care what is.

单元测试中有这样的规定吗?

断言这样的事情的替代方法是什么。

我也许可以 assertEqual 单独的键/值,但想避免额外的工作。

【问题讨论】:

  • self.assertIsNotNone(returnedObject.timestampkey)
  • 感谢您的回复。我希望能够断言除时间戳键之外的所有其他键,即我不关心时间戳键有什么值,但我想断言对象的其余部分。
  • 我没有太多使用测试框架,所以我不知道是否像您要求的那样支持通配符值。我能想到的最接近的事情是像我上面评论的那样做assertIsNotNone,然后完全删除timestampkey属性,然后继续进行完全相等比较。
  • 好的,所以你是说我首先检查密钥是否存在(使用 notnone),然后从返回的对象中删除它并为对象的其余部分断言。那讲得通。谢谢。

标签: python wildcard python-unittest


【解决方案1】:

不知道unittests有没有解决办法。但是您可以使用 regexp 检查值或将值转换为 datetime 并检查类型。这是一个例子:

import time
import unittest
from datetime import datetime
import re


class Something:
    def __init__(self) -> None:
        self.key1 = 'val1'
        self.timestampkey = time.time()


class TextExample(unittest.TestCase):
    def test_something(self):
        expected = dict(key1='val1')
        something = Something()
        # convert timestamp to datetime and check type
        dt = datetime.utcfromtimestamp(something.timestampkey)
        self.assertTrue(isinstance(dt, datetime))
        # or using regexp
        self.assertTrue(re.match(r'^d{10}.d{7}$', str(something.timestampkey)))
        expected['timestampkey'] = something.timestampkey
        self.assertEqual(expected, something.__dict__)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-02
    • 1970-01-01
    • 2013-09-16
    • 1970-01-01
    • 1970-01-01
    • 2013-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多