Data Quality & Testing
Great Expectations, Soda Core, dbt tests, Pandera — assertions and contracts on your data.
Catch bad data before dashboards lie or ML models drift. This page is about assertions you write; for monitoring data freshness and anomalies in production, see Data Observability. For lineage and discoverability, see Data Catalog & Lineage.
In-warehouse / SQL-native
- ★ dbt tests —
not_null,unique,accepted_values, relationships; plus singular tests as plain SQL files. Free with dbt-core. The default if you already model with dbt. - ★ dbt-expectations — Great Expectations–style assertions packaged as dbt tests (
expect_column_values_to_be_between, distribution checks, etc.). - dbt-utils tests — common parameterized tests on top of dbt-core.
- SQLMesh audits — built-in
AUDITsyntax with row-level expressions; see Data Transformation & Modeling.
Standalone frameworks
- ★ Great Expectations — Python-first; catalogs of "expectations" against pandas / Spark / SQL data; HTML data docs. Apache 2.0. The classic; v1.x in 2025 simplified the API significantly.
- ★ Soda Core — YAML-style checks (SodaCL) over SQL warehouses; lightweight CLI runs; Apache 2.0. Hosted Soda Cloud is paid. Often preferred over Great Expectations for "just SQL" teams.
- Elementary Data — runs over dbt artifacts; see Data Observability (overlaps both categories).
- Datafold's data-diff — diff two tables / two warehouses; MIT; great for migrations.
Python-frame validation
- ★ Pandera — schema validation for pandas, Polars, PySpark, Modin, Dask. MIT. The default "Zod for DataFrames."
pandas_dq,pyjanitor— pandas-specific QC helpers.- Cerberus — generic Python validation library; works on dicts/JSON.
- Pydantic v2 — for typed Python objects, including post-load validation; see Validation.
Profiling / EDA-as-quality
- ★ ydata-profiling (formerly pandas-profiling) — one-line HTML report with summary stats, correlations, missing-value heatmaps. MIT. Excellent first-look quality check.
- Sweetviz — comparative profiling (train vs. test); BSD-3.
- AutoViz — auto-generates EDA charts; Apache 2.0.
- See Data Exploration & EDA for more.
File / schema-level
- Frictionless — Table Schema / Data Package validation for CSV / JSON / Parquet datasets. MIT. Great for open-data / public datasets.
- JSON Schema + AJV — for API payload validation; see Validation.
- Apache Avro / Protobuf schemas — enforced at the broker level via schema registry; see Message Brokers.
JVM / Spark
- Apache Griffin — Spark-based data-quality framework; Apache 2.0; less active in 2026.
- Deequ (Amazon) — Spark-based; Apache 2.0; mature for Spark-heavy teams.
Patterns to adopt
- Tests live with the model. Schema YAML next to the SQL file; review them in the same PR.
- Three test classes.
- Schema: types, nullability, primary keys.
- Business: invariants ("never a negative order amount").
- Freshness: max(updated_at) within SLA.
- Fail loud on critical, warn on soft. dbt's
severity: warnvserrormodel. - Test sources, not just marts. Bad data ingested is bad data downstream. Apply contracts at the boundary.
- Test before transform on critical paths. Consider dbt's
--store-failuresto keep a row-level audit of who failed. - Don't test what's already typed. If the warehouse enforces it, don't re-test it.
Pick this if…
- You already use dbt: dbt tests + dbt-expectations + Elementary.
- You want SQL YAML with no framework lock-in: Soda Core.
- Heavy pandas / Polars pipelines: Pandera.
- Open data / file-level packaging: Frictionless.
- One-shot data exploration / new dataset triage: ydata-profiling.
- You need both quality and observability in one: Soda Cloud or Elementary's hosted edition.