There are two keys to answer this seemingly simple answer:
conditions of equality and assertion error helpfulness.
The conditions of equality depend on given constrains and requirements.
Assertion error should point to the violation of those conditions.
Answer the following questions:
- Is order of lists important?
are [1, 2]
and [2, 1]
equal?
- Can lists have duplicates?
are [1, 2]
and [1, 1, 2]
equal?
- Are there unhashable elements?
are there any mutable types?
- Should assertion error be informative and helpful?
No, No, No, No: symmetric difference between sets
def test_nnnn():
expected = [1, 2, 3]
actual = [4, 3, 2, 1]
difference = set(a) ^ set(b)
assert not difference
E assert not {4, 5}
It is handy to use this method on large lists, because it's fast and difference
will contain only hm difference between them, so AssertionError
will be compact, however not informative.
No, No, No, Yes: difference between sets with custom message
def test_nnny():
expected = [1, 2, 3, 4]
actual = [5, 3, 2, 1]
lacks = set(expected) - set(actual)
extra = set(actual) - set(expected)
message = f"Lacks elements {lacks} " if lacks else ''
message += f"Extra elements {extra}" if extra else ''
assert not message
E AssertionError: assert not 'Lacks elements {4} Extra elements {5}'
No, Yes, No, Yes: check for duplicates, than difference in sets
Because set()
removes duplicates you should check for them ahead using this answer:
def test_nyny():
expected = [1, 2, 3, 4]
actual = [1, 2, 3, 3, 5]
seen = set()
duplicates = list()
for x in actual:
if x in seen:
duplicates.append(x)
else:
seen.add(x)
lacks = set(expected) - set(actual)
extra = set(actual) - set(expected)
message = f"Lacks elements {lacks} " if lacks else ''
message += f"Extra elements {extra} " if extra else ''
message += f"Duplicate elements {duplicates}" if duplicates else ''
assert not message
E AssertionError: assert not 'Lacks elements {4} Extra elements {5} Duplicate elements [3]'
Yes, Yes, Yes, No: compare lists
def test_yyyn():
expected = [1, 2, 3, 3, 3, {'a': 1}]
actual = [3, 3, 2, 1, {'a': 1}]
assert expected == actual
E AssertionError: assert [1, 2, 3, 3, 3, {'a': 1}] == [3, 3, 2, 1, {'a': 1}]
Yes, Yes, Yes, Yes: extra libraries
Take a look at DeepDiff