Introducción a Robot Framework
Robot Framework es un framework de código abierto para automatización de pruebas basado en palabras clave, diseñado para pruebas de aceptación y desarrollo dirigido por pruebas de aceptación (ATDD). Desarrollado en Python, ofrece una sintaxis simple y legible que hace que la automatización de pruebas sea accesible tanto para miembros técnicos como no técnicos del equipo.
El enfoque basado en palabras clave del framework permite a los testers crear casos de prueba usando palabras clave de alto nivel, abstrayendo detalles complejos de implementación en componentes reutilizables. Esta metodología reduce significativamente la curva de aprendizaje y promueve la colaboración entre desarrolladores, testers y stakeholders del negocio.
¿Por Qué Elegir Robot Framework?
Ventajas Principales:
- Independencia de Plataforma: Funciona en Windows, macOS y Linux
- Agnóstico de Tecnología: Soporta pruebas web, móvil, API, escritorio y base de datos
- Arquitectura Extensible: Fácil integración con bibliotecas Python y Java
- Ecosistema Rico: Gran colección de bibliotecas integradas y externas
- Reportes Detallados: Genera reportes HTML y logs detallados automáticamente
- Comunidad Activa: Fuerte soporte comunitario y actualizaciones regulares
Conceptos Fundamentales y Arquitectura
Explicación de las Pruebas Basadas en Palabras Clave
El enfoque basado en palabras clave separa la lógica de prueba de los datos de prueba y la implementación. Cada palabra clave representa una acción o verificación específica:
*** Test Cases ***
Prueba de Login de Usuario
Open Browser https://ejemplo.com chrome
Input Text id:username usuarioprueba
Input Text id:password ClaveSegura123
Click Button id:login
Page Should Contain Bienvenido, usuarioprueba
Close Browser
Arquitectura del Framework
Robot Framework consta de varios componentes clave:
- Datos de Prueba: Escritos en formato texto plano o HTML
- Bibliotecas de Prueba: Implementan palabras clave de bajo nivel (Python/Java)
- Ejecutor de Pruebas: Ejecuta pruebas y genera reportes
- Archivos de Recursos: Almacenan palabras clave y variables reutilizables
Bibliotecas Integradas
Biblioteca | Propósito | Casos de Uso Comunes |
---|---|---|
BuiltIn | Funcionalidad core | Variables, flujo de control, logging |
Collections | Estructuras de datos | Operaciones con listas y diccionarios |
String | Manipulación de cadenas | Validación de texto, formateo |
DateTime | Operaciones fecha/hora | Comparaciones de timestamps |
OperatingSystem | Operaciones archivo/directorio | Validación de archivos, manejo de rutas |
XML | Procesamiento XML | Parsing y validación XML |
Bibliotecas de Prueba Esenciales
SeleniumLibrary para Pruebas Web
SeleniumLibrary es la biblioteca más popular para pruebas de aplicaciones web:
*** Settings ***
Library SeleniumLibrary
*** Variables ***
${BROWSER} Chrome
${URL} https://demo.ejemplo.com
${TIMEOUT} 10s
*** Test Cases ***
Prueba de Búsqueda de Producto
[Documentation] Verificar funcionalidad de búsqueda de productos
[Tags] smoke busqueda
Abrir Aplicacion
Buscar Producto laptop
Verificar Resultados Busqueda laptop
[Teardown] Close Browser
*** Keywords ***
Abrir Aplicacion
Open Browser ${URL} ${BROWSER}
Maximize Browser Window
Set Selenium Timeout ${TIMEOUT}
Buscar Producto
[Arguments] ${nombre_producto}
Input Text css:#search-input ${nombre_producto}
Click Button xpath://button[@type='submit']
Wait Until Page Contains Element css:.results-container
Verificar Resultados Busqueda
[Arguments] ${termino_esperado}
${cantidad}= Get Element Count css:.product-card
Should Be True ${cantidad} > 0
Page Should Contain ${termino_esperado}
RequestsLibrary para Pruebas de API
Las pruebas de API con Robot Framework son directas y poderosas:
*** Settings ***
Library RequestsLibrary
Library Collections
*** Variables ***
${BASE_URL} https://api.ejemplo.com
${API_KEY} tu-clave-api-aqui
*** Test Cases ***
Crear Usuario via API
[Documentation] Probar endpoint de creación de usuario
Create Session api ${BASE_URL}
&{headers}= Create Dictionary
... Authorization=Bearer ${API_KEY}
... Content-Type=application/json
&{data}= Create Dictionary
... username=nuevousuario
... email=nuevousuario@ejemplo.com
... role=tester
${response}= POST On Session api /users
... json=${data} headers=${headers}
Status Should Be 201 ${response}
${json}= Set Variable ${response.json()}
Should Be Equal ${json['username']} nuevousuario
Dictionary Should Contain Key ${json} id
Obtener Detalles de Usuario
[Documentation] Recuperar información de usuario
Create Session api ${BASE_URL}
${response}= GET On Session api /users/1
Status Should Be 200 ${response}
${user}= Set Variable ${response.json()}
Should Not Be Empty ${user['username']}
Should Match Regexp ${user['email']} ^[\\w\\.-]+@[\\w\\.-]+\\.\\w+$
DatabaseLibrary para Pruebas de BD
La validación de base de datos es crucial para pruebas de backend:
*** Settings ***
Library DatabaseLibrary
*** Variables ***
${DB_MODULE} pymysql
${DB_NAME} testdb
${DB_USER} usuarioprueba
${DB_PASS} claveprueba
${DB_HOST} localhost
${DB_PORT} 3306
*** Test Cases ***
Validar Registro de Usuario
Connect To Database ${DB_MODULE} ${DB_NAME} ${DB_USER} ${DB_PASS} ${DB_HOST} ${DB_PORT}
${output}= Execute SQL String SELECT COUNT(*) FROM users WHERE username='usuarioprueba'
Should Be Equal As Integers ${output} 1
@{queryResults}= Query SELECT username, email, status FROM users WHERE id=1
Log Many @{queryResults}
${username}= Set Variable ${queryResults[0][0]}
${email}= Set Variable ${queryResults[0][1]}
${status}= Set Variable ${queryResults[0][2]}
Should Be Equal ${username} usuarioprueba
Should Contain ${email} @ejemplo.com
Should Be Equal ${status} activo
Disconnect From Database
Patrones Avanzados y Mejores Prácticas
Implementación del Modelo de Objeto de Página
Implementar POM en Robot Framework mejora la mantenibilidad:
# Resources/LoginPage.robot
*** Settings ***
Library SeleniumLibrary
*** Variables ***
${LOGIN_URL} https://app.ejemplo.com/login
${USERNAME_FIELD} id:username
${PASSWORD_FIELD} id:password
${LOGIN_BUTTON} xpath://button[@type='submit']
${ERROR_MESSAGE} css:.error-message
*** Keywords ***
Navegar a Pagina de Login
Go To ${LOGIN_URL}
Wait Until Page Contains Element ${USERNAME_FIELD}
Ingresar Credenciales
[Arguments] ${username} ${password}
Input Text ${USERNAME_FIELD} ${username}
Input Text ${PASSWORD_FIELD} ${password}
Hacer Click en Boton Login
Click Button ${LOGIN_BUTTON}
Login Debe Fallar Con Error
[Arguments] ${error_esperado}
Wait Until Page Contains Element ${ERROR_MESSAGE}
Element Text Should Be ${ERROR_MESSAGE} ${error_esperado}
Login Exitoso
[Arguments] ${username} ${password}
Navegar a Pagina de Login
Ingresar Credenciales ${username} ${password}
Hacer Click en Boton Login
Wait Until Location Is https://app.ejemplo.com/dashboard
Pruebas Basadas en Datos
Robot Framework sobresale en pruebas basadas en datos:
*** Settings ***
Library SeleniumLibrary
Resource Resources/LoginPage.robot
*** Test Cases ***
Login Con Múltiples Credenciales
[Template] Prueba Login Con Credenciales
admin@ejemplo.com Admin123! Exitoso
user@ejemplo.com User456! Exitoso
invalido@ejemplo.com incorrecto Credenciales inválidas
test@ejemplo.com ${EMPTY} Contraseña requerida
*** Keywords ***
Prueba Login Con Credenciales
[Arguments] ${username} ${password} ${resultado_esperado}
Navegar a Pagina de Login
Ingresar Credenciales ${username} ${password}
Hacer Click en Boton Login
Run Keyword If '${resultado_esperado}' == 'Exitoso'
... Wait Until Location Contains dashboard
... ELSE
... Login Debe Fallar Con Error ${resultado_esperado}
[Teardown] Close Browser
Bibliotecas Python Personalizadas
Extiende Robot Framework con bibliotecas Python personalizadas:
# BibliotecaPersonalizada.py
from robot.api.deco import keyword
import hashlib
import random
import string
class BibliotecaPersonalizada:
@keyword
def generar_email_aleatorio(self, dominio="ejemplo.com"):
"""Genera una dirección de email aleatoria"""
usuario = ''.join(random.choices(string.ascii_lowercase, k=10))
return f"{usuario}@{dominio}"
@keyword
def hashear_contrasena(self, password, algoritmo="sha256"):
"""Retorna contraseña hasheada"""
if algoritmo == "sha256":
return hashlib.sha256(password.encode()).hexdigest()
elif algoritmo == "md5":
return hashlib.md5(password.encode()).hexdigest()
else:
raise ValueError(f"Algoritmo no soportado: {algoritmo}")
@keyword
def validar_numero_telefono(self, telefono, codigo_pais="+34"):
"""Valida formato de número telefónico"""
telefono = telefono.replace(" ", "").replace("-", "")
if not telefono.startswith(codigo_pais):
telefono = codigo_pais + telefono
return len(telefono) >= 10
Uso en pruebas:
*** Settings ***
Library BibliotecaPersonalizada.py
*** Test Cases ***
Registro de Usuario Con Datos Generados
${email}= Generar Email Aleatorio dominioprueba.com
${password}= Set Variable MiClaveSegura123!
${hashed_pw}= Hashear Contrasena ${password} sha256
Log Email Generado: ${email}
Log Contraseña Hasheada: ${hashed_pw}
# Usar en flujo de registro
Registrar Usuario ${email} ${password}
Prueba Validacion Telefono
${valido}= Validar Numero Telefono 612-345-678 +34
Should Be True ${valido}
Estrategias de Implementación en el Mundo Real
Integración CI/CD
Robot Framework se integra perfectamente con pipelines CI/CD:
# .gitlab-ci.yml
test:
stage: test
image: python:3.9
before_script:
- pip install robotframework
- pip install robotframework-seleniumlibrary
- pip install robotframework-requests
script:
- robot --outputdir results --variable BROWSER:headlessfirefox tests/
artifacts:
when: always
paths:
- results/
reports:
junit: results/xunit.xml
Ejecución Paralela con Pabot
Acelera la ejecución de pruebas usando Pabot:
# Instalar pabot
pip install robotframework-pabot
# Ejecutar pruebas en paralelo (4 procesos)
pabot --processes 4 --outputdir results tests/
# Ejecutar con niveles de prueba específicos
pabot --testlevelsplit --processes 8 tests/
Estructura de Organización de Pruebas
automatizacion-pruebas/
├── tests/
│ ├── api/
│ │ ├── pruebas_usuario.robot
│ │ └── pruebas_producto.robot
│ ├── web/
│ │ ├── pruebas_login.robot
│ │ └── pruebas_checkout.robot
│ └── movil/
│ └── pruebas_app.robot
├── resources/
│ ├── comun.robot
│ ├── palabras_clave_api.robot
│ └── palabras_clave_web.robot
├── libraries/
│ ├── BibliotecaPersonalizada.py
│ └── GeneradorDatos.py
├── data/
│ ├── usuarios_prueba.yaml
│ └── productos_prueba.json
└── results/
├── log.html
├── report.html
└── output.xml
Consejos de Optimización de Rendimiento
1. Usar Esperas Apropiadas
# Malo: Sleep fijo
Sleep 5s
# Bueno: Espera explícita
Wait Until Page Contains Element css:.results timeout=10s
# Mejor: Espera personalizada con condición
Wait Until Keyword Succeeds 10s 1s Element Should Be Visible css:.results
2. Optimizar Localizadores
# Lento: XPath con texto
xpath://*[contains(text(), 'Enviar')]
# Más rápido: CSS directo
css:button[type='submit']
# Más rápido: ID
id:submit-btn
3. Reutilizar Sesiones de Navegador
*** Test Cases ***
Test Suite Setup
[Setup] Open Browser ${URL} ${BROWSER}
Caso de Prueba 1
# Lógica de prueba aquí
Go To ${URL}/pagina1
Caso de Prueba 2
# Lógica de prueba aquí
Go To ${URL}/pagina2
Test Suite Teardown
[Teardown] Close Browser
Comparación con Otros Frameworks
Característica | Robot Framework | Selenium + Python | Cypress | Playwright |
---|---|---|---|---|
Curva de Aprendizaje | Baja | Media | Media | Media |
Basado en Palabras Clave | Sí | No | No | No |
Multiplataforma | Sí | Sí | Limitado | Sí |
Reportes | Excelente | Básico | Bueno | Bueno |
Pruebas API | Sí | Sí | Sí | Sí |
Comunidad | Grande | Muy Grande | Grande | Creciente |
Amigable no técnicos | Sí | No | No | No |
Conclusión
El enfoque basado en palabras clave de Robot Framework proporciona un equilibrio único entre simplicidad y potencia. Su sintaxis legible, extenso ecosistema de bibliotecas y sólidas capacidades de reportes lo convierten en una excelente opción para equipos que buscan implementar automatización de pruebas integral.
El framework brilla particularmente en escenarios que requieren:
- Colaboración de equipos multifuncionales
- Múltiples tipos de pruebas (web, API, móvil, base de datos)
- Documentación detallada de pruebas y reportes
- Adopción gradual de automatización con habilidades técnicas mixtas
Siguiendo los patrones y prácticas descritos en esta guía, los equipos pueden construir soluciones de automatización de pruebas mantenibles y escalables que entreguen valor a largo plazo.
Próximos Pasos
- Instalar Robot Framework:
pip install robotframework
- Instalar SeleniumLibrary:
pip install robotframework-seleniumlibrary
- Crear tu primera suite de pruebas usando los ejemplos anteriores
- Explorar bibliotecas externas en https://robotframework.org
- Únete a la comunidad en Robot Framework Slack y Forum
Comienza pequeño, enfócate en casos de prueba de alto valor y expande gradualmente tu cobertura de automatización usando el enfoque flexible basado en palabras clave de Robot Framework.