Unit Testing
Consejos para escribir Tests envidiables
Germán Küber
Software Architect & Developer
Net-Baires
http://www.germankuber.com.ar/
@GermanKuber
“Una prueba escrita por un
programador con el fin de garantizar
que el código de producción haga lo
que el programador espera que
haga.”
Robert Martin – Clean Code
Objetivos del Unit Test
• Asegurarnos que el código hace lo que se supone que debe hacer
• Generar código mas robusto
• Mejorar la calidad de nuestro código productivo
• Permite test-drive development
• Acelera los ciclo de feedback para el desarrollador
Nuestros Unit Test deben
• Rápidos
• Pasar o fallar
• Repetibles
• No requerir de un orden especifico
• Fácil de setupear
• Testear una pequeña porción de funcionalidad
• Testear solamente la interface publica
Usemos AAA
• Arrange
• Inicializo variables
• Act
• Llamo método
• Assert
• Verifico el resultado del Act
public void Return_False_Post_Does_Not_Exist()
{
var _sut = new Core.Blog("Primer Blog");
bool existPost = default;
existPost = _sut.ExistPost("Test");
existPost.Should().BeFalse();
}
Arrange
Act
Assert
Code Coverage
• Todo el código esta testeado?
• Que porcentaje entonces?
• El porcentaje testeado es mayor, menor o igual al anterior.
• Herramientas en nuestro proceso de CI
Analyze Code Coverage
Live Unit Testing
Live Unit Testing
Live Unit Testing
Nomemclatura
• Objecto testeado : SUT
• Nombre de métodos:
• Método_Parametros_Resultado
• ComporatamientoEsperado_Cuando_Resultado
Código Testeable
Single Responsibility
Open/Closed
Liskov Substitution
Interface Segregation
Dependency Inversion
S
O
L
I
D
public class Blog {
public string Title { get; set; }
public List<Post> Posts { get; set; }
public Blog (string title,
List<Post> posts) { }
}
Inversión
de
control
public UsersController (ILogger logger,
IUserServices userServices) {
}
Programar
pensando en
Interfaces
Evitar
miembros
estaticos
public static class CacheHelper{
public static void Add<TEntity(TEntity entity,
CacheKeysEnum key){
//…
}
}
Usar librerías existentes
Anti Patrones
Anti patrones
• Lanzar otros test
• Utilizar recursos externos
• Tiempos de configuración alto
• Tests largos
• Muchos test para un único método
https://dzone.com/articles/unit-testing-anti-patterns-full-list
public UsersController (ILogger logger,
IUserServices userServices) {
}
public class Blog {
public string Title { get; set; }
public List<Post> Posts { get; set; }
public Blog (string title,
List<Post> posts) { }
}
Inversión
de
control
Code Time!!!
GRACIAS!!!
Germán Küber
Software Architect & Developer
Net-Baires
http://www.germankuber.com.ar/
@GermanKuber
Contenido
https://www.germankuber.com.ar/unit-testing-consejos-para-escribir-tests-
envidiables/
JORNADADE ARQUITECTURA.NET
UnitTestingEverywhere
https://jornadadearquitectura.net
Unit testing   consejos

Unit testing consejos

Notas del editor