Использовать assertCountEqual для списков в asserDictEqual?
Я новичок в модульном тестировании, и я пытаюсь запустить тест, чтобы проверить, совпадают ли два словаря, не принимая во внимание порядок элементов в значениях. Когда я пытаюсь:
import unittest
dic1 = {'key': [1,2]}
dic2 = {'key': [2,1]}
class TestExample (unittest.TestCase):
def test_dicEqual(self):
self.assertDictEqual(dic1, dic2)
tester = TestExample()
tester.test_dicEqual()
Я получил:
AssertionError Traceback (most recent call last)
AssertionError: {'key': [1, 2]} != {'key': [2, 1]}
- {'a': [1, 2]}
? ---
+ {'a': [2, 1]}
? +++
Есть ли способ проверить содержание словаря без учета порядка? Прямо сейчас решение, которое я нашел, состоит в том, чтобы перебрать ключи словаря:
def test_dictequal_iterate(self):
for key, value in dic1 :
self.assertCountEqual(value, dic2[key])
Но это решение не возвращает обзор, такой же ясный, как assertDictEqual.
1 ответ
Я не уверен, что это лучший способ сделать это, но вы, вероятно, можете попробовать это:
import unittest
from collections import Counter
dic1 = {'key': [1, 2]}
dic2 = {'key': [2, 1]}
dic3 = {'key': [1, 3]}
class TestExample (unittest.TestCase):
def countize_dict(self, d):
return {k:Counter(v) for k, v in d.items()}
def assertDictEqualCountized(self, d1, d2):
self.assertDictEqual(self.countize_dict(d1),
self.countize_dict(d2))
def test_dicEqual(self):
self.assertDictEqualCountized(dic1, dic2)
def test_other_dic_equal(self):
self.assertDictEqualCountized(dic1, dic3)
tester = TestExample()
tester.test_dicEqual() # pass
tester.test_other_dic_equal() # fail
AssertionError: {'key': Counter({1: 1, 2: 1})} != {'key': Counter({1: 1, 3: 1})}
- {'key': Counter({1: 1, 2: 1})}
? ^
+ {'key': Counter({1: 1, 3: 1})}
? ^