代码之家  ›  专栏  ›  技术社区  ›  00__00__00

pytest下的jaydebeapi泄漏日志中的环境变量内容

  •  0
  • 00__00__00  · 技术社区  · 4 年前

    我使用jaydebeapi连接到一个数据库,并使用以下代码段连接到jdbc驱动程序,当正确指定所有参数时,它可以正常工作。 我将凭据存储在环境变量中,例如。 os.environ.get('credentials')

    import jaydebeapi as dbdriver
    import os
    cnxn = None
    server_name=''
    server_jdbc_port=
    server_database=''
    name_env_credentials=''
    name_env_pwd=''
    
    try:
    
        driver_path = "XXXXXXX"
        conn_uri = "jdbc:://%s:%s/%s?" % (server_name,server_jdbc_port,   server_database)
    
        cnxn = dbdriver.connect( "XXXXXXX",
                        conn_uri,
                        driver_args = {"user": os.environ.get(name_env_credentials),
        "password":  os.environ.get(name_env_pwd)},
                        jars = driver_path)
        print('Connection open')
    except (Exception) as error:
        raise error
    finally: # in any case close connection and free resources
        if cnxn is not None:
            cnxn.close()
            print('Database connection closed.')
    

    如果我获得的凭据/访问权限有一些错误,那没关系。

    java.sql.SQLExceptionPyRaisable: java.sql.SQLException: authentication error: 
    Insufficient privileges to connect to the database 'XXXXX'
    

    但是当我把上面的内容包装成一个函数时, pytest -在server_name、server_jdbc_port、server_database、name_env_credentials和name_env_pwd上进行参数化。

    ######test_issue.py   
    @pytest.mark.parametrize("server_name,server_jdbc_port,server_database,name_env_credentials,name_env_pwd", testdata)
        def test_connectivity():
               # above code
    

    当我跑步时

    pytest test_issue.py
    

    和中的一个错误,我在日志中以纯文本形式找到我的凭据,这是一个问题。 确切地说,我没有看到内容 name_env_credentials (可以接受)但实际上的内容 os.environ.get(name_env_credentials) (例如下面的MYPLAINTEXTUSERNAME)

    test_issue.py:56: in test_connectivity
        cnxn = dbdriver.connect( "--------",
    /opt/conda/lib/python3.8/site-packages/jaydebeapi/__init__.py:412: in connect
        jconn = _jdbc_connect(jclassname, url, driver_args, jars, libs)
    
    [........]
    driver_args = {'password': MYPLAINTEXTPASSWORD, 'user': MYPLAINTEXTUSERNAME}
    [........]
    
    
    jaydebeapi.__version__='1.2.3'
    
    0 回复  |  直到 4 年前
        1
  •  2
  •   trolloldem    4 年前

    您使用的是pytest的默认回溯记录器,它还记录传递给特定函数的参数。解决这种泄漏的一种方法是使用另一种回溯模式。您可以在此处找到一般文档 link 。在该链接中,您可以找到两种有趣的回溯模式:

    • --tb=short
    • --tb=native

    两者都能在您的特定测试中为您提供所需的所有信息,因为:

    • 他们仍然会向您提供有关测试失败或成功的信息
    • 由于您使用的是参数化测试,因此有关失败的日志将如下所示 FAILED test_issue.py::test_connectivity[server_name-server_jdbc_port-server_database-name_env_credentials-name_env_pwd] ,通过这种方式,您可以识别实际失败的测试

    请注意,此解决方案在避免记录测试时使用的凭据的同时,测试期间使用的这些凭据不得与测试环境外使用的凭据相同。如果您担心在生产失败的情况下,记录器可能会泄露您的凭据,则应相应地设置记录器,并避免记录异常的默认文本。