pruebas unitarias en profundidad - danysoft · 9º encuentro danysoft en microsoft | | 902 123146...
TRANSCRIPT
9º Encuentro Danysoft en Microsoft | www.danysoft.com | 902 123146
Pruebas unitarias en profundidadLuis Alfonso Rey | 9º Encuentro Danysoft en Microsoft
9º Encuentro Danysoft en Microsoft | www.danysoft.com | 902 123146
• Lo que ya sabemos• Algunas cosas nuevas• Despacito y buena letra• Herencia de familia
Agenda
9º Encuentro Danysoft en Microsoft | www.danysoft.com | 902 123146
9º Encuentro Danysoft en Microsoft | www.danysoft.com | 902 123146
• Qué es una prueba unitaria y cuales deben ser sus características principales
• Qué son una pruebas de integración• Qué es regresión• Cómo hacer pruebas con Visual Studio
…Pero por si acaso
Lo que ya sabemos
9º Encuentro Danysoft en Microsoft | www.danysoft.com | 902 123146
• Código que invoca código y establece condiciones de corrección
• Deben ser...• Automatizables y repetibles• Fáciles de implementar• Reutilizables en el futuro• Ejecutables por cualquiera• Ejecutables pulsando un botón• Lo más rápidas posible• Solo un aspecto concreto
Prueba Unitaria
9º Encuentro Danysoft en Microsoft | www.danysoft.com | 902 123146
• Una vez descubierto un error……Se corrige pero puede volver a ocurrir
• Error de regresión• Creemos pruebas para que no vuelva a suceder
Prueba de regresión
9º Encuentro Danysoft en Microsoft | www.danysoft.com | 902 123146
• Como las pruebas unitarias son:• Repetibles• Reutilizables• Ejecutables pulsando un botón
• Podemos dejar al sistema que las ejecute y luego nos informe del resultado
Automatización de pruebas
9º Encuentro Danysoft en Microsoft | www.danysoft.com | 902 123146
• Pruebas que se efectúan en dos o más módulos dependientes entre si
• Es una prueba que puede tener efectos inesperados en otras partes
• Requiere análisis
Pruebas de integración
9º Encuentro Danysoft en Microsoft | www.danysoft.com | 902 123146
• La integración es buena pero…• Ha de ser repensada a cada modificación• Normalmente el ejecutor ha de estar informado• No suelen ser rápidas ni fáciles de ejecutar• …No suele ser automatizable
Automatización vs. Integración
9º Encuentro Danysoft en Microsoft | www.danysoft.com | 902 123146
• Framework de pruebas que incluye• Proyectos• Arneses y pruebas• Métricas• Ejecución automatizada• Integración con sistemas de información
Pruebas unitarias en VS
9º Encuentro Danysoft en Microsoft | www.danysoft.com | 902 123146
9º Encuentro Danysoft en Microsoft | www.danysoft.com | 902 123146
• Explorador de pruebas unitarias• Soporte para frameworks
externos• Mejoras de rendimiento• Soporte 64Bit • Pruebas asíncronas• Framework de para fakes• Mejoras en la cobertura de
código• Integración continua sin servidor
Novedades de Visual Studio 11 Beta
Pero…Perdemos la intragración con el IDE
9º Encuentro Danysoft en Microsoft | www.danysoft.com | 902 123146
9º Encuentro Danysoft en Microsoft | www.danysoft.com | 902 123146
9º Encuentro Danysoft en Microsoft | www.danysoft.com | 902 123146
• Mas atributos en VS test framework• Test Driven Development• Stubs• Mocks
Algunas cosas nuevas
9º Encuentro Danysoft en Microsoft | www.danysoft.com | 902 123146
• Clásicos TestClass, TestMethod, DataSource• Inicialización AssemblyInitialize, ClassInitialize,
TestInitialize• Finalización AssemblyCleanup, ClassCleanup, TestCleanup• Clasificación Owner, DeploymentItem, Description,
HostType, Ignore, Priority, TestProperty, WorkItem• TFS CssIteration, CssProjectStructure
Atributos de pruebas
9º Encuentro Danysoft en Microsoft | www.danysoft.com | 902 123146
• Primero Prueba luego codifica• Pasos
1. Crea una prueba que falla2. Crea el código para satisfacerla3. Refactoriza si es necesario
Test Driven Development
9º Encuentro Danysoft en Microsoft | www.danysoft.com | 902 123146
• Remplazo de una dependencia externa, evitando tratar directamente con ella
Stubs
class CardReader{
public bool IsCardNumberValid (string number){
return SecuritySystem.IsCardNumberValid( number);}
}
[TestClass()]class CardReaderTest{
[TestMethod()]public bool IsCardNumberValidTest (){
string number = "99999999";CardReader reader = new CardReader();Assert.IsTrue(reader.IsCardNumberValid( number));
}}
9º Encuentro Danysoft en Microsoft | www.danysoft.com | 902 123146
• Remplazamos en pruebas por stub
Stubs
Constructor Injectionclass CardReader{
ISecuritySystem SecuritySystem;public CardReader ( ISecuritySystem system){
SecuritySystem = system}
}
Property Injection[TestClass]class CardReaderTest{
[TestMethod]public void IsCardNumberValidTest (){
string number = "99999999";CardReader reader = new CardReader();reader.SecuritySystem = New
FakeSecuritySystem();Assert.IsTrue(reader.IsCardNumberValid( number));
}}
Factory Class[TestClass]class CardReaderTest{
[TestMethod]public void IsCardNumberValidTest (){
string number = "99999999";CardReader reader = new CardReader();reader.SecuritySystem = SecuritySystemFactory.Create();Assert.IsTrue(reader.IsCardNumberValid( number));
}}
Directivas de compilación[TestClass]class CardReaderTest{
[TestMethod]public void IsCardNumberValidTest (){
string number = "99999999";CardReader reader = new CardReader();#if DEBUGreader.SecuritySystem = FakeSecuritySystemFactory.Create();#endifAssert.IsTrue(reader.IsCardNumberValid( number));
}}
9º Encuentro Danysoft en Microsoft | www.danysoft.com | 902 123146
• Diferentes niveles de abstracción• Constructor Injection
• Pocas referencias• Obligatorias
• Property Injection• Optativas
• Factory Class• Clases sin constructores públicos
• Directivas de Compilación• Factory class falsa
Stubs
9º Encuentro Danysoft en Microsoft | www.danysoft.com | 902 123146
• State-based Testing, probar el resultado por el estado final de un objeto
• Interaction Testing, probar como los objetos intercambian información
• Mock object un objeto falso que decide el resultado de la prueba en función de las interacciones del sistema con él
• Solo uno por test si probamos un aspecto
Mocks
9º Encuentro Danysoft en Microsoft | www.danysoft.com | 902 123146
• Con Stub la clase falla en la prueba
• El Mock falla la prueba
Mock vs. Stub
Objeto Stub
Prueba
Objeto Stub
Prueba
class CardReader{
public ISecurityDoor Door;public CardReader(ISecurityDoor door){
Door = door;}public void OpenDoor(){
Door.Open();}
}
[TestClass]class CardReaderTest{
[TestMethod]public void OpenDoorTest (){ ISecurityDoor door = new
FakeSecurityDoor()CardReader reader = new
CardReader(door);CardReader.OpenDoor();Assert.IsTrue(door.IsOpen);
}}
Objeto Mock
Prueba
Objeto Mock
Prueba
9º Encuentro Danysoft en Microsoft | www.danysoft.com | 902 123146
• Costosos de implementar• Difícil si las clases tienen interfaz complejo• Mantener el estado es pesado y laborioso• Difíciles de reutilizar
Por eso existen varios frameworks
Mocks y Stubs manuales
9º Encuentro Danysoft en Microsoft | www.danysoft.com | 902 123146
• Nmock• Moq• Typemock Isolator• Rhino MocksEtc…
Algunos frameworks
9º Encuentro Danysoft en Microsoft | www.danysoft.com | 902 123146
9º Encuentro Danysoft en Microsoft | www.danysoft.com | 902 123146
• Las pruebas son buenas pero sin organización pueden resultar inútiles
• Ejecución frecuente• Mantenimiento• Clasificación por impacto y tiempo de ejecución• Refactorización de pruebas y si es necesario API
Despacito y buena letra
9º Encuentro Danysoft en Microsoft | www.danysoft.com | 902 123146
• Las pruebas fáciles de integrar en proyectos nuevos y el código heredado ¿qué?
• Difícil pero posible• Para empezar señalar las partes necesarias• Clasificarlas, más fáciles cuanto mas orientado a función,
mas difíciles a la dependencia• Grupos sin experiencia utilizar Easy-First• Grupos con experiencia utilizar Hard-first• Si refactorización primero crear pruebas de integración
Herencia de familia
9º Encuentro Danysoft en Microsoft | www.danysoft.com | 902 123146
9º Encuentro Danysoft en Microsoft | www.danysoft.com | 902 123146
Gestión activos software y libros
9º Encuentro Danysoft en Microsoft | www.danysoft.com | 902 123146
Formación, consultoría y seminarios
9º Encuentro Danysoft en Microsoft | www.danysoft.com | 902 123146