Unit and Integration Tests
Muitos desenvolvedores confundem a definição de Testes de Unidade e Testes de Integração, então vamos entender um pouco melhor suas diferenças Testes de Unidade ou Unit Tests é um conceito antigo em desenvolvimento de software. Kent Beck introduziu este conceito no SmallTalk na década de 70. Beck quis mostrar que esta era uma das melhores formas para se aumentar a qualidade do código enquanto se obtia um profundo conhecimento a respeito do requisitos funcionais do sistema sobre teste.
Teste de Unidade ou Unit Test
como também é conhecido é um trecho de código que executa outro trecho de código e verifica a exatidão de alguns pressupostos. Caso estes pressupostos estejam errados, o teste falha, caso estejam corretos, o teste passa. Uma unidade é um método ou uma função.
Propriedades de um bom Teste Unitário:
- Deve ser automatizável e repetitível
- Deve ser facil de implementar
- Uma vez escrito, deve ser possivel executa-lo futuramente
- Todos deve estar aptos a executa-lo
- Deve executar rapidamente
Para exemplo de código unitário utilizarei o Template padrão de uma aplicação asp.net MVC 2 criado com o Visual Studio 2010.
[TestMethod] public void Index() { // Arrange HomeController controller = new HomeController(); // Act ViewResult result = controller.Index() as ViewResult; // Assert ViewDataDictionary viewData = result.ViewData; Assert.AreEqual("Welcome to ASP.NET MVC!", viewData["Message"]); }
Explicando o código: Esta [TestClass] testa a classe HomeController, e seu [TestMethod] testa o métodoIndex().
No Arrange é instanciado um objeto do tipo Homecontroller. Em Act é invocado o métodoIndex() e seu valor deretorno armazenado na variavel result. Posteriormente no Assert é comparado o Valor Esperado, com o Valor Obtido.
No entanto o que faz este teste ser unitário e não de integração é o fato da métodoIndex() ser declarado da seguinte forma na classe HomeController.
public ActionResult Index() { ViewData["Message"] = "Welcome to ASP.NET MVC!"; return View(); }
Nota-se que o métodoIndex() não se integra a nenhuma outra região de código, por exemplo a um Serviço, ou a um Repositório. Ou seja, não há dependência externa.
Um Teste Unitário, deve ser confiável, legível e manutenível, testando uma única unidade de código. Keep it simple!
Testes de Integração ou Integration Tests
são testes em que duas ou mais partes de software e/ou hardware dependentes são combinados e testados como uma única unidade. Ou seja,um teste deste tipo utiliza de varias unidades de código que trabalham juntos, para avaliar um ou mais resultados esperados do software.
Exemplo(modificado):
[TestMethod] public void LogOff_LogsOutAndRedirects() { // Arrange AccountController controller = GetAccountController(); // Act ActionResult result = controller.LogOff(); // Assert Assert.IsTrue((controller.FormsService).SignOut_WasCalled); }
Este método de teste efetua a chamada a um método deLogOff implementado na classe AccountController da seguinte forma:
public ActionResult LogOff() { AuthenticationService FormsService = new AuthenticationService(); FormsService.SignOut(); return RedirectToAction("Index", "Home"); }
Ou seja este método depende de uma classe de Serviço que tem a atribuição de efetivamente realizar o logOff. A classe AccountController está sendo testada juntamente com a classe de Serviço(FormsService) como uma única unidade. O resultado é que caso o teste falhe, todos os componentes envolvidos falham como um time, o que pode dificultar a correção do problema que efetivamente causou a falha de toda a operação. Logo este teste é de Integração.

Resumindo: Um teste de integração exercita várias unidades de código que trabalham juntos para avaliar um ou mais resultados esperados de um software, enquanto um teste unitário exercita e teste uma unidade de código em isolamento.
Espero que tenha ficado claro o conceito.
Qualquer dúvida ou critica é só comentar.
Abraço


















julho 12th, 2010 - 23:23
Rodrigo, parabéns pelo post !! Acredito que esse post esclareça algumas coisas que andam obscuras dentro do mundo de desenvolvimento de software e essa separação com certeza é uma delas. Recapitulando, Unit Tests != Integration Tests
Abrações !!
julho 13th, 2010 - 10:21
Digão post muito bacana!! gostei!! contininue assim!!!!!!!! DNA-RJ vai arrebentar!!!!!!!!!