2024-05-19 08:11:05 发布
网友
我用unittest编写了一些Python测试。我想检查一下我的一些字典是否至少包含某些等于某些值的属性。如果有额外的值,那就可以了。assertDictContainsSubset将是完美的,只是它被弃用了。有没有更好的东西我应该使用,或者我应该只是递归断言内容是相等的,如果他们在目标字典?
assertDictContainsSubset
文档建议使用addTypeEqualityFunc,但在某些情况下,我确实希望对dict使用普通的assertEqual。
addTypeEqualityFunc
assertEqual
扩展@bman的答案,利用set-like对象的比较运算符被重载为子集运算符,您可以使用assertGreaterEqual获得(可以说)更好的错误消息。
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方法:
issubset
assert set(A.items()).issubset(set(B.items()))
但对于这个问题还有另一个更简单的python解决方案:
set(A.items()) <= set(B.items())
第二种解决方案的缺陷是,您不知道子集中缺少父集的哪些键。
但是,如果您的值中包含不可更改的变量(例如dict),则这两个解决方案都将失败。
dict
扩展@bman的答案,利用set-like对象的比较运算符被重载为子集运算符,您可以使用
assertGreaterEqual
获得(可以说)更好的错误消息。比较两个测试:
结果是:
使用
assertGreaterEqual
,您可以从错误消息中看到两个词典的内容。如果你在测试dict A是否是dict B的一个子集,我想我会编写一个函数,尝试从dict B中提取dict A的内容,生成一个新的dict C,然后assertEqual(A,C)。
那你就可以
安德鲁提供了一个使用
assertEqual
的解决方案。但是,对于未来的读者来说,了解两种更简洁的解决方案是很有用的。第一个使用集合的issubset
方法:但对于这个问题还有另一个更简单的python解决方案:
第二种解决方案的缺陷是,您不知道子集中缺少父集的哪些键。
但是,如果您的值中包含不可更改的变量(例如
dict
),则这两个解决方案都将失败。相关问题 更多 >
编程相关推荐