If you're building a modern data platform, you've likely encountered both Great Expectations and dbt tests. Both are powerful tools for data quality validation, and both have passionate communities behind them. But here's the question I hear constantly from data teams: which one should we use?
The short answer? It depends on what you're testing and where in your pipeline you're testing it. The longer answer—which I'll walk through in detail—is that these tools often complement each other rather than compete.
Understanding the Fundamentals
Before diving into decision criteria, let's establish what each tool actually does and where it fits in your data ecosystem.
dbt Tests: Built for Transformation Validation
dbt (data build tool) tests are lightweight SQL assertions that validate your data models during or after transformation. They're written in YAML or SQL and run within your data warehouse. dbt offers four built-in generic tests out of the box:
unique- ensures column values are uniquenot_null- verifies no null values existaccepted_values- checks values against a predefined listrelationships- validates foreign key constraints
You can also write custom tests in SQL or use community packages like dbt-expectations (which, confusingly, brings Great Expectations-style tests to dbt) or dbt-utils for more sophisticated validations.
Great Expectations: Purpose-Built for Data Quality
Great Expectations (GE) is a standalone Python framework designed specifically for data validation, documentation, and profiling. It works with data wherever it lives—data lakes, warehouses, databases, even flat files. GE provides hundreds of built-in expectations (their term for tests) and generates rich data documentation automatically.
Great Expectations operates through:
- Expectation Suites - collections of expectations for a dataset
- Checkpoints - execution points that validate data
- Data Docs - automatically generated documentation
- Validation Results - detailed pass/fail information with statistics
When to Use dbt Tests
dbt tests shine in specific scenarios where their tight integration with your transformation workflow provides maximum value with minimal overhead.
1. Testing Transformed Models in Your Warehouse
If you're validating data that dbt creates or transforms, dbt tests are the natural choice. They run in the same environment, use the same connection, and fit seamlessly into your dbt build or dbt test workflow.
models:
- name: customers
columns:
- name: customer_id
tests:
- unique
- not_null
- name: customer_status
tests:
- accepted_values:
values: ['active', 'inactive', 'pending']2. Enforcing Data Contracts Between Models
When you need to validate relationships between your transformed tables—ensuring referential integrity after transformations—dbt's relationships test is purpose-built for this:
- name: order_customer_id
tests:
- relationships:
to: ref('customers')
field: customer_idThis validates that every order_customer_id exists in your customers table, maintaining referential integrity within your warehouse.
3. Lightweight, Fast Validation
dbt tests are SQL queries. They're fast, they scale with your warehouse compute, and they don't require additional infrastructure. For teams with straightforward validation needs—especially those already using dbt—the simplicity is compelling.
4. Testing as Part of Your CI/CD Pipeline
Since dbt tests integrate natively with dbt workflows, they're trivial to include in continuous integration. Run dbt build --select state:modified+ in your CI pipeline, and you're testing only the models that changed. No additional orchestration needed.
When to Use Great Expectations
Great Expectations becomes the better choice when you need more sophisticated validation, better documentation, or validation outside your transformation layer.
1. Testing Raw Data Before Transformation
One of the most important places to validate data is at ingestion—before it enters your transformation pipeline. If source data is corrupted, catching it early prevents bad data from cascading through your models.
Great Expectations excels here because it can validate data anywhere: S3 buckets, API responses, Kafka streams, or staging tables before dbt touches them. This "shift left" approach to data quality prevents issues rather than just detecting them downstream.
validator.expect_column_values_to_be_between(
column="revenue",
min_value=0,
max_value=10000000
)
validator.expect_column_values_to_match_regex(
column="email",
regex=r"^[\w\.-]+@[\w\.-]+\.\w+$"
)2. Complex Statistical Validation
When you need to validate statistical properties of your data—distribution checks, quantile analysis, correlation validation—Great Expectations provides sophisticated built-in expectations that would be cumbersome to write in SQL:
expect_column_mean_to_be_betweenexpect_column_quantile_values_to_be_betweenexpect_column_kl_divergence_to_be_less_thanexpect_compound_columns_to_be_unique
These kinds of tests help you detect data drift, anomalies, or subtle quality degradation that simple null/unique checks miss.
3. Rich Documentation and Reporting Requirements
Great Expectations automatically generates Data Docs—beautiful, browsable documentation showing all your expectations, validation results, and data quality trends over time. For teams that need to demonstrate data quality to stakeholders, auditors, or business users, this documentation is invaluable.
While dbt also generates documentation, its focus is on lineage and model descriptions. GE's docs are specifically about data quality metrics and validation history.
4. Multi-Source Data Quality Standards
If your organization processes data from multiple sources (not just your warehouse), Great Expectations provides a unified validation framework. You can define expectation suites once and apply them across different data stores, creating consistent quality standards regardless of where data lives.
The Hybrid Approach: Using Both Together
Here's my practical recommendation for most data teams: use both tools in complementary ways.
A Layered Testing Strategy
Think of data quality testing in layers:
Layer 1: Source Data Validation (Great Expectations)
Validate raw data immediately after ingestion, before transformation. Check schemas, value ranges, statistical properties, and business rules.
Layer 2: Transformation Logic (dbt Tests)
Validate that your transformations produce expected results. Check uniqueness, relationships, and business logic on transformed models.
Layer 3: Critical Business Metrics (Great Expectations or dbt)
Validate your most important aggregated metrics and KPIs. Either tool works here—choose based on complexity needs.
Example Architecture
Raw Data → GE Checkpoint → Staging Tables → dbt → Models → dbt Tests
↓
Core Metrics → GE CheckpointThis approach catches issues early (at ingestion) while also validating transformation logic and critical outputs.
Decision Framework
Still unsure which tool to use? Ask yourself these questions:
Choose dbt tests when:
- You're already using dbt for transformations
- You're testing data that dbt creates or transforms
- Your validation needs are straightforward (nulls, uniqueness, relationships)
- You want minimal additional infrastructure
- Fast iteration speed is critical
Choose Great Expectations when:
- You need to validate data before or outside dbt
- You require complex statistical validation
- You need comprehensive data quality documentation
- You're validating data across multiple systems
- You need to detect data drift or anomalies
- Stakeholders require detailed quality reporting
Choose both when:
- You want defense-in-depth data quality (you should want this)
- You have both simple and complex validation needs
- You validate data at multiple pipeline stages
- You can invest in integrating both tools
Practical Implementation Advice
If you're starting from scratch, here's my recommended approach:
Start with dbt tests. If you're already using dbt, begin with its native tests. They're easy to implement, require no additional setup, and cover the majority of common validation needs. Get comfortable with testing transformed models first.
Add Great Expectations when you hit limitations. Once you encounter scenarios where dbt tests feel cumbersome—complex statistical checks, source data validation, or documentation requirements—introduce Great Expectations strategically for those specific use cases.
Don't overthink it. The best data quality tool is the one you actually use. Start simple, test consistently, and add sophistication as your needs grow.
Final Thoughts
The "Great Expectations vs dbt tests" debate often presents a false choice. These tools have different strengths and work better together than in competition. dbt tests provide lightweight, transformation-focused validation tightly integrated with your modeling workflow. Great Expectations offers comprehensive, sophisticated validation across your entire data ecosystem.
The right answer for your team depends on your specific needs, existing tooling, and data quality maturity. But for most modern data teams, the answer isn't "either/or"—it's "both, applied thoughtfully."
Choose the right tool for each job, layer your quality checks strategically, and remember: any testing is better than no testing. Start somewhere, iterate, and build the data quality practice your organization deserves.