These are examples of how to use naming conventions and grouping to write unit tests in a highly readable manner, resembling a specification so that the reader may more easily gain an understanding of the code being tested.
The examples here are fleshed out and runnable versions based on those described in the talk "Structure and Interpretation of Test Cases" by Kevlin Henney
The tests and code are also developed incrementally following the Test Driven Development approach.
See below for test output
Structure and Interpretation of Test Cases
% pytest -v
============================= test session starts ==============================
platform linux -- Python 3.12.4, pytest-8.2.2, pluggy-1.5.0 -- /home/me/PycharmProjects/literate-testing-python/.venv/bin/python
cachedir: .pytest_cache
rootdir: /home/me/PycharmProjects/literate-testing-python
configfile: pytest.ini
testpaths: tests
plugins: relaxed-2.0.2
collecting ... collected 38 items
LeapYearSpec
A year is a leap year
if it is divisible by 4 but not by 100[2004]
if it is divisible by 4 but not by 100[1984]
if it is divisible by 4 but not by 100[4]
if it is divisible by 400[2000]
if it is divisible by 400[1600]
if it is divisible by 400[400]
A year is not a leap year
if it is not divisible by 4[2022]
if it is not divisible by 4[2019]
if it is not divisible by 4[1999]
if it is not divisible by 4[1]
if it is divisible by 100 but not by 400[2100]
if it is divisible by 100 but not by 400[1900]
if it is divisible by 100 but not by 400[100]
A year is supported
if it is positive[1]
if it is positive[100]
A year is not supported
if it is zero
if it is nagative[-1]
if it is nagative[-4]
if it is nagative[-100]
if it is nagative[-400]
QueueSpec
A new queue
is empty
preserves positive bounding capacity
rejects a zero bounding capacity
rejects a negative bounding capacity
An empty queue
dequeues an empty optional
becomes non empty when value enqueued
A non empty queue
that is not full
becomes longer when value enqueued
becomes full when enqueued up to capacity
that is full
ignores further enqueued values
becomes non full when dequeued
becomes shorter when dequeued
dequeues values in order enqueued
StackSpec
A new stack
is empty
An empty stack
throws when queried for its top item
throws when popped
acquires depth by retaining a pushed item as its top
A non empty stack
becomes deeper by retaining a pushed item as its top
on popping reveals tops in reverse order of pushing
============================== 38 passed in 0.08s ==============================