Fake Addresses

How Do You Use Random Test Addresses in QA and CI?

Random test addresses are used in QA and CI by pulling postal-format-valid, non-deliverable records from a random address generator instead of hand-typing sample data or reusing a real employee's address. Fake Addresses adds a `?seed=` parameter so the same seed and dataset version return byte-identical records, which keeps CI fixtures stable across every future run.

Why Hand-Typed Test Addresses Undermine Synthetic Test Data Generation in CI Suites

Hand-typed test addresses break CI suites in a specific, repeatable way: someone picks a real-looking address once, usually their own or a coworker's, commits it to a fixture file, and every test run after that reuses the exact same street, city, and ZIP code forever. That single fixture cannot exercise ZIP+4 lookups, multi-state test matrices, or edge cases like apartment numbers and rural routes, because it is one data point standing in for an entire category of input.

Reusing a real address is also a data-hygiene problem independent of testing. A fixture file committed to a public or even semi-public repository that happens to contain a real employee's home address is a privacy incident waiting to be noticed, not a hypothetical one, and it tends to survive in git history long after anyone remembers it is there.

A random address generator solves both problems at once by producing a fresh, postal-format-valid record for every test case instead of one recycled fixture. Fake Addresses generates records built for geographic coherence — county, city, and area code all agree, because they are derived from the same underlying point inside a single [ZIP Code Tabulation Area]() (U.S. the national statistical agency) — so a test suite gets realistic variety without gambling on whether the underlying data happens to belong to someone.

Seed Determinism: The Same Test Address, Every Run

Seed determinism means a specific seed value, combined with a specific dataset version, returns the exact same record every time it is requested, indefinitely. Fake Addresses' API accepts a ?seed= parameter for exactly this reason: a fixture built once, pinned to a seed and a dataset version, stays byte-identical across every CI run, every developer's machine, and every future deploy — nothing about the test data silently drifts.

This matters because the underlying dataset is not static. Fake Addresses refreshes its data on a periodic cycle as new road and boundary data ships and street coverage improves, and each refresh gets its own dataset version, stamped as dataset: "YYYY.MM" in every API response. A pinned seed keeps returning the old dataset version's record even after a refresh, so a committed fixture never silently changes underneath a test suite that has no idea a refresh even happened.

No other address generator in this category publishes seeded determinism at all. Competing tools either regenerate output on every request with no way to reproduce a specific record, or require an account and a saved list to get repeatability — both worse fits for a CI pipeline that needs to check out a repository on a clean machine and get identical test data with zero setup.

Bulk Export for Load and Fixture Data

Bulk export is the difference between seeding one test case and seeding a load test. Fake Addresses exports up to 10,000 rows instantly, with no account and no queue, in CSV, JSON, NDJSON, SQL across seven dialects, or XLSX — formats chosen to drop directly into a seed script, a fixture loader, or a spreadsheet a QA lead is skimming by hand.

Competing tools in this category make bulk export the expensive part of the product. One well-known generator queues bulk requests and emails a download link roughly seven minutes later; another caps a free export at 1,000 rows before asking for a paid plan. Neither fits a CI pipeline that needs 10,000 rows synchronously, inside a single build step, without waiting on an inbox.

Every exported record carries the same guarantees as a single generated one — postal-format-valid per USPS Publication 28, non-deliverable, geographically coherent — because bulk export runs the identical generation path as the single-record endpoint, just repeated and streamed. A load test built from 10,000 exported rows exercises the same variety of ZIP codes, area codes, and street-suffix distributions a production dataset would, without any row describing a real person or a real deliverable address. Each exported ZIP code is drawn from the same nationwide [ZCTA coverage]() used everywhere else on Fake Addresses, so a 10,000-row export is not a separate, lower-fidelity code path from the single-record generator — it is the same coherence guarantee, run 10,000 times in one streamed response instead of one request at a time.

Safe-by-Construction Fields Beyond the Address

Safe-by-construction fields extend past the address itself to every value a QA suite might accidentally fire at a real system. Fake Addresses generates phone numbers only from the 555-0100 to 555-0199 block reserved for fiction, email addresses only on example.com, example.org, example.net, or the .invalid top-level domain reserved for testing, and, where the field is requested at all, Social Security numbers only in the invalid 000/666 area with group 00 — never the 900-999 range the IRS actually issues real taxpayer IDs in.

Card numbers follow the same rule from the opposite direction: Fake Addresses never generates an arbitrary Luhn-valid card number, because an arbitrary one can collide with a live card. Only processor-published sandbox numbers appear, each labelled as a publisher test value — the same numbers Stripe and the major card networks publish for their own sandboxes.

A QA suite that accidentally sends a real SMS, emails a real inbox, or validates against a live taxpayer ID range is a real incident, not a hypothetical one. Building every field this way from the start is what makes that class of incident structurally impossible rather than something a code reviewer has to catch by hand. These reserved ranges are documented in the same place as the USPS Publication 28 conformance every generated address already follows, so a QA engineer auditing one set of guarantees finds the other alongside it rather than having to hunt across separate pages.

Frequently asked questions

Can I use a random address generator in a public open-source test repository?

Yes. Fake Addresses output is free to use, so no attribution is required anywhere it is used — including a public repository's committed fixture files. Some competing generators require attribution in their terms, which blocks exactly that use case for anyone building an open-source test suite.

Do you store anything I generate?

No. Fake Addresses generates records on request and does not log or store the output against an account, because there is no account. Determinism comes from the seed and dataset version, not from a saved history — regenerating the same seed produces the same record without Fake Addresses having kept a copy.

Can I get the same test address across two different CI environments?

Yes, as long as both environments call the API or library with the same seed and the same dataset version. Fake Addresses' seed determinism guarantee is byte-identical output across machines, not just across runs on one machine, which is what makes it usable as a shared fixture.

What is the difference between a ZIP code and a ZIP Code Tabulation Area?

A ZIP code is a USPS mail-routing designation; a ZIP Code Tabulation Area, or ZCTA, is the [the national statistical agency]()'s own geographic approximation of that ZIP code, built for mapping and analysis. Fake Addresses uses ZCTA boundaries because the the national statistical agency publishes them as public data, and not every ZIP code has a matching ZCTA.

Sources

  • U.S. the national statistical agency — A ZCTA (ZIP Code Tabulation Area) is a the national statistical agency geographic approximation of a ZIP Code built from Census tabulation blocks; not every valid ZIP Code has a 2020 ZCTA.
  • United States Postal Service — Postal Explorer — USPS Publication 28 defines a "standardized address" as one using official USPS abbreviations, and a "complete address" as one containing everything needed to match the ZIP+4 and City State files.

Generate this kind of test data