Crafting Test-Driven Software with Python