Académique Documents
Professionnel Documents
Culture Documents
Acerca de Mi
Amante del Software Expatriado y Retornado 10 aos peleando con lneas de cdigo Blogger aficionado: http://brigomp.blogspot.com Co-fundador de Jobsket http://www.jobsket.es/cv/martin
El ndice
Historietas de Guerra Nociones bsicas sobre Desarrollo gil Buenas Prcticas Testing y QA Integracin Continua
Historias de Guerra
Historietas de Guerra
Iteraciones frecuentes Desplegar software rpidamente Hacer que el cliente participe en el diseo No hace falta rodearse de los mejores. Rodearse de gente trabajadora suele ser suficiente.
Historias de Guerra
Las televisiones no motivan (a no ser que te gusten apostar a las carreras de caballos) Determinadas acciones son golpes a la moral Los proyectos retrasados no van a remontar el vuelo por poner ms presin a los empleados. Demuestran que son necesarios cambios en la forma de trabajar de la empresa.
A TESTEAR !!!
Historias de Guerra
No por tener ms testers tu software va a estar mejor testeado. Es necesaria una estrategia de automatizacin. El equipo de desarrollo debe ayudar al equipo de testers. Pero El equipo de testers debe dejarse ayudar. Tener testers no informticos es bueno.
Manifiesto gil
Nuevos Valores Individuos e integraccin Software que funciona Colaboracin con el cliente Respuesta al cambio Antiguos Valores
Desarrollo gil
Pragmatismo Iteraciones cortas Software funcional disponible frecuentemente Reuniones frecuentes Reparto de conocimiento y responsabilidades Documentacin gil Demostracin continua Retrospectivas Personas y relaciones frente a herramientas
Buenas Prcticas
Programacin en Parejas
Juntar dos desarrolladores frente a una pantalla. A la larga, mayor productividad. Incrementa la propiedad colectiva del cdigo. Combinacin perfecta: desarrollardor experto + desarrollador normal/junior. Juntar a 2 juniors, 2 expertos no aporta demasiado El programador inexperto aprende mucho ms. Quizs no una prctica para el da a da pero s para hacer de cuando en cuando.
Revisiones de Cdigo
Muy til para detectar errores. Muy importante con nuevas incorporaciones en los equipos. Es necesario alternar la responsabilidad. Si no, el revisor ser un cuello de botella. Aumenta la responsabilidad colectiva del cdigo. Centrarse en errores de alto nivel. El resto se puede detectar fcilmente con anlisis esttico.
Anlisis esttico
Las herramientas de anlisis esttico detectan errores sin tener que ejecutar cdigo. Se integran fcilmente en el proceso de build
Algunas veces hay que mitigar el ruido Findbugs, PMD, Sonar. Alternativas comerciales
Resource leaking
try { Connection c = String query = ...; c.execute(query); c.close() } catch (Exception e) { e.printStackTrace() }
Ejemplo, uso de estructuras de datos no Thread-safe en cdigo multihilo Inocente? Esto es un grfico de un servidor real. 4 CPUs 8Gb RAM.
Parece grave, no? Cul fue la causa? Dos llamadas a HashMap.put() y mala suerte
Testing y QA
Testing
Todos somos humanos. El software inevitablemente tiene muchos herrores. Bienvenidos sean los fallos. Por eso mismo debemos hacer pruebas.
Tests Unitarios
Los hacen los desarrolladores Prueban la funcionalidad de tu cdigo Introducidos ya en todos los lenguajes Junit, Nunit, PhpUnit,Test::Unit,... Prueban partes de cdigo que no interactuen con recursos externos
Tests Unitarios
public class LanguageDetectorTests extends TestCase { @Test public void testLanguageDetection() throws Exception {
Tests Unitarios
public void testExtractExperience() {
List<ExperienceEntry> entries = extractor.extractExperience("Julio 2006 - Septiembre 2006 Vuelvo a Sertec Soluciones informticas Trabajando como Operador de Sistemas dentro del Proyecto CRONOS de la Editorial Planeta.\nSeptiembre 2007 - Julio 2008 Becario en el departamento de Matemtica Aplicada I de la Universitat Politcnica de Catalunya dentro de los servicios informticos dando soporte a los profesores del departamento.","es"); assertEquals(entries.size(),2); assertEquals(entries.get(0).getExperience(),2); assertEquals(entries.get(1).getExperience(),10); }
Tests Unitarios
Tpico: Tengo prisa. No tengo tiempo para hacer tests unitarios Los tests unitarios se hacen para ahorrar tiempo
Software ms slido y probado. Menos cosas que probar manualmente. Menos bugs. Los bugs se encuentran antes. Menos presin.
Cobertura de Cdigo
Muy til para contrastar que nuestros tests estn realmente haciendo lo que queremos. Muchsimas herramientas
Lo bueno es que no hay que configurar nada. Se pueden integrar en el proceso de build. Cobertura,EclEmma,Sonar, etc.
Cobertura de Cdigo
Tests de Integracin
Los hacen los desarrolladores Prueban la funcionalidad de tu cdigo que depende de recursos externos
Requieren un setup. Inicializacin de recursos, ficheros de configuracin diferentes a produccin, etc. Herramientas como Spring te lo hacen ms sencillo
Tests de Integracin
XMLUnit: Xmls, XSLTs, XSDs, ... DBUnit: Acceso a bases de datos HtmlUnit: Pginas web SoapUI: Servicios web Cactus: JSPs, Servlets, EJBs,...
HTMLUnit
DBUnit
XMLUnit
Tests de Integracin
Hacer tests de integracin requieres ms esfuerzo que el hacer tests unitarios. Sin embargo, es muy necesario. Este esfuerzo es slo de configuracin.
Tests de Integracin
Proceso tpico:
1) Inicializar base de datos, servidor web, 2) Inicializar nuestros servicios. 3) Ejecutar el test
En Grails por ejemplo es ridculamente simple. Una vez est todo configurado. Vale la pena. Los tests son mucho ms significativos.
Tests de Integracin
void void testFindAllByUsername() testFindAllByUsername() {{ CV CV cv1 cv1 == buildCV() buildCV() cvService.save(cv1) cvService.save(cv1) CV CV cv2 cv2 == buildCV() buildCV() cvService.save(cv2) cvService.save(cv2) def def cvs cvs == cvService.findAllByUsername("test") cvService.findAllByUsername("test") assertEquals size (),2 assertEquals cvs. cvs. size (),2
}}
void void testDeleteInvoice() testDeleteInvoice() {{ def def invoiceData invoiceData == new new InvoiceData() InvoiceData() invoiceData.user = recruiter invoiceData.user = recruiter def def invoice invoice == billingService.generateInvoice(invoiceData) billingService.generateInvoice(invoiceData) assertEquals billingService.findAllInvoicesByUser(recruiter). size ,1 assertEquals billingService.findAllInvoicesByUser(recruiter). size ,1 billingService.deleteInvoice(recruiter,invoice) billingService.deleteInvoice(recruiter,invoice) assertEquals size ,0 assertEquals billingService.findAllInvoicesByUser(recruiter). billingService.findAllInvoicesByUser(recruiter). size ,0
}}
Tests de Integracin
No usamos un framework que nos haga las cosas ms fciles Nos est costando bastante el configurar el sistema (base de datos embebida, gestin de transacciones, limpieza entre tests, etc.)
Tests Funcionales
No los deberan hacer los desarrolladores. Se comportan como si fueran usuarios reales. No conocen el sistema. Simplemente acceden a las pginas web, aplicacin. Son con diferencia el mejor tipo de pruebas
QA
Rara avis en Espaa. Muy comn en Europa. No informticos que se dedican a probar las aplicaciones. Son personas muy tiles, pero es necesario guiarles. Es importante que se dejen guiar. Es gente que no tiene experiencia en desarrollo de software. Deberan hacer tests funcionales los programadores?
Tests Funcionales
Selenium Canoo WebTest HTMLUnit Abbot, Frankenstein,... En una empresa usabamos HP QuickTest
Y si mi aplicacin es Swing?
QA grababa los tests desde un applet y se generaban scripts en Excel. Les encantaba!
Tests Funcionales
Selenium es enormemente sencillo Tiene un IDE para grabar tests. Los tests se pueden reproducir. Incluso genera cdigo en diferentes lenguajes. Cualquiera puede grabar estos tests. Ideal para no desarrolladores.
Tests Funcionales
Pero, lanza una instancia del navegador con cada tests, es decir, consume bastantes recursos. Los tests pueden ser complicados de mantener. Canoo WebTest
Tests Funcionales
Ojo, a veces lo simple puede ser lo ms potente HtmlUnit es realmente sencillo, pero no es nada amigable para no desarrolladores.
Tests Funcionales
Ojo, a veces lo simple puede ser lo ms potente HtmlUnit es realmente sencillo y no requiere navegadores abiertos. Pero slo lo entendemos los programadores.
Tests Funcionales
Pero con un buen DSL cualquiera puede hacer tests. En uno de mis trabajos lo prob en una de mis empresas y se comenzaron a hacer tests como churros. 36 Qas por fin productivos.
Module: Module: signin signin Goto Goto '/home' '/home' ClickByText ClickByText 'Sign 'Sign In' In' Type 'Login','martin' Type 'Login','martin' Type Type 'Password','test' 'Password','test' ClickButton ClickButton 'Sign 'Sign In' In' VerifyText 'Welcome VerifyText 'Welcome Martin' Martin' run run signin signin Goto Goto '/invoices' '/invoices' ClickButton ClickButton 'New 'New Invoice' Invoice' VeryfyText 'Create... VeryfyText 'Create...
Crear primero el test y despus el cdigo. Difcil de comenzar, cambio completo de mentalidad. Tras acostumbrarse, muy productivo. Ya que:
Te obliga a enfrentarte al problema desde un punto de vista diferente. Tras acabar la funcionalidad, ya tienes los tests. Te pasan un bug? Test que lo reproduzca.
Integracin Continua
Slvame!
Iteraciones cada dos semanas. Demos a final de cada iteracin. Despliegue en produccin cada mes. Un departamento de QA que necesita software que funcione. Un departamento Comercial que quiere hacer demos a clientes. Imposible?
Integracin Continua
1. Compilar 2. Ejecutar tests 3. Analizar cdigo 4. Mtricas Commits 7. Release
SVN, CVS,..
Servidor
Integracin Continua
Cruise Control, Hudson, Apache Continuum, Bamboo, Team Foundation Server,... Para mi, el mejor es Hudson
Integracin Continua
Respetar la build
Integracin Continua
La build debe ser muy rpida. Intentar siempre acortar el tiempo de build. No tener una nica build. Separarlas para hacer el proceso ms rpido. Si la build se rompe, hay que parar y arreglarla. Si hay QAs creando tests quizs convenga que tengan otra mquina. Los tests funcionales suelen tomar bastante tiempo. Build propia o idealmente otra mquina.
Referencias
Gracias