Rodrigo Vidal PSD – MCPD – MCTS – MCP / Arquitetura e Desenvolvimento de Software

12jul/102

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.

UnitAndIntegrationTest

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

Digg This
Reddit This
Stumble Now!
Buzz This
Vote on DZone
Share on Facebook
Bookmark this on Delicious
Kick It on DotNetKicks.com
Shout it
Share on LinkedIn
Bookmark this on Technorati
Post on Twitter
Google Buzz (aka. Google Reader)
15mar/100

.NetArchitects RJ – Coding Dojo

dnarj_biggerOlá pessoal,

Nesta quarta-feira dia (17/03/2010) acontecerá o primeiro dojo do DotNetArchitects Rio de Janeiro!
Será imperdivel! O Dojo será em conjunto com o #DojoRio onde dojos são realizados toda quarta-feira, utilizando diversas linguagens de programação e puro TDD.

É a primeira vez que o DojoRio irá receber como linguagem o C#. E quem vai levar isso para lá? Será o DotNetArchitects e você que com certeza não vai faltar! Logo esperem um networking fantastico com profissionais que trabalham com as mais diversas tecnologias, Ruby, Python, Javascript, Java, .NET entre outras!

O endereço é:
Rua Teotônio Regadas 26 sala 201 - Lapa - Rio de Janeiro
Ao lado da sala Cecília Meireles, próximo ao Metrô Cinelândia

Conto com a presença de todos do DNARJ. E vamos fazer o melhor dojo que o Rio de Janeiro já viu!

Para informações em tempo real siga o @NetArchitectsRJ no twitter!

Abraço pessoal!

Digg This
Reddit This
Stumble Now!
Buzz This
Vote on DZone
Share on Facebook
Bookmark this on Delicious
Kick It on DotNetKicks.com
Shout it
Share on LinkedIn
Bookmark this on Technorati
Post on Twitter
Google Buzz (aka. Google Reader)