Pronto a migliorare la qualità dei tuoi dati e a ottimizzare i processi di testing con un'automazione potente? Contattaci per una consulenza personalizzata e scopri come la nostra competenza in data engineering e test automation può aiutarti a implementare soluzioni di testing robuste, scalabili e di facile manutenzione con Robot Framework.
Sfruttare un approccio keyword-driven per garantire la qualità e l'affidabilità dei dati nei moderni data stack.
Benvenuti su Tech Station, l'hub di SDG Group dedicato alle ultime innovazioni in data e analytics! In questo articolo, esploriamo Robot Framework, un potente framework open-source per l'automazione dei test. Scopriremo come il suo approccio intuitivo e la sua versatilità lo rendano uno strumento ideale non solo per il testing software tradizionale, ma anche per garantire la qualità e l'integrità dei dati in ecosistemi complessi come Snowflake e dbt Cloud.
Cercavi qualcos'altro? Guarda tutti gli altri contenuti qui.

Robot Framework è un framework di automazione dei test open-source, progettato principalmente per l'acceptance testing e l'acceptance test-driven development (ATDD), supportati dalla Robot Framework Foundation.
Utilizza un approccio keyword-driven di facile comprensione, che permette sia a sviluppatori che a profili non tecnici di scrivere e comprendere le suite di test.
Sebbene sia nato per il testing software, la sua versatilità gli consente di automatizzare una vasta gamma di processi, tra cui applicazioni web, API, database e altre interfacce.
Robot Framework si integra con numerosi strumenti per un'automazione completa senza costi di licenza e supporta l'estensione tramite librerie in Python, Java e altri linguaggi.
I principali vantaggi di Robot Framework
Robot Framework ha una sintassi estremamente versatile e intuitiva che semplifica la creazione e la manutenzione dei test. Inoltre, ogni componente (keyword) è riutilizzabile in diversi script, rendendolo uno strumento potente e modulare.
Uno dei maggiori vantaggi è il testing cross-tecnologia, data la sua integrazione nativa con molteplici sistemi. È possibile testare applicazioni Web (con Selenium), API (con la libreria Requests), applicazioni Mobile (con Appium), e si integra facilmente in pipeline CI/CD (Jenkins, Argo WF) e persino con applicazioni Desktop (con la libreria White).
Robot Framework è la scelta ideale quando:
-
È necessario un framework con una bassa barriera d'ingresso.
-
I progetti coinvolgono membri del team sia tecnici che non tecnici.
-
Si devono automatizzare test in flussi di lavoro complessi e multi-sistema.
-
Sono richiesti test di conformità o di web scraping.
-
È richiesta l'integrazione con tool esistenti come Selenium, Appium o pipeline CI/CD
Prerequisiti e installazione
Robot Framework è implementato in Python, che deve quindi essere installato sulla macchina. Successivamente l'installazione è semplice:
# cross-check that the installation was successful by running
robot --version
Puoi trovare ulteriori informazioni su come fare l'installazione cliccando qui.
Altri requisiti dipendono dai pacchetti e dagli strumenti con cui l'utente desidera integrarlo. Vediamo comunque alcuni casi d'uso specifici nella prossima sezione.
Caso d'uso: testare job con Snowflake e dbt Cloud
Questo esempio descrive come un test di Robot Framework possa essere integrato in un job di dbt Cloud che trasforma e carica dati in un data warehouse Snowflake.
L'obiettivo del test è avviare il job, verificarne lo stato e infine validare i dati trasformati su Snowflake (conteggio righe, valori nulli e coerenza).
Cosa serve prima di iniziare:
- Un progetto dbt Cloud connesso a Snowflake
- Un access token per le API di dbt Cloud
- dbt job ID per la pipeline ETL
- I dettagli dell'account Snowflake (nome account, user, password, database, schema) e le tabelle in cui dbt ha raccolto i dati lavorati
- I robot framework installati (+ Python)
Come implementare il test
Per prima cosa, si crea uno script con estensione .robot.
Library RequestsLibrary
Library snowflake_connector.py
Library Collections
Library OperatingSystem
*** Variables ***
${DBT_API_URL} https://cloud.getdbt.com/api/v2/accounts/<account_id>/jobs/<job_id>/run/
${DBT_JOB_STATUS_URL} https://cloud.getdbt.com/api/v2/accounts/<account_id>/runs
${DBT_AUTH_HEADER} Authorization: Token <your_dbt_api_token>
${SNOWFLAKE_ACCOUNT} myorg.snowflakecomputing.com
${SNOWFLAKE_USER} test_user
${SNOWFLAKE_PASSWORD} test_password
${SNOWFLAKE_DATABASE} TEST_DB
${SNOWFLAKE_SCHEMA} ETL_OUTPUT
${SNOWFLAKE_TABLE} TRANSFORMED_DATA
${JOB_ID} <job_id>
*** Test Cases ***
# define the robot test name, followed by the steps to be executed
Automate ETL Pipeline and Data Validation
Trigger dbt Cloud Job
Fetch dbt Job Status
Validate Transformed Data in Snowflake
*** Keywords ***
Trigger dbt Cloud Job
[Documentation] Trigger the dbt Cloud job via API.
${headers}= Create Dictionary Content-Type=application/json ${DBT_AUTH_HEADER}
${payload}= Create Dictionary cause=RobotFramework Test Run
${response}= POST ${DBT_API_URL} headers=${headers} json=${payload}
Should Be Equal As Strings ${response.status_code} 200
${run_id}= Set Variable ${response.json()["data"]["id"]}
Set Suite Variable ${run_id}
Fetch dbt Job Status
[Documentation] Fetch the dbt job status until completion.
${headers}= Create Dictionary Content-Type=application/json ${DBT_AUTH_HEADER}
${status}= Set Variable running
# check status every 30 secs until job is done
WHILE '${status}' == 'running'
Sleep 30s
${response}= GET ${DBT_JOB_STATUS_URL}/${run_id} headers=${headers}
${status}= Set Variable ${response.json()["data"]["status"]}
Log To Console Current Job Status: ${status}
END
Should Be Equal As Strings ${status} success
Validate Transformed Data in Snowflake
[Documentation] Validate data quality of the transformed table in Snowflake.
Connect To Snowflake ${SNOWFLAKE_ACCOUNT} ${SNOWFLAKE_USER} ${SNOWFLAKE_PASSWORD} ${SNOWFLAKE_DATABASE} ${SNOWFLAKE_SCHEMA}
# 1. Check Row Count
${row_count}= Execute Snowflake Query SELECT COUNT(*) FROM ${SNOWFLAKE_TABLE};
Should Be True ${row_count}[0][0] > 0 Row count should be greater than zero.
# 2. Check for Null Values
${null_count}= Execute Snowflake Query SELECT COUNT(*) FROM ${SNOWFLAKE_TABLE} WHERE critical_column IS NULL;
Should Be Equal As Integers ${null_count}[0][0] 0 No null values allowed in critical_column.
# 3. Check Data Consistency
${mismatched_count}= Execute Snowflake Query
... SELECT COUNT(*) FROM ${SNOWFLAKE_TABLE} WHERE transformed_value < 0;
Should Be Equal As Integers ${mismatched_count}[0][0] 0 No negative values in transformed_value.
Disconnect From Snowflake
È necessario definire anche uno script snowflake_connector.py per connettersi al DWH su Snowflake.
Per eseguire il test, si usa il comando:
Il risultato del test in caso di successo sarà:
dbt Snowflake Test
==============================================================================
Automate ETL Pipeline and Data Validation | PASS |
------------------------------------------------------------------------------
dbt Snowflake Test | PASS |
1 critical test, 1 passed
==============================================================================
In caso di fallimento (es. valori nulli trovati), l'output sarà:
dbt Snowflake Test
==============================================================================
Automate ETL Pipeline and Data Validation | FAIL |
Validate Transformed Data in Snowflake: Expected 0 nulls, but found 3.
------------------------------------------------------------------------------
dbt Snowflake Test | FAIL |
1 critical test, 0 passed
==============================================================================
Caso d'uso: Referential Integrity Check sulle tabelle Snowflake
Un'altra notevole applicazione di Robot Framework è nei controlli di qualità per garantire che tutte le chiavi esterne in una tabella corrispondano a chiavi primarie valide nella tabella correlata.
Prendiamo in considerazione una tabella CUSTOMERS (con chiave primaria customer_id) e una tabella dipendente ORDERS (con customer_id come chiave esterna).
La query di validazione per verificare che ogni customer_id in ORDERS esista in CUSTOMERS è la seguente:
FROM ORDERS o
LEFT JOIN CUSTOMERS c
ON o.customer_id = c.customer_id
WHERE c.customer_id IS NULL;
Per poter effettuare il debug dei fallimenti, è possibile utilizzare le keyword Log To Console o Log durante la definizione del test.
Validate Referential Integrity
[Documentation] Ensure that all foreign keys in ORDERS table match primary keys in CUSTOMERS table.
${invalid_references}= Execute Snowflake Query
... SELECT COUNT(*) FROM ORDERS o LEFT JOIN CUSTOMERS c ON o.customer_id = c.customer_id WHERE c.customer_id IS NULL;
Log To Console Invalid references count: ${invalid_references}[0][0]
Should Be Equal As Integers ${invalid_references}[0][0] 0 All customer_id values must have valid references.
In alternativa, per abilitare il debug, si può eseguire il test con il flag --loglevel impostato su DEBUG:
robot --loglevel DEBUG <name_of_the_test>.robot
Un'altra opzione è generare gli artefatti del test:
robot --outputdir ./logs data_quality.robot
Questo comando salverà un'analisi dettagliata di ogni step nel file log.html e un riepilogo dei risultati in report.html.
Conclusioni
Nel mondo di oggi, dove l'automazione è fondamentale, Robot Framework si distingue come un partner prezioso per migliorare le operazioni e mantenere alta la qualità.
La sua natura estensibile, la facilità d'uso e l'accesso gratuito lo rendono un must-have per l'automazione dei test in molti campi, dalla creazione di software ai controlli sulla qualità dei dati.
Che si tratti di eseguire test su un data warehouse Snowflake, di monitorare job di dbt o di orchestrare processi complessi, Robot Framework offre una soluzione solida che si adatta e cresce con le esigenze dell'utente.