Comments 13
Когда читал статью, сложилось впечатление, что проект достаточно свежий, на самом деле - проект живёт уже более 4x лет.
В любом случае, спасибо за качественную статью, плагин кажется разумным и полезным.
это неплохо вы так переизобрели Deep Equality Test for Nested Python Structures которому уже лет 10. Но так в питоне кругом происходит, так что принимается.
Вопрос первый - почему не сравниваете json структуры? В там есть и параметр сортировки по ключу, и проверка циклических ссылок.
Вопрос второй - тесты с хардкодом ответа в коде, это как бы не очень тесты. Не думали, что этот тест стоило бы переписать? Вам же не равенство константе надо проверять.
Что-то не вижу в Deep Equality Test for Nested Python Structures параметра, чтобы без учёта порядка сравнивать. Это же просто глубокое сравнение структур.deep_eq([1,2,3], [3,2,1])
Out[7]: False
Конечно, json-структуры пытались сравнивать. В 2019 году именно так это и работало у нас. С этим есть свои сложности. Например, не все объекты можно сериализовать. Опять же, некрасивая подготовка, если в каждом тесте это делать руками. И такой гибкости не было, как сейчас.
А второй вопрос не понял к какому тесту относится. Если к примерам в статье - это же просто самодостаточные примеры, которые легко понять и запустить.
элементы множества должны быть хэшируемыми, коими словари не являются.
Это относится только к конкретной реализации. Разве в питоне нельзя реализовать множество на базе древовидной структуры? Ну или посчитать хеш для словаря? Ни то ни другое не выглядит логически невозможным.
Реализовать можно, но это только всё усложнит. Словари в Python не являются хешируемыми объектами, потому что они изменяемые (mutable).
Ответ не совсем корректный. У класса словарь не реализован метод __hash__ поэтому объекты не являются хешируемыми в python. Но это происходит вне зависимости от мутабельности объектов этого класса. Другой вопрос - почему этот метод не реализован.
Насчет мутабельности я согласен, мутабельные ключи - это немного нонсенс. Но дерево все равно можно построить. Оно не будет такое быстрое, возможно, как хеш таблица, но работать будет.
Сортировка данных в API не требовалась, и делать её только ради тестов казалось нелогичным
Может пропустил, но почему бы в таком случае не отсортировать прямо в тесте? Типа `assert sorted(expected) == sorted(actual)` (ну помимо красивых сообщений об ошибках)
Я не писал об этом, потому что думал, что это и так очевидно...
>>> sorted([{}, {}])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: '<' not supported between instances of 'dict' and 'dict'
Оставлю тут ссылку на вопрос со StackOverflow, которому семь с половиной лет. Уже пробовали и sorted(), и set(), и Counter().
pytest-unordered: сравнение коллекций без учёта порядка