代码之家  ›  专栏  ›  技术社区  ›  Jonathan Porter

python read_text()添加额外字符串

  •  1
  • Jonathan Porter  · 技术社区  · 6 年前

    我创建了一个函数,它接收一个带有动态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;"
    

    从表.py中选择_all_:

    "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 回复  |  直到 6 年前
        1
  •  1
  •   r.ook jpp    6 年前

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

    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' 在这种情况下就足够了。

    对于单元测试,最好对输入和输出保持警惕,并确保测试是准确的。