Ambiente de la ejecución
La misma automatización prueba en homologación y opera en producción. Lo que cambia de un lugar a otro (dirección del sistema, usuario, contraseña) queda en el ambiente, registrado en Proton, y no repetido en cada dataset. El script pide el valor por el nombre y recibe el del ambiente con el que corre la ejecución.
La ejecución usa el ambiente elegido al dispararla (pantalla, programación, recurrencia o conector) o, si no se eligió ninguno, el ambiente predeterminado del dataset. Sin ninguno de los dos, se ejecuta sin ambiente.
Leer las variables
- Python
- Java
from proton.proton_automation import start_component
from proton.proton_environment import get_environment_name, get_environment_value, is_production
from proton.proton_logs import set_log
start_component() # ya lee el ambiente de la ejecución, una vez
url = get_environment_value("SAP_URL")
usuario = get_environment_value("SAP_USUARIO")
senha = get_environment_value("SAP_SENHA")
set_log(f"Ambiente: {get_environment_name()}")
if is_production():
set_log("Ejecución en producción: sin guardar documento de prueba")
Función (proton.proton_environment) | Qué hace |
|---|---|
get_environment_value(nome, allow_empty=False) | Valor de la variable; error si no existe o está vacía (allow_empty=True acepta "") |
get_environment_variables() | Copia de todas las variables; vacía sin ambiente o fuera de Proton |
get_environment_name() | Nombre del ambiente; None sin ambiente o fuera de Proton |
is_production() | Si el ambiente tiene la marca de producción |
mask_environment_values(texto) | El texto con los valores del ambiente reemplazados por •••••• |
load_environment(force=False) | Lee el ambiente; force=True lo vuelve a leer |
import br.com.atomicsolutions.proton.ProtonAutomation;
import br.com.atomicsolutions.proton.ProtonEnvironment;
import static br.com.atomicsolutions.proton.ProtonLogs.setLog;
ProtonAutomation.startComponent(); // ya lee el ambiente de la ejecución, una vez
String url = ProtonEnvironment.get("SAP_URL");
String usuario = ProtonEnvironment.get("SAP_USUARIO");
String senha = ProtonEnvironment.get("SAP_SENHA");
setLog("Ambiente: " + ProtonEnvironment.getName());
if (ProtonEnvironment.isProduction()) {
setLog("Ejecución en producción: sin guardar documento de prueba");
}
Método (ProtonEnvironment) | Qué hace |
|---|---|
get(nome) y get(nome, allowEmpty) | Valor de la variable; error si no existe o está vacía (allowEmpty = true acepta "") |
getAll() | Todas las variables, solo lectura; vacío sin ambiente o fuera de Proton |
getName() | Nombre del ambiente; null sin ambiente o fuera de Proton |
isProduction() | Si el ambiente tiene la marca de producción |
mask(texto) | El texto con los valores del ambiente reemplazados por •••••• |
load() y reload() | Lee el ambiente una vez; reload() lo vuelve a leer |
En los ambientes, usa los mismos nombres de variables (SISTEMA_URL en Homologación y en Producción):
el script lee siempre el mismo nombre, y el ambiente decide el valor. Solo lo que cambia de comportamiento en
producción usa la marca de producción. El nombre se compara exactamente, distinguiendo mayúsculas y
minúsculas.
Una lectura por ejecución
La SDK le pide el ambiente a Proton una vez por ejecución, en start_component() (Python) o en
startComponent() (Java), y guarda todo en memoria. Sin esa llamada, la lectura ocurre en el primer acceso
al ambiente. Toda la ejecución usa los mismos valores, aunque alguien modifique el ambiente a mitad de
camino.
Los valores nunca van al disco, al log ni a las variables del proceso. La salida de la ejecución recibe solo una línea con el nombre del ambiente y la cantidad de variables.
Proton entrega el ambiente solo mientras la ejecución está en curso. La lectura usa el mismo token y el mismo permiso que las otras rutas de la ejecución (Ejecuciones: ver).
Errores
La lectura por nombre nunca devuelve un valor vacío en lugar de un error: detiene el script con
ProtonEnvironmentError (Python) o ProtonEnvironmentException (Java). El mensaje indica la variable y el
ambiente, nunca el valor.
Desde la 5.5.0, el ejecutor de componentes cuenta este error como falla de ambiente. En Java, no lo
confundas con ProtonEnvironmentError (5.5.0), que el paso lanza para marcar la falla de ambiente: consulta
Estado de la ejecución. En Python, esa excepción del paso se llama
ProtonEnvironmentFailure: consulta Estado de la ejecución.
Motivo (reason) | Cuándo |
|---|---|
environmentVariableNotFound | El ambiente no tiene la variable |
emptyVariable | La variable existe, pero está vacía |
runWithoutEnvironment | La ejecución no tiene ambiente: define el ambiente predeterminado del dataset o elige uno al disparar la ejecución |
notProtonExecution | Lectura por nombre fuera de una ejecución de Proton |
runAlreadyFinished | La ejecución ya terminó |
datasetRunNotFound | La ejecución no existe en la organización del token |
httpError | Sin acceso (HTTP 401 o 403: revisa el token y el permiso), otro estado o sin respuesta |
Una falla en la lectura hecha al abrir el paso no derriba el componente: la automatización que no usa el ambiente sigue con normalidad, y el error vuelve en el primer acceso al ambiente, incluso en el nombre y en la marca de producción. Así, una falla de red no se convierte en "no es producción".
Máscara en los logs
Proton no le dice a la SDK qué variables son secretas, así que la SDK enmascara todos los valores del
ambiente en lo que envía al log de la ejecución: cada valor pasa a ser ••••••, del más largo al más corto.
- Los valores con menos de 4 caracteres no se enmascaran; si no, el log se vuelve ilegible. No guardes secretos con menos de 4 caracteres.
- Los parámetros de salida se registran tal como vinieron: se escriben a propósito.
- Lo que el script imprime por su cuenta no pasa por la SDK. Para eso, usa
mask_environment_values(Python) oProtonEnvironment.mask(Java).
De la categoría del dataset al ambiente
En Proton 4, el script decidía la dirección, el usuario y la contraseña según la categoría del dataset. En Proton 5 el dataset no tiene categoría: las funciones de categoría están obsoletas y avisan en el log. Lee los valores del ambiente:
- Python
- Java
# Antes (Proton 4)
if get_dataset_category_name() == "PRD":
url = "https://sistema.empresa.com.br"
else:
url = "https://sistema-hml.empresa.com.br"
# Después (Proton 5)
url = get_environment_value("SISTEMA_URL")
// Antes (Proton 4)
String url = "PRD".equals(ProtonAutomation.getDatasetCategory()) ? URL_PRD : URL_HML;
// Después (Proton 5)
String url = ProtonEnvironment.get("SISTEMA_URL");
No compares el nombre del ambiente con la antigua categoría: es texto libre ("Producción", "PRD", "Homologación 2"). Para lo que cambia de comportamiento en producción, usa la marca de producción.