Olá, Felipe.
Sobre a primeira pergunta, não é exatamente antes de QUALQUER linha de código, mas sim antes de determinada funcionalidade.
Tomemos, como exemplo, o caso em que eu quero garantir que uma pessoa não pode dar mais de um lance consecutivamente. Primeiro eu penso no teste, onde tem os lances A, B e C, sendo A e B da pessoa X, e o C da pessoa Y; a partir do segundo lance eu verifico se o lance anterior não é da mesma pessoa que está dando o lance atual; dou o primeiro lance pra X, o segundo lance pra X também e o terceiro lance pra Y; dou um assert em que a lista deve ter tamanho 2, outro assert pra verificar que o primeiro lance é de X e o segundo é de Y.
Ok, pensei nisso aí tudo e fiz esses asserts e tal, mas ainda não há essa regra implementada lá dentro do método void propoe, que por enquanto só tem "lances.add". Se você rodar o teste que citei, vai falhar, exatamente porque não tem as regras ainda. Mas, se lá dentro do método propõe você colocar uma regra tipo "só adicione na lista, se o usuário anterior não for o mesmo deste", e depois disso rodar o teste, vai dar certo.
Com isso, a gente pode até notar que, o TDD não é apenas "fazer o teste antes da funcionalidade", mas sim pensar em como a funcionalidade deve ser feita. Espero que o que eu tenha dito esclareça sua dúvida. Se não, eu ou outra pessoa vai tentar explicar melhor.
Abraço.