Я создал функцию, которая принимает файл с динамическим 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 ================
Есть две причины, по которым ваш unit тест не проходит:
Ваша строка sql
в смешанном регистре ("SELECT" и "FROM" в верхнем регистре), а строка сравнения во всех нижних регистрах.
Текст в select_all_from_{table}.py
в двойные кавычки, но в строке сравнения нет двойных кавычек.
Поскольку read_text()
считывает содержимое файла как str
двойные кавычки не нужны. Удалите двойные кавычки из своего файла и для хорошей практики сделайте тест без учета регистра:
sql.lower() == 'select * from sandbox.test_table'.lower()
Или просто sql.lower() == 'select * from sandbox.test_table'
будет достаточно в этом конкретном случае.
Для модульных тестов лучше всего быть бдительными в отношении своих входных и выходных данных и убедиться, что ваши тесты точны.
"SELECT * FROM {table};"
включая сами двойные кавычки.
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'
.