O documento apresenta os principais conceitos e benefícios do desenvolvimento guiado por testes (TDD), incluindo escrever testes antes do código, aumentar a confiabilidade e flexibilidade do software, e desenvolver software de forma incremental. Também discute técnicas como acoplamento vs coesão, padrões de projeto como CRC cards, e ferramentas como JUnit e JMock para TDD.
2. Introdução
Uma leve introdução de como testes
podem criar aplicações confiáveis e ainda sim com
design fácil de ser alterado e expandido e o porque
da necessidade de ser escrever o teste antes.
3. TDD - Presentation
Testes feitos antes do código em si.
Confiabilidade e flexibilidade.
Usado especialmente em agile software,
práticas XP e Scrum projects.
4. TDD - Learning
Desenvolvimento de software como
aprendizado.
“Antecipar as alterações não antecipáveis
(To antecipate unantecipated changes)”
5. TDD - Benefits
Ideia clara do próximo passo.
Escrever componentes pouco
acoplados.
Detectar erros quando “frescos” na
mente.
6. TDD - Benefits
Fazer apenas o necessário.
Deploy contínuo.
Lógica separada do design do código
10. Níves de testes
Acceptance: O sistema está em completo
funcionamento?
Integration: O código funciona contra um
código que não se pode alterar?
Unit: Nossos objetos fazem a coisa certa?
Eles estão funcionando?
11. Ciclo de feedback interno e
externo
Write a Make
Write a failing the
unit test
failing test pass
acceptance
test
Refactor
13. TDD com objetos
Diferenciar os papéis, as responsabilidades e
os colaboradores.
Algumas técnicas como CRC cards podem
ser usadas para reprensentar os papéis.
14. Coupling and cohesion
Acomplamento
Alto
acoplamento: Quando altera-se um
objetos e há necessidade de alterar outros.
Baixoacoplamento: Quando altera-se
objetos e consequentemente, com pouca ou
sem necessidades de alterar outros.
15. Coupling and cohesion
Coesão
Em OO é quando uma classe tem um
propósito bem claro e definido.
16. TDD – web of objects
Em geral, um objeto deve ter apenas uma
ligação com o seu “vizinho”.
Siga as “mensagens”: em Java por
exemplo, para identificar-se os papéis do
sistema usa-se o conceito de interfaces.
Pode-se usar CRC cards para tentar definir
as funcionalidades de um sistema.
17. CRC card
Game Engine
Displays game state Renderer
Updates game state Animator
Resolves collisions Collision Detector
18. TDD with objects
Tell, don’t ask.
Métodos que ao invés de “perguntarem”
para a classe, simplesmente “dizem” o que
a classe deve fazer.
19. Ao invés de usar isso
((EditaSaveCustomizer) master.getModelisable()
.getDockablePanel()
.getCustomizer())
.getSaveItem().setEnabled(Boolean.FALSE));
Use isso
master.allowSavingOfCustomisations();
20. TDD with objects
But sometimes ask.
Algumas vezes é necessário perguntar a
classe o que fazer.
21. Ao invés de usar isso
public void reserveSeats(ReservationRequest request) {
for(Carriage carriage : carriages) {
if (carriage.getSeats().getPercenReserved() <
this.percentReservedBarrier) {
....
}
}
22. Use isso
public void reserveSeats(ReservationRequest request) {
for(Carriage carriage : carriages) {
if (carriage.hasSeatsAvailableWithin(
this.percentReservedBarrier)) {
....
}
}
25. Conclusão
O livro Growing Object-Oriented Software, Guided
by tests inicialmente mostra uma pequena
introdução sobre como crescer de forma
“incremental” usando testes e as principais
ferramentas do mercado.
26. Referências
Livro Growing Object-Oriented Software, Guide By Tests by
Steve Freeman and Nat Pryce. October 2009.
All of ilustrations inside this presentation had taken from the
book above mentioned.
CRC model from
http://www.agilemodeling.com/artifacts/crcModel.htm.
Law of Demeter from
http://en.wikipedia.org/wiki/Law_of_Demeter.