¿qué es tdd? y algunos consejos para iniciados

42
¿Qué es TDD? Y algunos consejos para iniciados

Upload: alejandro-hernandez

Post on 17-Feb-2017

405 views

Category:

Technology


0 download

TRANSCRIPT

¿Qué es TDD? Y algunos consejos

para iniciados

Alejandro Hernández (@aleherse)

Desarrollador de aplicaciones web

Trabaja en un juego web de estrategia por turnos ambientado en la antigua Grecia.

Creador del proyecto tuprogramaelectoral.es (https://github.com/tuprogramaelectoral/)

¿Qué es TDD?

TEST DRIVEN DEVELOPMENT

DESARROLLO GUIADO POR PRUEBAS

http://www.allaboutcircuits.com/technical-articles/how-test-driven-development-can-help-you-write-better-unit-tests/

¿Qué es TDD?

1.- AÑADE UN TESTfunction it_converts_arabic_numbers_to_roman_numerals(){ $this->fromArabic(1)->shouldReturn('I');}

¿Qué es TDD?

2.- EJECUTA LOS TESTS (FALLAN)

¿Qué es TDD?

3.- ESCRIBE SUFICIENTE CÓDIGOclass RomanNumerals{ public function fromArabic($arabic) { return 'I'; }}

¿Qué es TDD?

4.- EJECUTA LOS TESTS (PASAN)

¿Qué es TDD?

5. REFACTORIZAR● Extraer código a un método, clase, colaborador…● Eliminar repeticiones● Generalizar la lógica● Renombrar variables, métodos, clases…● ...

https://refactoring.guru/

¿Qué es TDD?

PILARES FUNDAMENTALES● Implementar únicamente lo que el cliente necesita.

¿Qué es TDD?

PILARES FUNDAMENTALES● Implementar únicamente lo que el cliente necesita.● Minimizar el número de errores que llegan a producción.

¿Qué es TDD?

PILARES FUNDAMENTALES● Implementar únicamente lo que el cliente necesita.● Minimizar el número de errores que llegan a producción.● Implementar código modular, reutilizable y adaptable.

¿Qué es TDD?

PILARES FUNDAMENTALES● Implementar únicamente lo que el cliente necesita.● Minimizar el número de errores que llegan a producción.● Implementar código modular, reutilizable y adaptable.● Aumentar la confianza del equipo en el código.

Roman Numerals Kata Ej: 97 -> XCVII

¡Es hora de escribir código!

TDD como parte de un ecosistema

https://flic.kr/p/ep4Ta

TDD como parte de un ecosistema

BEHAVIOUR DRIVEN DEVELOPMENT

http://blog.andolasoft.com/2014/06/rails-things-you-must-know-about-tdd-and-bdd.html

TDD como parte de un ecosistemaScenario: I successfully select my preferred policy linked to a scope Given I see the list of available "scopes" And I select these scope interests: | sanidad | | turismo | And I see these policies linked to the scope "sanidad" | id | content | | partido-ficticio_sanidad | ## sanidad universal y gratuita | | otro-partido_sanidad | ## sanidad para todos | When I select the linked policy "partido-ficticio_sanidad" Then my programme contains these linked policies: | scope | policy | | sanidad | partido-ficticio_sanidad | | turismo | |

TDD como parte de un ecosistema

EVENT STORMING

http://sch3lp.github.io/2014/07/12/event-storming-exercise/

Consejos para iniciados

● Busca ejemplos relevantes

Consejos para iniciados

● Busca ejemplos relevantes● Escribe tests específicos

Consejos para iniciados

● Busca ejemplos relevantes● Escribe tests específicos● Escribe código que sea cada vez más genérico

Consejos para iniciados

● Busca ejemplos relevantes● Escribe tests específicos● Escribe código que sea cada vez más genérico● Refactoriza pensando como un diseñador/arquitecto

Consejos para iniciados

● Busca ejemplos relevantes● Escribe tests específicos● Escribe código que sea cada vez más genérico● Refactoriza pensando como un diseñador/arquitecto● No tengas miedo a borrar/mover/modificar código

Consejos para iniciados

● Busca ejemplos relevantes● Escribe tests específicos● Escribe código que sea cada vez más genérico● Refactoriza pensando como un diseñador/arquitecto● No tengas miedo a borrar/mover/modificar código● Los tests son código también, haz refactor

Consejos para iniciados

“Act locally. Think Globally.” - Ron Jeffries“Something that is hard to test is badly designed.” - Uncle Bob

Demeter Law

● Habla únicamente con los colaboradores más próximos○ $this->person->getCar()->ignite();

Demeter Law

● Habla únicamente con los colaboradores más próximos○ $this->person->getCar()->getEngine()->ignite();○ $this->person->startCar();

Tell don’t ask

● Escribe el comportamiento donde los datos habitan● Minimiza las interacciones entre objetos

if ($user.isAuthenticated()) {echo “hola de nuevo “ . $user.getName();

} else {echo “bienvenido!”;

}

Tell don’t ask

● Escribe el comportamiento donde los datos habitan● Minimiza las interacciones entre objetos

echo $user->welcomeMessage();

The Transformation Priority Premise

● null to constant● constant to constant+● constant to scalar● statement to statements● unconditional to if● if to while● expression to function

Roman Numerals Kata, contraataca!

Roman Numerals Kata

●● 1 -> I● 2 -> II● 3 -> III● 4 -> IV ??

● 5 -> V● 6 -> VI ??● 7 -> VII● 8 -> VIII● 9 -> IX ??

●● 10 -> X● 20 -> XX● 30 -> XXX● 40 -> XL ??

50 -> L, 100-> C, 500 -> D, 1000 -> M

¡Es hora de escribir código!

Particularidades de phpspec

● Una especificación por cada clase

Particularidades de phpspecclass ScopeSpec extends ObjectBehavior {

function let() { $this->beConstructedWith('Administración Pública');

}

function it_should_have_a_name() { $this->getName()->shouldReturn('Administración Pública');

} }

Particularidades de phpspec

● Una especificación por cada clase● Simulacro (mock) de todos los colaboradores

Particularidades de phpspecfunction it_should_have_policies(

Policy $partyPolicy, Policy $rivalPartyPolicy

) { $this->beConstructedWith(

'Administración Pública', [$partyPolicy, $rivalPartyPolicy] );

$this->getPolicies()->shouldReturn([$partyPolicy, $rivalPartyPolicy]);

}

Particularidades de phpspec

● Una especificación por cada clase● Crea mocks de todos los colaboradores● No sirve para hacer comprobaciones sobre el estado

Particularidades de phpspec

● Una especificación por cada clase● Crea mocks de todos los colaboradores● No sirve para hacer comprobaciones sobre el estado● No se pueden testear métodos privados

Particularidades de phpspec

● Una especificación por cada clase● Crea mocks de todos los colaboradores● No sirve para hacer comprobaciones sobre el estado● No se pueden testear métodos privados● No sirve para escribir tests de integración

Enlaces de interés

Marcello Duarte - Test, Transform, Refactorhttps://www.youtube.com/watch?v=yPX3gZ7xgN8

Marcello Duarte - Barely Enough Design https://www.youtube.com/watch?v=NQN72Big8ww

The Transformation Priority Premise https://blog.8thlight.com/uncle-bob/2013/05/27/TheTransformationPriorityPremise.html

Giving up on TDD http://blog.cleancoder.com/uncle-bob/2016/03/19/GivingUpOnTDD.html

phpspechttp://www.phpspec.net/en/latest/