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:

  1. Datos de Prueba: Escritos en formato texto plano o HTML
  2. Bibliotecas de Prueba: Implementan palabras clave de bajo nivel (Python/Java)
  3. Ejecutor de Pruebas: Ejecuta pruebas y genera reportes
  4. Archivos de Recursos: Almacenan palabras clave y variables reutilizables

Bibliotecas Integradas

BibliotecaPropósitoCasos de Uso Comunes
BuiltInFuncionalidad coreVariables, flujo de control, logging
CollectionsEstructuras de datosOperaciones con listas y diccionarios
StringManipulación de cadenasValidación de texto, formateo
DateTimeOperaciones fecha/horaComparaciones de timestamps
OperatingSystemOperaciones archivo/directorioValidación de archivos, manejo de rutas
XMLProcesamiento XMLParsing 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ísticaRobot FrameworkSelenium + PythonCypressPlaywright
Curva de AprendizajeBajaMediaMediaMedia
Basado en Palabras ClaveNoNoNo
MultiplataformaLimitado
ReportesExcelenteBásicoBuenoBueno
Pruebas API
ComunidadGrandeMuy GrandeGrandeCreciente
Amigable no técnicosNoNoNo

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

  1. Instalar Robot Framework: pip install robotframework
  2. Instalar SeleniumLibrary: pip install robotframework-seleniumlibrary
  3. Crear tu primera suite de pruebas usando los ejemplos anteriores
  4. Explorar bibliotecas externas en https://robotframework.org
  5. Ú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.