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/)
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?
3.- ESCRIBE SUFICIENTE CÓDIGOclass RomanNumerals{ public function fromArabic($arabic) { return 'I'; }}
¿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.● 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.
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● 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
●● 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
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/