TDD: Cómo escribir código testeable.
¿Hacer tests es bueno?
¿Por qué no los hacemos?
RazonesVálidas¡No se!Código antiguoUINo hacer pruebasInválidasEl diseño es maloDe eso se encarga QANo coge los bugsDemasiadas interfacesEs lentoAburido….Es dificil de cambiar
Hacer tests es una habilidad
Entonces…¿Cómo se escribe código difícil de probar?
¿Por qué?Construcción de objetos	Trabajo en el constructor	Estados globales	Violaciones de la Ley de Deméter
Localización del “new”EstímuloAPI de PruebasClase bajo pruebaVerificaciones
Localización del “new”Otra claseEstímuloOtra claseAPI de PruebasClase bajo pruebaVerificacionesOtra claseInstanciado dentro de la clasePasado por referenciasEstados globales
Localización del “new”Otra claseOtra claseOtra claseOtra claseEstímuloOtra claseAPI de PruebasClase bajo pruebaOtra claseVerificacionesOtra clase
Localización del “new”Otra claseOtra claseOtra claseOtra claseEstímuloOtra claseAPI de PruebasClase bajo pruebaCosturaOtra claseVerificacionesOtra clase
Localización del “new”Clase FalsaEstímuloClase FalsaAPI de PruebasClase bajo pruebaCosturaVerificacionesClase Falsa
Localización del “new”Lógica de NegocioConstrucción del Grafo de Objetos y Búsqueda
Localización del “new”Lógica de NegocioConstrucción del Grafo de Objetos y Búsqueda
Localización del “new”Clase FalsaEstímuloClase FalsaAPI de PruebasClase bajo pruebaVerificacionesClase FalsaInstanciado dentro de la clasePasado por referenciasEstados globales
Ejemplo (House)
HouseclassHouse {Kitchenkitchen = new Kitchen();Bedroombedroom;publicHouse() 	{this.bedroom = new Bedroom();	}}
House TestclassHouseTests {	@TestpublicvoidimpossibleTestOnIsolation() {		// Can’treplaceanything!!!}}
Análisis	Fácil de instanciar pero…		No se puede remplazar nada.	Puede ser costoso computacionalmente	El diseño está acoplado. 	Cerrado para extensión.
House (Refactoizado)classHouse {Kitchenkitchen;Bedroombedroom;@InjectpublicHouse(Kitchenkitchen, Bedroombr) {this.bedroom = br;this.kitchen = kitchen;}}
House Test (Refactorizado)classHouseTests {	@TestpublicvoideasierToTestOnIsolation() {DummyKitchendk = new DummyKitchen();DummyBedroomdb = new DummyBedroom();House h = new House(dk,db);	// …}}
Ejemplo (Gardener)
Gardenerclass Garden {Gardenerjoe;public Garden(Gardenerjoe) {joe.setWorkHours(new TwelveHours());joe.setBoots(new ExpensiveBoots());		this.joe = joe;	}}
Análisis	Mejor pero… 		No se pueden remplazar las botas o el 	horario.	La prueba puede tardar (horario de 12h).	Necesita el jardinero pero se encarga de 	configurarlo.
Gardener (Refactored)class Garden {Gardenerjoe;	@Injectpublic Garden(Gardenerjoe) {	this.joe = joe;	}}classGardenerProvider {	@ProvidesGardenergetGardener(ExpensiveBootsboots, TwelveHoursschedule) {Gardenerjoe = new Gardener();joe.setWorkHours(schedule);joe.setBoots(boots);returnjoe;	}}
¿Por qué?Construcción de objetosTrabajo en el constructor	Estados globales	Violaciones de la Ley de Deméter
Costo de la construcción	Para testear, primero hay que instanciar pero…El trabajo dentro del constructor no tiene “costuras”	No se puede sobre escribir.	La prueba tiene que saber navegar lo 	que haya dentro
Ejemplo (Super Car)
Super Carclass Car {Engineengine;public Car(Filefile) {String m = readModelFromCfg(file);engine = new EngineFactory().create(m);}}
Super Car TestclassCarTest {@TestpublicvoidhardToSetupTest() {Filefile = new File(“custom.conf”);	Car car = new Car(file);	//Asserts...}}
Análisis	Pasamos un File cuando lo que se necesita es un Engine.	Toda prueba que necesite Car requiere eta parafernaria.Accede al sistema de ficheros	Lento.	No es una prueba unitaria realmente.
Super Car (Refactorizado)class Car {Engineengine;@Injectpublic Car(Engineengine) {this.engine = engine;}}
Super Car (Provider)classCarEngineProvider {@ProvidesEnginegetEngine(EngineFactoryfactory, @EngineModelStringmodel) {returnfactory.create(model);}}
Super Car Test (Refactorizado)classCarTest {@TestpublicvoideasyToSetupTest() {Engineengine = new FakeEngine();	Car car = new Car(engine);	//Asserts...}}
¿Por qué?Construcción de objetos	Trabajo en el constructor	Estados globales	Violaciones de la Ley de Deméter
Locura
LocuraDefinición:Repetir una misma acción una y otra vez y esperar obtener un resultado diferente.Albert Einstein
O mejor dicho… Estados Globalesclass X {public X() {}publicintdoSomething() {	//… Something…}}
Estados Globalesint a = new X().doSomething();int b = new X().doSomething();
Estados Globales¿ a == b ó a != b ?
Estados GlobalesX x1 = new X();YQXZ
Estados GlobalesX x1 = new X();X x2 = new X();YQXZYQXZ
Estados GlobalesX x1 = new X();x1.doSomething();A == B ó A != BX x2 = new X();x2.doSomething();YQXZGSYQXZ
Consecuencias	Múltiples ejecuciones	Resultados inesperados	Orden importa	No se pueden ejecutar en paralelo	Localización del estado desacotado.
Estados Globales OcultosSystem.currentTime()new Date()Math.random()
Consecuencias	La API miente:	A cerca de lo que necesita	Hace cosas que dan miedo detrás de la 	fachada
Ejemplo (CreditCard)
CreditCard@TestpublicvoidcreditCardChargeTest() {CreditCardcc = new CreditCard(“1234567890”);cc.charge(200);}
CreditCard@TestpublicvoidcreditCardChargeTest() {CreditCardcc = new CreditCard(“1234567890”);cc.charge(200);}java.lang.NullPointerException at talk2.CreditCard.charge(CreditCard.java:48)
CreditCard@TestpublicvoidcreditCardChargeTest() {CreditCardProcessor.init(…);CreditCardcc = new CreditCard(“1234567890”);cc.charge(200);}
CreditCard@TestpublicvoidcreditCardChargeTest() {CreditCardProcessor.init(…);CreditCardcc = new CreditCard(“1234567890”);cc.charge(200);}java.lang.NullPointerException at talk2.CreditCardProcessor.init(CreditCardProcessor.java:134)
CreditCard@TestpublicvoidcreditCardChargeTest() {OfflineQueue.start();CreditCardProcessor.init(…);CreditCardcc = new CreditCard(“1234567890”);cc.charge(200);}
CreditCard@TestpublicvoidcreditCardChargeTest() {OfflineQueue.start();CreditCardProcessor.init(…);CreditCardcc = new CreditCard(“1234567890”);cc.charge(200);}java.lang.NullPointerException at talk2.OffileQueue.start (OfflineQueue.java:203)
CreditCard@TestpublicvoidcreditCardChargeTest() {Database.connect(…);OfflineQueue.start();CreditCardProcessor.init(…);CreditCardcc = new CreditCard(“1234567890”);cc.charge(200);}
CreditCard¿Se ve un patrón?
CreditCardMiente sobre sus dependencias.El orden de las inicializaciones no es explicito.
CreditCard¿Qué podemos hacer?
CreditCard (Refactorizado)@TestpublicvoidcreditCardChargeTest() {Databasedb = Database(“connectionStr”);OfflineQueuequeue = new OfflineQueue(db);CreditCardProcessorccProcessor = new CreditCardProcessor(queue);CreditCardcc = new CreditCard(“1234567890”, ccProcesor);cc.charge(200);}
CreditCard¡Tenemos opciones!
CreditCardPero…	¿Y si termino con 20 parámetros?	Es porque los tenias… solo que…
TDD: ¿Cómo escribir código testeable?
Accounting 101classAccountView {Useruser;publicAccountView() {user = RPCClient.getInstance().getUser();}}
Análisis	Uso de Estados GlobalesIncorpora las dependencias del “singleton”Miente a cerca de las dependencias.
Accounting 101classAccountView {Useruser;publicAccountView(Useruser) {user = user;}}
¿Por qué?Construcción de objetos	Trabajo en el constructorEstados globalesViolaciones de la Ley de Deméter
TDD: ¿Cómo escribir código testeable?
La ley de Deméter	Cada unidad debería tener conocimiento limitado sobre otras unidades: solo unidades “relacionadas de cerca” a la unidad actual. 	Cada unidad debe de hablar solamente con sus amigos; No hablar con extraños.	Habla solamente con tus amigos inmediatos.
ServiceLocatorAka. Context, aka. Registry… etc.Mejor que un singletonAl menos el problema está en un solo lugar.Es testeable… pero no muy bonito.Esconde las dependencias reales.Las dependencias hacen el código poco reusable.
ServiceLocatorClassHouse {	//… publicHouse(Locatorlocator) {	//… Qué tengo que mockear???	}}
HouseClassHouse {//…Windowwindow;Doordoor;Roofroof;publicHouse(Locatorlocator) {this.window = locator.getWindow();this.door = locator.getDoor();this.roof = locator.getRoof();	}}
House (Refactorizado)classHouse {//…Windowwindow;Doordoor;Roofroof;publicHouse(Window w, Door d, Roof, r) {this.window = w;this.door = d;this.roof = r;	}}
ServiceLocator¿Qué otro problema tiene?	Mezcla responsabilidades.	Buscar y encontrar.	CreaciónSe necesita tener una interface para testearSi dependes de ServiceLocator, dependes de todo lo demás.
Making a Mockery…classLoginPage {RPCClientclient;HttpRequestrequest;publicLoginPage(RPCClientclient, HttpRequestrequest) {this.client = client;this.request = request;	}publicbooleanlogin() {String cookie = request.getCookie();returnclient.getAuthenticator().authenticate(cookie);	}}
AnálisisPara testear se hace complicadoLas dependencias no son las declaradas.Crear rpcclient, entrenarlo para devolver un authenticator, crear un authenticator… Etc.
Making a Mockery…classLoginPage {Authenticatorauthenticator;String cookie;publicLoginPage(Authenticatorauth, @Cookie String cookie) {this.cookie= cookie;this.authenticator =  auth;	}publicbooleanlogin() {returnauthenticator.authenticate(cookie);	}}
Making a MockeryCosas a tener en cuenta.Tiempo de vida de los objetos que se pasan.	Ej. Cookie puede ser distinto para 	cada vez
TDD: ¿Cómo escribir código testeable?

Más contenido relacionado

PDF
Space Camp :: API Lifecycle, Part I: Build and Test an API
PDF
API Lifecycle, Part 2: Monitor and Deploy an API
PDF
API Testing
PPT
Selenium ppt
PDF
Test case template
PPTX
Api testing
PPT
Postman.ppt
PDF
Implementing Microservices Security Patterns & Protocols with Spring
Space Camp :: API Lifecycle, Part I: Build and Test an API
API Lifecycle, Part 2: Monitor and Deploy an API
API Testing
Selenium ppt
Test case template
Api testing
Postman.ppt
Implementing Microservices Security Patterns & Protocols with Spring

La actualidad más candente (20)

PDF
Designing APIs with OpenAPI Spec
PPTX
Performance tests with Gatling
PDF
What Makes a Great Open API?
PDF
POST/CON 2019 Workshop: Testing, Automated Testing, and Reporting APIs with P...
PDF
OpenAPI Intro (1).pdf
PPTX
Agile test-management-test-rail-lastest
PDF
API_Testing_with_Postman
PPTX
DevOps and Splunk
PDF
How to start performance testing project
PPTX
API Docs with OpenAPI 3.0
PPT
Role Of Qa And Testing In Agile 1225221397167302 8
PPTX
More on Fitnesse and Continuous Integration (Silicon Valley code camp 2012)
PPTX
API Testing for everyone.pptx
PPTX
B4USolution_API-Testing
PDF
Developing Faster with Swagger
PPTX
Agile testing - Testing From Day 1
PDF
Agile Test Management Using Jira and Zephyr
PPTX
Automation Testing by Selenium Web Driver
PDF
Driving Pipeline Automation With Newman and the Postman API
PDF
API Testing. Streamline your testing process.
Designing APIs with OpenAPI Spec
Performance tests with Gatling
What Makes a Great Open API?
POST/CON 2019 Workshop: Testing, Automated Testing, and Reporting APIs with P...
OpenAPI Intro (1).pdf
Agile test-management-test-rail-lastest
API_Testing_with_Postman
DevOps and Splunk
How to start performance testing project
API Docs with OpenAPI 3.0
Role Of Qa And Testing In Agile 1225221397167302 8
More on Fitnesse and Continuous Integration (Silicon Valley code camp 2012)
API Testing for everyone.pptx
B4USolution_API-Testing
Developing Faster with Swagger
Agile testing - Testing From Day 1
Agile Test Management Using Jira and Zephyr
Automation Testing by Selenium Web Driver
Driving Pipeline Automation With Newman and the Postman API
API Testing. Streamline your testing process.
Publicidad

Destacado (10)

PPTX
Tdd like beethoven
PPTX
CAS2013 - ¿Cómo evitar que se vaya al carajo tu implantación de agile?
PPTX
Principios SOLID de Diseño Orientado a Objetos
PDF
La muerte del silo - CAS2016
PPTX
Developing leadership in the agile organization
PDF
An introduction to agile leadership
PPTX
Win win negotiation techniques
PDF
LeanUX - Presentation slides
PDF
How to write good user stories
PPTX
Building teams that excel - Creating trust in teams
Tdd like beethoven
CAS2013 - ¿Cómo evitar que se vaya al carajo tu implantación de agile?
Principios SOLID de Diseño Orientado a Objetos
La muerte del silo - CAS2016
Developing leadership in the agile organization
An introduction to agile leadership
Win win negotiation techniques
LeanUX - Presentation slides
How to write good user stories
Building teams that excel - Creating trust in teams
Publicidad

Similar a TDD: ¿Cómo escribir código testeable? (20)

PPT
Unit Testing - Trovit
PPT
Unit Testing - GTUG
PDF
Desarrollo con Java y metodologías agiles
PPTX
Metadata api en apex
DOCX
Notas clase java ii
PPT
Acceso a base de datos5A_BD_Servidor.ppt
PPTX
Cómo lograr mejores pruebas
DOCX
Notas clase
DOCX
Notas clase
DOCX
Notas clase java ii
PDF
Probando aplicaciones AngularJS
PPTX
Rendimiento en aplicaciones web con Symfony2
PDF
Bases de Datos en Java - Intro a JDBC
DOC
Conexión a postgres desde
PDF
3. Curso Java JDBC (Bases de datos) - Curso 2005-2006
ODP
Grails 2013 - PUCMM - Santiago - Sistemas
PDF
PDF
[ES] Conectividad de java a base de datos(jdbc)
ODP
Grails barcamp 2013
PPT
JQuery Mvc
Unit Testing - Trovit
Unit Testing - GTUG
Desarrollo con Java y metodologías agiles
Metadata api en apex
Notas clase java ii
Acceso a base de datos5A_BD_Servidor.ppt
Cómo lograr mejores pruebas
Notas clase
Notas clase
Notas clase java ii
Probando aplicaciones AngularJS
Rendimiento en aplicaciones web con Symfony2
Bases de Datos en Java - Intro a JDBC
Conexión a postgres desde
3. Curso Java JDBC (Bases de datos) - Curso 2005-2006
Grails 2013 - PUCMM - Santiago - Sistemas
[ES] Conectividad de java a base de datos(jdbc)
Grails barcamp 2013
JQuery Mvc

Último (20)

PPTX
Control de calidad en productos de frutas
PDF
Teoría de estadística descriptiva y aplicaciones .pdf
DOCX
TRABAJO GRUPAL (5) (1).docxsjsjskskksksksks
DOCX
Guía 5. Test de orientación Vocacional 2.docx
PDF
Guía_de_implementación_Marco_de_gobierno_y_gestión_de_TI_Universidades.pdf
PPTX
Reconocimiento-Automatico-de-Placas-Vehiculares-con-IA.pptx
PPTX
El uso de las TIC en la vida cotidiana..
PDF
ADMINISTRACIÓN DE ARCHIVOS - TICS (SENA).pdf
PPTX
Diapositivas Borrador Rocha Jauregui David Paolo (3).pptx
PPTX
Presentacion de Alba Curso Auditores Internos ISO 19011
PPT
Protocolos de seguridad y mecanismos encriptación
PDF
MANUAL de recursos humanos para ODOO.pdf
DOCX
Trabajo informatica joel torres 10-.....................
PDF
Final Tecno .pdfjdhdjsjdhsjshshhshshshhshhhhhhh
PPTX
Curso de generación de energía mediante sistemas solares
PDF
Tips de Seguridad para evitar clonar sus claves del portal bancario.pdf
PPTX
ccna: redes de nat ipv4 stharlling cande
DOCX
TRABAJO GRUPAL (5) (1).docxjesjssjsjjskss
DOCX
TRABAJO GRUPAL (5) (1).docxsjjsjsksksksksk
PDF
NREN - red nacional de investigacion y educacion en LATAM y Europa: Caracteri...
Control de calidad en productos de frutas
Teoría de estadística descriptiva y aplicaciones .pdf
TRABAJO GRUPAL (5) (1).docxsjsjskskksksksks
Guía 5. Test de orientación Vocacional 2.docx
Guía_de_implementación_Marco_de_gobierno_y_gestión_de_TI_Universidades.pdf
Reconocimiento-Automatico-de-Placas-Vehiculares-con-IA.pptx
El uso de las TIC en la vida cotidiana..
ADMINISTRACIÓN DE ARCHIVOS - TICS (SENA).pdf
Diapositivas Borrador Rocha Jauregui David Paolo (3).pptx
Presentacion de Alba Curso Auditores Internos ISO 19011
Protocolos de seguridad y mecanismos encriptación
MANUAL de recursos humanos para ODOO.pdf
Trabajo informatica joel torres 10-.....................
Final Tecno .pdfjdhdjsjdhsjshshhshshshhshhhhhhh
Curso de generación de energía mediante sistemas solares
Tips de Seguridad para evitar clonar sus claves del portal bancario.pdf
ccna: redes de nat ipv4 stharlling cande
TRABAJO GRUPAL (5) (1).docxjesjssjsjjskss
TRABAJO GRUPAL (5) (1).docxsjjsjsksksksksk
NREN - red nacional de investigacion y educacion en LATAM y Europa: Caracteri...

TDD: ¿Cómo escribir código testeable?