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)
28mai/100

Resultado do Coding Dojo – DotNetArchitects RJ

DotNetArchitects - Coding Dojo

Olá pessoal,
venho publicar o resultado do Coding Dojo do DotNetArchitects Rio de Janeiro .Primeiro gostaria de dizer que foi FANTASTICO! Por mais que eu ja tenha participado de outros Dojos, este foi diferente, experiencia incrivel trocada e compartilhada!  O problema a ser solucionado foi o FizzBuzz, que é um problema simples ideal para primeiro dojo oficial. No entanto o problema se mostrou bem interessante para darmos ênfase a conceitos chaves do TDD.

  Abaixo segue o código com os Testes:

namespace FizzBuzzTest
{
    [TestClass]
    public class FizzBuzzTest
    {
        [TestMethod]
        public void Recebe_1_e_Retonar_1()
        {
            var lista = new[] { "1" };
            CollectionAssert.AreEqual(lista, FizzBuzz(new int[] { 1 }));
        }
 
        [TestMethod]
        public void Recebe_2_e_Retonar_2()
        {
            var lista = new[] { "2" };
            CollectionAssert.AreEqual(lista, FizzBuzz( new int[] { 2 }));
        }
 
        [TestMethod]
        public void Recebe_3_e_Retonar_fizz()
        {
            var lista = new[] { "fizz" };
            CollectionAssert.AreEqual(lista, FizzBuzz(new int[] { 3 }));
        }
 
        [TestMethod]
        public void Recebe_4_e_Retonar_4()
        {
            var lista = new[] { "4" };
            CollectionAssert.AreEqual(lista, FizzBuzz(new int[] { 4 }));
        }
 
        [TestMethod]
        public void Recebe_5_e_Retonar_Buzz()
        {
            var lista = new[] { "buzz" };
            CollectionAssert.AreEqual(lista, FizzBuzz(new int[] { 5 }));
        }
 
        [TestMethod]
        public void Recebe_15_e_Retonar_FizzBuzz()
        {
            var lista = new[] { "fizzbuzz" };
            CollectionAssert.AreEqual(lista, FizzBuzz(new int[] { 15 }));
        }
 
        [TestMethod]
        public void Recebe_9_e_Retonar_Fizz()
        {
            var lista = new[] { "fizz" };
            CollectionAssert.AreEqual(lista, FizzBuzz(new int[] { 9 }));
        }
 
        [TestMethod]
        public void Recebe_10_e_Retonar_Buzz()
        {
            var lista = new[] { "buzz" };
            CollectionAssert.AreEqual(lista, FizzBuzz(new int[] { 10 }));
        }
 
        [TestMethod]
        public void Recebe_45_e_Retorna_FizzBuzz()
        {
            var lista = new[] { "fizzbuzz" };
            CollectionAssert.AreEqual(lista, FizzBuzz(new int[] { 45 }));
        }
 
        [TestMethod]
        public void Recebe_lista_1_2_retorna_1_2()
        {
            var lista = new[] { "1", "2" };
            CollectionAssert.AreEqual(lista, FizzBuzz(new int[] {1,2}));
        }
 
        [TestMethod]
        public void Recebe_lista_1_2_3_retorna_1_2_Fizz()
        {
            var lista = new[] { "1", "2","fizz" };
            CollectionAssert.AreEqual(lista, FizzBuzz(new int[] { 1, 2, 3 }));
        }
 
        [TestMethod]
        public void Recebe_lista_1_2_3_4_5_15_retorna_1_2_Fizz_4_Buzz_FizzBuzz()
        {
            var lista = new[] { "1", "2","fizz", "4", "buzz", "fizzbuzz" };
            CollectionAssert.AreEqual(lista, FizzBuzz(new int[] { 1, 2, 3, 4, 5, 15 }));
        }
}

E a implementação:

 private string[] FizzBuzz(int[] p)
        {
            var lista = new List();
            foreach (var item in p)
            {
                if ((item % 3 == 0) && (item % 5 != 0))
                    lista.Add("fizz");
                else if ((item % 5 == 0) && (item % 3 != 0))
                    lista.Add("buzz");
                else if ((item % 3 == 0) && (item % 5 == 0))
                    lista.Add("fizzbuzz");
                else
                    lista.Add(item.ToString());
            }
            return lista.ToArray();
        }

Também gostaria de agradecer à Perlink e ao Fernando Bichara por apoiar e patrocinar a reunião do grupo.

Fizemos uma retrospectiva e os seguintes pontos foram levantados para futuros Dojos:

O que foi bom?

