Isolated!

  • Rafael Miceli
  • 29 Abr 2014

O princípio Isolated do F.I.R.S.T. ajuda a criar um teste independente de qualquer outro teste externo.

Neste princípio nós precisamos manter o testes isolados, e ter um Assert por teste . Isso é bem difícil de atingir, pois, um Assert por teste? Soa meio que exagero né? Bem temos que saber a dosagem certa de Asserts em um teste. Como dito antes o IDEAL, é um Assert por teste. Mas… E casos que necessitem mais de um?

Existe essa possibilidade

Arrange Act Assert Assert Assert

Quero fazer o Assert de um método que atualiza um registro:

 public class Employee {

	  public int Id;
	  public String Name;
	  public String LastName;         

 }


 public class EmployeeService {

	  private IEmployeeRepository _employeeRepository;

	  public EmployeeService(IEmployeeRepository employeeRepository) {
		   
		   _employeeRepository = employeeRepository;
		   
	  }
 
	  public void Update(int Id, String name, String lastName) {
		   
		   Employee employee = new Employee();
		   employee.Id = Id;
		   employee.Name = name;
		   employee.LastName = lastName;

		   _employeeRepository.Update(employee);
		   
	  }

	  public void FindEmployee(int Id) {

		   return _employeeRepository.GetById(Id);
	  }

 }

 @org.junit.Test
 public void Given_An_Employee_Should_Update_Name_And_LastName() {
	  //Arrange
	  int employeeId = 1;
	  String newName = "Novo Nome";
	  String newLastName = "Novo Sobrenome";

	  IEmployeeRepository fakeEmployeeRepository = new FakeEmployeeRepository();       
	  // Neste artigo não vou implementar o FakeEmployeeRepository() (Uma classe fake)
	  // Vou deixar que vocês mesmo descubram por si como implementar
	  
	  EmployeeService employeeService = new EmployeeService(fakeEmployeeRepository);

	  Employee employee = emplyeeService.FindEmployee(1);

	  employee.Name = newName;
	  employee.LastName = newLastName;
	  

	  //Act
	  employeeService.Update(employee);
	  
	  //Assert
	  Employee employeeUpdated = employeeService.FindEmployee(employeeId);

	  Assert.IsNotNull(employeeUpdated);
	  Assert.AreEqual(newName, employeeUpdated.Name);
	  Assert.AreEqual(newLastName, employeeUpdated.LastName);
 
 }

Pode perceber que existem 3 Asserts neste teste. Por acaso faria sentido criar um test method para cada Assert?

Na minha humilde opinião, eu não vejo a vantagem em criar mais test methods para cada Assert, ja que no fim estamos testando o mesmo contexto: Atualização dos campos da classe Employee mas ainda assim mantendo o test method legível e simples.

Testes independentes

Outra coisa neste principio é que os testes unitários não devem depender de ordem alguma de outros testes para passar. Eles devem ser independentes, e sem ter noção da existência de outros!

Isso torna os testes Isolateds (Isolados)

Nó próximo artigo vamos conferir o principio Repeatable.

comentarios com Disqus Disqus