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

jaydebeapi under pytest leaking environment variable content in logs

我正在使用 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.')

如果我获得的 credentials/access 权利有一些错误,那没关系。

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

并引发了一个错误,我在日志中以纯文本形式找到了我的凭据,这是一个问题。 准确地说,我在测试 logs/tracebacks

中没有看到内容 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'

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

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

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

  • 他们仍然会为您提供有关测试失败或成功的信息
  • 由于您使用的是参数化测试,有关失败的日志将类似于 FAILED test_issue.py::test_connectivity[server_name-server_jdbc_port-server_database-name_env_credentials-name_env_pwd],这样您就可以识别实际失败的测试

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