  • Muitos aprenderam novos conceitos
  • Troca de conhecimento
  • Lanche
  • Estrutura
  • Primeiro Dojo Oficial do DotNetArchitects RJ
  • O problema de facil entendimento
  • Bom humor
  • Ambiente inclusivo
  • Refactoring
  • O Luan não chegou atrasado(um milagre!)
  • O problema foi resolvido
  • Pós-Dojo no Devassa Largo do Machado

O que pode melhorar?

  • Conversa paralela
  • o teclado
  • Muita gente se inscreveu e não foi!
  • Alguns estavam presentes e nao quiseram colocar a mão no código
  • Podia ir até mais tarde
  • Fred na foto (ahahahhaha!)

Bom pessoal é isso, ficamos muito felizes com o resultado que este Dojo gerou, e acredito que foi de grande valia para todos os participantes.
Espero também que o próximo não demore!

E claro, nao deixem de participar nos comentários. E voce que não foi, PERDEU!

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)
21abr/100

DotNetArchitects – Community Launch RJ – Visual Studio 2010

 DotNetArchitects_logo

Olá pessoal,

primeiramente gostaria de justificar minha ausencia no blog no último mês. Estive organizando o evento do DotNetArchitects para o Community Launch, e isso demandou muito do meu tempo. No entanto agora voltarei com força total para continuar com as postagens sobre assuntos muito interessantes que já estão na minha pauta.

Bom então vamos falar um pouco do evento:
Foram 8 horas de evento contemplando as principais funcionalidades do principal lançamento do dia 12 de Abril, o Visual Studio 2010, sobre um olhar de Arquitetura de Software. Contamos com 8 palestrantes.

As palestras foram as seguintes:

Novidades do Visual Studio 2010 – Alexandre Bispo
Entity Framework 4.0 – Vinicius Quaiato (SP)
ASP.NET 4.0 – Sidney Filho
ASP.NET MVC 2 – Alexandre Valente
MEF Managed Extensibility Framework – Fernando Bichara
TDD Test Driven Development – Christian Cunha
ALM Application Lifecycle Management – Rodrigo Vidal
Manipulação de arquivos Office 2010 com OpenXML – Carlos Eduardo Ferreira

Tivemos presença forte da comunidade .NET do Rio de Janeiro, que vieram havidos por conhecimento na mais nova plataforma de desenvolvimento da Microsoft. Foram muitas perguntas, duvidas e ideias que surgiram ao decorrer de cada palestra e cada nova funcionalidade mostrada. O evento foi marcado pela forte determinação do time para faze-lo acontecer. Noites sem durmir, e mudanças até o ultimo minuto. O Resultado disso? Um evento fantastico, organizado, sem atrasos, perfeito. Foi uma experiencia unica que tenha certeza que nenhum de nós iremos esquecer.

Não podemos esquecer de agradecer aos nossos patrocinadores: WhiteFox, Infnet, Microsoft e Rcosta, assim como nossos palestrantes que preparam palestras  alta padrão técnico e visual.

Seguem algumas fotos abaixo, o restante pode ser encontrado meu Flickr:
http://www.flickr.com/photos/rodrigovidal/sets/72157623894180214/

Utilizamos a hashtag: #CLRJ e o Twitter bombou! Com forte participação do Saulo que cobriu o evento de ponta a ponta com seus tweets. A Infnet contava com rede WIFI então os presentes também puderam participar!

Foram sorteados muitos brindes e houve também o sorteio de uma licença de Resharper cedida pelo Giovanni Bassi.

Gostaria de agradecer também à BrasilDotNet(Brasilia) e à DEVGoias.NET pelo envio de brindes. E a presença do Bruno Kenj da BrasilDotNet, e do Palestrante Vinicius Quaiato de São Paulo, pela excelente contribuição para este evento.

 

DSC00184 DSC00187 DSC00154 DSC00161 DSC00168  DSC00170 DSC00172 DSC00182

Aqui segue alguns feedbacks do pessoal que foi ao evento:

alexandre costa: As palestras foram muito boas....
allan silva: Sensacional. Palestras desse nível deveriam acontecer com mais frequência, parabéns a todos que colaboraram para esse evento.
thiago: Muito bom! Deveriam ocorrer mais eventos desse tipo aqui no Rio.
igor tosoba: Também achei muito bom o evento!! Parabéns aos palestrantes!
roberta arcoverde: Só queria reforçar que o evento foi realmente muito legal! Vi todas as palestras e adorei!
renal cabral: Foi muito bom mesmo cara... show! acompanhei do início ao fim e adorei! =)

É isso pessoal, obrigado a todos!

E até a proxima!

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)