Python read_text () добавление дополнительных строк

1

Я создал функцию, которая принимает файл с динамическим SQL (и параметрами), а затем возвращает конечный результат SQL. Кажется, что добавляются дополнительные строки, потому что мой unit тест не проходит, и он показывает дополнительные строки.

Моя функция:

def file_to_sql(filename, kwargs=None):
    """Read file and return SQL statement.

    Parameters
    ----------
    filename: str
        Name of the file to read.
    kwargs : dict
        Keyword arguments to be passed into your SQL statement.
    """

    python_dir = Path('logic/extract/python3')
    python_file_path = python_dir / '{}'.format(filename)
    sql = python_file_path.read_text().format(**kwargs)

return sql

Мой юнит тест:

def test_python_file_with_kwargs_to_sql():
    sql = file_to_sql(filename="select_all_from_{table}.py", kwargs={
        'table': 'sandbox.test_table'
        })

    assert sql == "SELECT * FROM sandbox.test_table;"

select_all_from_ {таблица}.py:

"SELECT * FROM {table};"

Сообщение об ошибке модульного теста:

================================== FAILURES ===================================
_____________________ test_python_file_with_kwargs_to_sql _____________________

    def test_python_file_with_kwargs_to_sql():
        sql = file_to_sql(filename="select_all_from_{table}.py", kwargs={
            'table': 'sandbox.test_table'
            })

>       assert sql == "SELECT * FROM sandbox.test_table;"
E       assert '"SELECT * FR....test_table;"' == 'select * from...x.test_table;'
E         - "SELECT * FROM sandbox.test_table;"
E         + SELECT * FROM sandbox.test_table;

tests\unit_tests\transform\test_preprocess.py:19: AssertionError
================ 1 failed, 2 passed, 4 skipped in 1.40 seconds ================
  • 1
    Ну, во- sql.lower() == 'select * from sandbox.test_table' , ваши текстовые sql.lower() == 'select * from sandbox.test_table' не совпадают, поэтому == никогда не будет оцениваться как True ... сделайте сравнение без sql.lower() == 'select * from sandbox.test_table' регистра, например sql.lower() == 'select * from sandbox.test_table' .
  • 0
    Спасибо @Idlehands за то, что указал на это. Я исправил это и подтвердил, что получаю ту же ошибку.
Показать ещё 3 комментария
Теги:
unit-testing
pytest

1 ответ

1
Лучший ответ

Есть две причины, по которым ваш unit тест не проходит:

  1. Ваша строка sql в смешанном регистре ("SELECT" и "FROM" в верхнем регистре), а строка сравнения во всех нижних регистрах.

  2. Текст в select_all_from_{table}.py в двойные кавычки, но в строке сравнения нет двойных кавычек.

Поскольку read_text() считывает содержимое файла как str двойные кавычки не нужны. Удалите двойные кавычки из своего файла и для хорошей практики сделайте тест без учета регистра:

sql.lower() == 'select * from sandbox.test_table'.lower()

Или просто sql.lower() == 'select * from sandbox.test_table' будет достаточно в этом конкретном случае.

Для модульных тестов лучше всего быть бдительными в отношении своих входных и выходных данных и убедиться, что ваши тесты точны.

  • 0
    Эту часть я не понимаю. Почему двойные кавычки отсутствуют во время утверждения, но не пропадают при чтении из файла?
  • 0
    Проверьте свой файл. Вы уверены, что в самом вашем файле нет двойных кавычек? Мне кажется, ваш текстовый файл уже содержал именно "SELECT * FROM {table};" включая сами двойные кавычки.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню