Python read_text()添加额外的字符串

时间:2019-01-11 16:09:53

标签: python unit-testing pytest

我创建了一个函数,该函数接收带有动态SQL(和参数)的文件,然后返回最终的SQL结果。似乎正在添加额外的字符串,因为我的单元测试失败,并且显示了额外的字符串。

我的功能:

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_ {table} .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 个答案:

答案 0 :(得分:1)

单元测试失败有两个原因:

  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'就足够了。

对于单元测试,最好对输入和输出保持警惕,并确保测试正确无误。