Use when writing acceptance criteria for a task - express each as an observable Given/When/Then that QA can execute, including negative cases
中文简介正在准备中。当前显示原文说明。
Use when data crosses a boundary into your code (file, API, warehouse table, upload, model input or output), when a join or cleaning step can change row counts, or when adding pandera, Great Expectations, Pydantic or dbt checks
中文简介正在准备中。当前显示原文说明。
查看安装方法安装前可以查看交给 AI 代理的指令内容。
Code that trusts its input computes wrong numbers quietly. A contract states what the data must look like at a boundary and stops the pipeline, with a readable message, when it does not. EDA finds the facts (eda-and-data-profiling); contracts keep them true.
Core principle: validate at every boundary, fail loudly with the column and the bad values, and never catch a validation error just to keep going.
| Dimension | Question | Typical check |
|---|---|---|
| Completeness | Are required values present? | not-null on keys and required fields |
| Uniqueness | Is the grain what we think? | unique on the (composite) key |
| Validity | Are values in range and in the allowed set? | ge/le, isin, regex, dtype |
| Consistency | Do columns agree with each other? | shipped_at not null when status == "shipped" |
| Referential integrity | Do foreign keys point at something? | relationship test, anti-join count |
| Timeliness | Is the data fresh and the period complete? | max timestamp within N hours |
| Volume | Is the batch plausibly sized? | row count within a range of recent batches |
Check the columns your logic depends on, not every column — a contract nobody can maintain gets disabled.
| Boundary | Tool (if the repo has none yet) |
|---|---|
| DataFrames inside Python code and tests | pandera (import pandera.pandas as pa; pandera.polars for Polars) |
| Pipeline checkpoints with stored results and docs | Great Expectations (GX Core 1.x) — only if the repo already runs it |
| Single records: API payloads, configs, messages | Pydantic 2 models |
| Warehouse tables built by dbt | dbt data tests and model contracts (sql-analytics-and-dbt) |
Never add a second validation library beside the one the repository uses (rule stack-choice).
import pandas as pd
import pandera.pandas as pa
from pandera.typing import DataFrame, Series
class Orders(pa.DataFrameModel):
order_id: Series[str] = pa.Field(unique=True)
customer_id: Series[str]
amount: Series[float] = pa.Field(ge=0)
status: Series[str] = pa.Field(isin=["placed", "shipped", "refunded"])
shipped_at: Series[pd.Timestamp] = pa.Field(nullable=True)
class Config:
strict = True
coerce = True
@pa.dataframe_check
def shipped_orders_have_a_date(cls, df: pd.DataFrame) -> pd.Series:
return ~((df["status"] == "shipped") & df["shipped_at"].isna())
@pa.check_types(lazy=True)
def clean_orders(raw: DataFrame[Orders]) -> DataFrame[Orders]:
...
lazy=True collects every failure instead of stopping at the first; the SchemaErrors.failure_cases frame names column, check and value.strict = True rejects unexpected columns — a renamed upstream column fails here instead of turning into all-NaN later.coerce = True is a decision: it converts "12" to 12.0, but a value that cannot be coerced still fails. Turn it off where a wrong type means a broken upstream.str (Arrow-backed when PyArrow is installed); keep pandera and pandas versions pinned together and run the schema tests after either moves.def test_orders_schema_rejects_negative_amount() -> None:
bad = valid_orders().assign(amount=[-1.0, 5.0])
with pytest.raises(pa.errors.SchemaErrors) as err:
Orders.validate(bad, lazy=True)
assert set(err.value.failure_cases["column"]) == {"amount"}
One failing-fixture test per rule you add: a rule that never failed a test may not be checking anything.
# ❌ silently duplicates orders when a customer has two rows
df = orders.merge(customers, on="customer_id", how="left")
# ✅ fails immediately if customers is not unique on the key
df = orders.merge(customers, on="customer_id", how="left", validate="many_to_one")
assert len(df) == len(orders)
In SQL, compare COUNT(*) with COUNT(DISTINCT key) before and after the join, or put a unique test on the dimension's key (analytics-result-qa).
import great_expectations as gx
context = gx.get_context(mode="ephemeral")
batch = (
context.data_sources.add_pandas("in_memory")
.add_dataframe_asset("orders")
.add_batch_definition_whole_dataframe("all")
.get_batch(batch_parameters={"dataframe": df})
)
suite = gx.ExpectationSuite(name="orders")
suite.add_expectation(gx.expectations.ExpectColumnValuesToNotBeNull(column="order_id"))
suite.add_expectation(gx.expectations.ExpectColumnValuesToBeBetween(column="amount", min_value=0))
assert batch.validate(suite).success
GX 1.x removed the 0.x CLI (great_expectations init) and DataContext.run_checkpoint patterns; production runs use a ValidationDefinition inside a Checkpoint. Follow the version the repository pins.
class ScoreRequest(BaseModel):
model_config = ConfigDict(extra="forbid")
customer_id: str = Field(min_length=1)
tenure_days: int = Field(ge=0, le=36_500)
plan: Literal["free", "pro", "team"]
Use it for request bodies, job parameters and configuration (pydantic-settings) — not row-by-row over a large frame, which is slow; validate frames with a frame schema.
try: validate(df) except SchemaError: log.warning(...) — the pipeline continues on bad data.validate= on a dimension you assumed unique.还没有评价。欢迎分享你的使用感受。
无需登录即可发表。欢迎分享使用感受、提问,或说明在哪些环境下无法运行。
还没有评论。来写第一条吧。
Use when writing acceptance criteria for a task - express each as an observable Given/When/Then that QA can execute, including negative cases
中文简介正在准备中。当前显示原文说明。
Use when the diff adds or changes an endpoint, resolver, RPC, job or query that takes an object id, a role check, a request binding or a tenant filter - BOLA/IDOR, function-level authorization, mass assignment and tenant scoping
中文简介正在准备中。当前显示原文说明。
Use on every UI change - semantic HTML, labels for controls, keyboard-navigable dialogs/menus, visible focus, and never color as the only signal
中文简介正在准备中。当前显示原文说明。
Use when a task changes any screen, form, dialog, menu or control - Lighthouse/axe scan of the changed screens, a keyboard walk, and the thresholds that fail a task
中文简介正在准备中。当前显示原文说明。
How to work a task returned with review, QA or UAT findings. Use when a task is in need_revision or PR review comments are in your context.
中文简介正在准备中。当前显示原文说明。
Use when the repository keeps its alerting in code, or a person asks for alerts outside TaskTrooper - PrometheusRule YAML, a Cloud Monitoring alert policy in Terraform, a Datadog monitor, each routed to TaskTrooper's alert ingest URL so it opens an incident here
中文简介正在准备中。当前显示原文说明。