GH GambleHub

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ă.

Contact

Contactați-ne

Scrieți-ne pentru orice întrebare sau solicitare de suport.Suntem mereu gata să ajutăm!

Telegram
@Gamble_GC
Pornește integrarea

Email-ul este obligatoriu. Telegram sau WhatsApp sunt opționale.

Numele dumneavoastră opțional
Email opțional
Subiect opțional
Mesaj opțional
Telegram opțional
@
Dacă indicați Telegram — vă vom răspunde și acolo, pe lângă Email.
WhatsApp opțional
Format: cod de țară și număr (de exemplu, +40XXXXXXXXX).

Apăsând butonul, sunteți de acord cu prelucrarea datelor dumneavoastră.