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]
,这样您就可以识别实际失败的测试
请注意,此解决方案虽然避免记录在测试时使用的凭据,但在测试期间使用的这些凭据不得与将在测试环境外使用的相同。如果您担心在生产失败的情况下,记录器可能会泄露您的凭据,您应该相应地设置您的记录器并避免记录异常的默认文本。
我正在使用 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]
,这样您就可以识别实际失败的测试
请注意,此解决方案虽然避免记录在测试时使用的凭据,但在测试期间使用的这些凭据不得与将在测试环境外使用的相同。如果您担心在生产失败的情况下,记录器可能会泄露您的凭据,您应该相应地设置您的记录器并避免记录异常的默认文本。