| name | test-structural-invariants |
| description | For data structure validation: test lengths, relationships, constraints that must hold, verify setup is correct. |
test-structural-invariants
When to Use
- After building complex data structures
- Verifying precomputed relationships
- Checking initialization is correct
- Invariants that should always hold
When NOT to Use
- Simple data
- No structural constraints
- Runtime performance critical
The Pattern
Assert properties that must be true about your data structures.
def test_structure():
assert len(items) == EXPECTED_SIZE
assert all(condition(item) for item in items)
assert set(keys) == expected_keys
for a, bs in graph.items():
for b in bs:
assert a in graph[b]
Example (from pytudes)
def test():
"""A set of tests that must pass."""
assert len(squares) == 81
assert len(unitlist) == 27
assert all(len(units[s]) == 3 for s in squares)
assert all(len(peers[s]) == 20 for s in squares)
assert units['C2'] == [
['A2', 'B2', 'C2', 'D2', 'E2', 'F2', 'G2', 'H2', 'I2'],
['C1', 'C2', 'C3', 'C4', 'C5', 'C6', 'C7', 'C8', 'C9'],
['A1', 'A2', 'A3', 'B1', 'B2', 'B3', 'C1', 'C2', 'C3']
]
assert peers['C2'] == set([...20 peers...])
print('All tests pass.')
def tests():
assert make_Apowers(6, 10) == {
1: [1],
2: [8, 16, 32, 128],
3: [27, 81, 243, 2187],
...
}
assert make_Czroots(make_Apowers(5, 8)) == {1: 1, 8: 2, 16: 2, ...}
assert 3 ** 3 + 6 ** 3 in Czroots
assert 99 ** 97 in Czroots
assert 101 ** 100 not in Czroots
def unit_tests():
assert len(WORDS) == 32198
assert sum(WORDS.values()) == 1115585
assert WORDS.most_common(10) == [
('the', 79809), ('of', 40024), ('and', 38312), ...
]
Key Principles
- Test after construction: Verify build was correct
- Size invariants: Expected counts
- Relationship invariants: Things that must be connected
- Specific examples: Check known cases manually
- Use
all() for universal checks: Clean assertion syntax