Python unittest的assertDictContainsSubset推荐的备选方案

2024-05-19 08:11:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我用unittest编写了一些Python测试。我想检查一下我的一些字典是否至少包含某些等于某些值的属性。如果有额外的值,那就可以了。assertDictContainsSubset将是完美的,只是它被弃用了。有没有更好的东西我应该使用,或者我应该只是递归断言内容是相等的,如果他们在目标字典?

文档建议使用addTypeEqualityFunc,但在某些情况下,我确实希望对dict使用普通的assertEqual


Tags: 文档内容目标字典属性情况断言unittest
3条回答

扩展@bman的答案,利用set-like对象的比较运算符被重载为子集运算符,您可以使用assertGreaterEqual获得(可以说)更好的错误消息。

比较两个测试:

import unittest

class SubsetTestCase(unittest.TestCase):
    def test_dict_1(self):
        a = {1: 1, 2: 2}
        b = {1: 2}
        self.assertTrue(a.items() >= b.items())

    def test_dict_2(self):
        a = {1: 1, 2: 2}
        b = {1: 2}
        self.assertGreaterEqual(a.items(), b.items())

unittest.main()

结果是:

======================================================================
FAIL: test_dict_1 (__main__.SubsetTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "test.py", line 9, in test_dict_1
    self.assertTrue(a.items() >= b.items())
AssertionError: False is not true

======================================================================
FAIL: test_dict_2 (__main__.SubsetTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "test.py", line 15, in test_dict_2
    self.assertGreaterEqual(a.items(), b.items())
AssertionError: dict_items([(1, 1), (2, 2)]) not greater than or equal to dict_items([(1, 2)])

----------------------------------------------------------------------

使用assertGreaterEqual,您可以从错误消息中看到两个词典的内容。

如果你在测试dict A是否是dict B的一个子集,我想我会编写一个函数,尝试从dict B中提取dict A的内容,生成一个新的dict C,然后assertEqual(A,C)。

def extractDictAFromB(A,B):
    return dict([(k,B[k]) for k in A.keys() if k in B.keys()])

那你就可以

assertEqual(A,extractDictAFromB(A,B))

安德鲁提供了一个使用assertEqual的解决方案。但是,对于未来的读者来说,了解两种更简洁的解决方案是很有用的。第一个使用集合的issubset方法:

assert set(A.items()).issubset(set(B.items()))

但对于这个问题还有另一个更简单的python解决方案:

set(A.items()) <= set(B.items())

第二种解决方案的缺陷是,您不知道子集中缺少父集的哪些键。

但是,如果您的值中包含不可更改的变量(例如dict),则这两个解决方案都将失败。

相关问题 更多 >

    热门问题