Me estoy conectando a una base de datos usando jaydebeapi y un controlador jdbc usando el siguiente fragmento, que funciona bien cuando todos los parámetros se especifican correctamente. Estoy almacenando mis credenciales en variables de entorno, por ejemplo, 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.')Si hay algunos errores en mis credenciales/derechos de acceso, lo cual está bien.
java.sql.SQLExceptionPyRaisable: java.sql.SQLException: authentication error: Insufficient privileges to connect to the database 'XXXXX' Sin embargo, cuando envuelvo lo anterior en una función, pytest en 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 codecuando corro
pytest test_issue.py y aparece un error, encuentro mis credenciales en texto sin formato en los registros, lo cual es un problema. Para ser precisos, no veo el contenido name_env_credentials (sería aceptable) sino realmente el contenido de os.environ.get(name_env_credentials) (a continuación, por ejemplo, MYPLAINTEXTUSERNAME) en los registros/rastreos de prueba
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'Está utilizando el registrador de seguimiento predeterminado de pytest, que también registra los argumentos pasados a una función específica. Una forma de resolver este tipo de fuga es utilizar otro modo de rastreo. Puede encontrar la documentación general en este enlace . En ese enlace puedes encontrar dos interesantes modos de rastreo:
--tb=short--tb=nativeAmbos te dan toda la información que necesitas durante tu prueba específica ya que:
FAILED test_issue.py::test_connectivity[server_name-server_jdbc_port-server_database-name_env_credentials-name_env_pwd] , de esta manera puede identificar la prueba fallida realTenga en cuenta que esta solución, si bien evita registrar las credenciales utilizadas en el momento de la prueba, estas credenciales utilizadas durante la prueba no deben ser las mismas que se utilizarán fuera del entorno de prueba. Si le preocupa el hecho de que, en caso de fallas en la producción, el registrador podría filtrar sus credenciales, debe configurar su registrador en consecuencia y evitar registrar el texto predeterminado de la excepción.