Testarea conductelor de date
1) De ce conducte de date de testare
Conducte de date (ingera → transforma → servi) - o infrastructură critică pentru raportare, ML și soluții operaționale. Erorile se transformă în valori incorecte, semnale de fraudă și pierderi monetare. Testarea oferă:- Corectitudine şi rezistenţă.
- Modificări previzibile (schemă/evoluție logică).
- Respectarea SLO în termeni de prospețime, completitudine, latență.
- Eliberare rapidă (viteza de eliberare) datorită verificării automate.
2) Piramida de testare a datelor
De jos în sus: o mulțime de teste locale rapide → mai puțină integrare → un pic end-to-end.
1. Teste unitare de transformări (funcții, UDF, vizualizări SQL, modele dbt).
2. Teste de calitate a datelor (reguli de prospețime/completitudine/unicitate/gamă).
3. Contracte și scheme (scheme/teste contractuale, evoluție).
4. Testele de integrare a conductelor (DAG: ingera stocarea ↔ ↔ transforma marte ↔).
5. teste E2E (sursa pentru storefront/API), inclusiv drepturi (RLS/CLS) și export.
6. Încărcare/capacitate (volum, viteză, cost-pentru-servire).
7. Teste de haos de date (întârzieri, duplicate, out-of-order, indisponibilitate).
3) Tipuri de teste: ce anume verificăm
3. 1 Încercări logice unitare
Funcții de transformare netă; bazate pe proprietăți (invarianți: idempotență, monotonie).
SQL/DBT: compararea rezultatului cu setul standard (de aur), interdicția „SELECT”, verificarea filtrului în timp.
3. 2 Teste de calitate a datelor (DQ)
Prospețime: întârziere fereastră ≤ prag țintă.
Exhaustivitate: cantitatea preconizată/procentul de ocupare.
Unicitate: chei fără duplicate.
Reguli de domeniu: intervale, integritate referențială, invarianți de afaceri.
Anomalii: outliers, explozii de duplicate, lipsuri de timp.
3. 3 Contracte și scheme
Schimbarea compatibilităţii (SemVer: MAJOR/MINOR/PATCH).
Disponibilitatea coloanelor, tipurilor, restricțiilor obligatorii.
Semantica KPI fixă: formule și ferestre de agregare.
3. 4 Integrare și E2E
Integritatea DAG: declanșatoare, dependențe, repetare idempotentă.
Traseu complet: sursă marte curate brute BI/API; RLS/CLS.
3. 5 Performanță și costuri
p95/p99 job latency, throughput (rânduri/s), volum/valoare.
Teste de regresie a performanței și limite de scanare.
3. 6 Securitate și confidențialitate
Mascare PII/PCI (tokenizare deterministă).
RLS/CLS Check - Utilizatorii văd doar propria lor.
Export/instantanee: fără câmpuri personale „brute”.
4) Specificul streaming-ului (Kafka/Flink/Spark Structured Streaming)
Filigrane și întârziere: teste de ferestre cu evenimente târzii (T + Δ), recalculări corecte.
Exact-o dată în sensul: dedup prin 'event _ id', intrare idempotent (upsert/îmbinare).
Out-of-order: invarianți pentru agregate prin 'event _ time'; fix 'ingested _ at'.
Pierdere/repetare: simulați o picătură/joc de părți, verificați corectitudinea vitrinelor.
5) Idempotența și determinismul (ce și cum să testați)
Repornirea unui pas dă același rezultat (cu aceiași parametri de fereastră).
Înregistrare - prin montare și swap atomic.
Îmbinarea logicii cu SCD1/SCD2 este acoperită de ultimele câștiguri, prioritatea sursă.
Determinacy UDF/agregat: aceleași intrări → aceleași ieșiri.
6) Gestionarea datelor de testare
Seturi de date de aur: standarde mici cu validare manuală.
Sintetice + fabrici de date: acoperă marginile domeniului (null-uri, valori extreme, Unicode, TZ).
Eșantioane prod de-identificate: potrivire de confidențialitate.
Ficțiuni stratificate: evenimente brute, straturi intermediare, vitrine finale.
7) Contracte de date - Exemplu și Reguli
Contract YAML (simplificat):yaml dataset: orders schema:
- name: order_id; type: string; unique: true
- name: user_id; type: string; not_null: true
- name: amount; type: decimal(18,2); min: 0
- name: event_time; type: timestamp; tz: UTC freshness_sla: 10m dq_rules:
- "pct_null(user_id) < 0. 1%"
- "duplicates(order_id) = 0"
- "sum(amount) >= 0"
evolution:
allowed_minor_additions: true breaking_changes_require: approval: 'data-governance'
actions_on_violation:
- quarantine_partition
- replay_last_60m
8) Teste de observabilitate și SLO
Valori de export: prospețime, completitudine, unicitate, latență la Grafana/Prometheus.
Alerte SLO ca "red' teste de unitate în prod (sintetice).
Rapoarte de regresie: „după eliberarea X p95 ↑ cu 40%”.
9) CI/CD și mass-media
CI: contracte unitare + DQ + PR; schema-diff; Analiza statică SQL (linter).
Sandbox/staging: rulați integrarea și e2e, teste de haos cu date sigure.
Caracteristici-steaguri: canar jabs/modele/formule.
Catalogare: versiune de scheme, formule KPI, descendență; actualizarea automată a documentației.
10) Testarea datelor haosului (Haos-Data)
Injectarea de duplicate/omisiuni, întârzieri, out-of-order.
Broker/picătură de partid, fișiere „rupte”, derivă schemă.
Validăm: auto-reparații (reluare/rambursare), carantină și alerte, date MTTR.
11) Încărcare și cost
Generatoare de trafic cu profil p95/vârfuri.
Limite de scanare/pas (octeți scanați, capace de timp).
A/B profiler valoare: „vechi” vs „nou” model/interogare.
12) Instrumente (clase de probă)
DQ/Contracte: teste dbt, Așteptări mari, Dequ, Soda, Lintere personalizate.
Orchestrație: Airflow/Dagster/Argo/Prefect (operatori pentru teste la fiecare pas).
Platforme: BigQuery/Fulg de zăpadă/Deplasare spre roșu/ClickHouse/Delta/Iceberg/Hudi.
Streaming: Kafka, Flink, Spark Streaming; TestContainers pentru medii locale.
Observabilitate: Prometheus/Grafana/Otel; Directoare DataHub/Amundsen/Collibra.
13) Antipattern
„Nu este nimic de testat - este doar SQL”: nu există unități și DQ → metrics break.
Numai E2E: lent, instabil, cauzele defecțiunilor nu sunt clare.
SELECT: se rupe sub evoluția MINOR.
Citirea live a OLTP în teste: instabilitate și fulgi.
Lipsa seturilor de aur: nimic de comparat cu rezultatele.
Fără teste de idempotență: reluarea strică datele.
Streaming uitat: nu este testat întârziere/out-of-order/redelivery.
14) Foaia de parcurs privind implementarea
1. Bază: teste unitare de transformări, seturi de aur, SQL linter, top-10 reguli DQ vitrină.
2. Contracte: schema-diff în CI, SemVer, verificări automate de compatibilitate.
3. Integrări: teste DAG, idempotency, e2e pentru fluxuri critice.
4. Streaming: filigrane/lateness, teste dedup/idempotent chiuvete.
5. SLO și haos: valori de calitate în vânzări, alerte, scenarii de haos, obiective MTTR.
6. Optimizare: regresii perf, paznici bugetari, lansari canare.
15) Lista de verificare pre-eliberare
- Testele de unitate acoperă transformările cheie și UDF-urile.
- Regulile DQ pentru prospețime/completitudine/unicitate/intervale trec.
- Contractele și schema-diff sunt verzi; nu există schimbări de rupere fără aprruv.
- Idempotency testat; lucrări de chiuvetă/îmbinare atomică.
- Streaming: filigrane/date târzii/out-of-order acoperite; dedup în loc.
- Măsurătorile SLO sunt expuse; alertele sunt configurate; runbooks sunt.
- Datele de testare sunt sigure; PII mascat; RLS/CLS verificat.
- Nu există regresii perf; scanare/limite de timp îndeplinite.
- Testele de haos ale scenariilor de bază au trecut; Obiectivul MTTR este realizabil.
16) Mini șablon exemple
16. 1 test de unitate SQL (pseudo-dbt):
sql
-- tests/assert_positive_amount. sql select count() as c from {{ ref('fct_payments') }}
where amount < 0 having c = 0
16. 2 Stil de așteptări mari:
yaml expect_table_row_count_to_be_between:
min_value: 1000 mostly: 0. 99 expect_column_values_to_not_be_null:
column: user_id expect_column_values_to_be_unique:
column: txn_id
16. 3 Verificarea întârzierii în flux (pseudo-cod):
python emit(events_out_of_window <= threshold)
emit(reprocessed_events == late_events_detected)
16. 4 Contract-test (schema-diff CI):
bash schema-diff --current models/orders. yml --target prod_schema. yml --semver
17) Linia de jos
Testarea conductelor de date este o disciplină a sistemelor, nu o colecție de verificări fragmentare. Combinați o piramidă de teste, contracte și observabilitate cu practici de idempotență, evoluție a circuitului și invarianți de streaming. Apoi, eliberările vor deveni rapide, incidentele vor deveni rare și scurte, iar încrederea în date va deveni sustenabilă.