Сравнение двух объектов таблицы Sqlalchemy с Python unittest

#python #unit-testing #object

#python #модульное тестирование #объект

Вопрос:

Я пытаюсь увидеть, совпадают ли два табличных объекта, и нашел документацию, касающуюся __eq__ функции Python, но не уверен, как использовать ее с моим кодом. Вот код, который я тестирую:

 def get_table(self, table_name, select_stmt=None):
    """
        This method gets a table from the data connection using SQLAlchemy's reflection capability. Columns in the
        select_stmt are included, with all other table columns excluded.
        :param table_name: The name of the table being reflected.
        :type table_name: str
        :param select_stmt: The fields being included in the query. Default None.
        :type select_stmt:  str
        :returns:  SQLAlchemy Table object
    """
    table = Table(table_name, self.meta)
    self.log.debug("Reflecting table %s" % table_name)

    if select_stmt == "all_columns":
        select_stmt = None

    self.insp.reflecttable(table, select_stmt)

    return table
  

Мой тест в настоящее время выглядит следующим образом:

     def test_select_all_data_no_columns(self):
    # Testing that when all columns are selected, None value is passed.
    given_result = DataConnector(self.source).get_table(self.table, "all_columns")
    expected_result = DataConnector(self.source).get_table(self.table)

    self.assertEquals(given_result, expected_result)
  

Комментарии:

1. Возможно, я упускаю детали реализации, но, похоже, вы тестируете get_tables с помощью самой функции. Как правило, вы хотите отделить функциональность, которую хотите протестировать, от функции и независимо проверить это. Хороший способ сделать это — иметь тестовую базу данных, в которой вам известны содержащиеся в ней данные, а затем выполнить этот тест знаний, если функция, скорее всего, вернет правильную вещь, убедившись, что все записи верны.

2. Я тестирую аналогичную функциональность для get_tables. В одном я специально передаю опцию «all_columns». В другом случае я не передаю эту опцию. У меня есть другие тесты, которые подтверждают, что функция правильно возвращает объект. Я хочу убедиться, что получаю одинаковые результаты между двумя тестируемыми вариантами.

Ответ №1:

Я, наконец, обнаружил, как это сделать. Проблема в том, что результаты также возвращали значения объекта, которые не совпадали. Изменив тест на

 self.assertCountEqual(given_result.columns._data, expected_result.columns._data)
  

Я смог получить структуру таблицы, которую мне нужно было проверить.