def recursiveCompare(expected, actual, ignore_attributes=[]):
    assert type(expected) == type(actual)
    if type(expected) is list:
        assert len(expected) == len(actual)
        for index, val in enumerate(expected):
            recursiveCompare(expected[index], actual[index], ignore_attributes)
        return

    if type(expected) is dict:
        assert expected.keys() == actual.keys(), \
            f"Key sets should be the same: " \
            f"\nNot present: {set(expected.keys()) - set(actual.keys())}" \
            f"\nUnexpected: {set(actual.keys()) - set(expected.keys())}"
        for index, val in enumerate(expected):
            if val not in ignore_attributes:
                recursiveCompare(expected[val], actual[val], ignore_attributes)
        return

    assert expected == actual