Mostrando postagens com marcador Qualidade. Mostrar todas as postagens
Mostrando postagens com marcador Qualidade. Mostrar todas as postagens

O que é Mock em Teste Unitário?

O que é Mock?

Como mockar uma classe em C# .NET ?

Mock é uma técnica para simular o comportamento de estruturas de programação. A utilização desta técnica é fundamental para a validação do layout do código sem afetar ou depender o ambiente em questão.O termo Mock vem do ingles e significa algo como imitação, zombaria, falsidade.

Os testes unitários têm a responsabilidade de garantir que os retornos dos métodos estejam de acordo com as expectativas.Os testes unitários não podem depender da rede estar ativa, ou pastas de rede, servidores ou quaisquer outras dependencias externas. Os testes de integração são responsáveis por testar tais características do ambiente.

Quando existe a necessidade de testar unitáriamente um método que realize uma tarefa que dependa de algum recurso externo é necessário o uso de um Mock. É comum utilizar o neologismo mockar ("...é necessário mockar esta classe").

A seguir pode-se ver um exemplo de classe. Este exemplo refere-se ao código de uma aplicação que guarda um arquivo texto em um local temporário da maquina. A classe Archiver implementa a interface IArchiver. Ela é especialmente útil para que seja possível mockar esta classe.

namespace Anselme.Mock
{
    public class Archiver : Anselme.Mock.IArchiver
    {
        public ArchiverState Save(string filename, string file)
        {
            string path = System.IO.Path.GetTempPath();
            string completeFileName = string.Concat(path,filename);

            using (System.IO.StreamWriter sw = new System.IO.StreamWriter(completeFileName))
            {
                sw.Write(file);
            }
            return ArchiverState.Saved;
        }
        public string Load(string filename)
        {
            string path = System.IO.Path.GetTempPath();
            string completeFileName = string.Concat(path, filename);

            using (System.IO.StreamReader sr = new System.IO.StreamReader(completeFileName))
            {
                return sr.ReadToEnd();
            }
        }
    }
}

A inteface IArchiver, como eu disse, é um requisito para que eu possa testar unitariamente esta classe com Mock. A seguir, veja o código dela.

namespace Anselme.Mock
{
    public interface IArchiver
    {
        string Load(string filename);
        ArchiverState Save(string filename, string file);
    }
}

Note que o método Save possui um retorno do tipo ArchiverState. Este ArchiverState é uma Enumeração. Ela foi utilizada intensionalmente para gerar algum retorno nesta classe para que ela possa ser testada unitariamente sem a necessidade de verificar se o arquivo está armazenado no disco. Segue o código da enumeracao ArchiverState.

namespace Anselme.Mock
{
    public enum ArchiverState
    {
        Saved
    }
}

O que é MOQ?

Existem vários frameworks para auxiliar na criação de simulações de classes, ou mock. Estes frameworks são de empresas ou grupos independentes. Este tópico utiliza o Framework MOQ que é de simples utilização, bastante eficiente e gratuíto.

O moq possui estruturas para você simular alguma classe por meio da interface que a classe implementa. Com este framework é possível, por exemplo, configurar uma estrutura para que, toda vez que um determinado cenário for criado, um determinado retorno ocorra.

O framework moq pode ser baixado no link: MOQ Framework. Este tópico é feito com base na versão Moq.4.0.10827.Final, Checksum: c9626fcdd253c5a6e33056a2670911b6340cc302

 

Como funciona o Teste unitário com Mock, utilizando o Framework MOQ?

Para ver detalhes sobre como criar um teste unitário veja o link: O que é teste unitário? 
 
O teste unitário a seguir utiliza o Framework MOQ. Ele mostra um exemplo simples de teste do método Save, visto no código do inicio do post.

namespace ArchiverTest
{
    [TestClass()]
    public class ArchiverTest
    {
        [TestMethod()]
        public void Salvando_Um_Arquivo_Com_Texto_Pequeno()
        {

            string filename = string.Format("{0}.{1}",TestUtil.CreateRandomString(5), TestUtil.CreateRandomString(3));
            string file = TestUtil.CreateRandomString(5);

            var target = new Mock();
            target.Setup(t => t.Save(filename, file))
                .Returns(ArchiverState.Saved);

            IArchiver target_mock = target.Object;
            ArchiverState state = target_mock.Save(filename, file);
            Assert.AreEqual(ArchiverState.Saved, state);
        }
     }
}

Principais linhas comentadas

var target = new Mock();
Cria-se o Mock da interface IArchiver. Com isto é possível simular os método, propriedade e eventos contidos na interface.

target.Setup(t => t.Save(filename, file))
                .Returns(ArchiverState.Saved);
Com isto, toda vez que se chamar o método Save seu retorno será  ArchiverState.Saved, como já implementado.

IArchiver target_mock = target.Object;
Cria-se um Archiver mockado.

ArchiverState state = target_mock.Save(filename, file);
Obtem-se o resultado do método Save, já configurado.

Assert.AreEqual(ArchiverState.Saved, state);
Verificação se o retorno é o esperado.



Como é a informação, vista como bem econômico?

Idade do Byte Lascado

Já ouvi algumas pessoas falando que estamos saindo da Idade do Byte Lascado e entrando na Idade do Byte Polido. Estudando gestão do conhecimento e assistindo a vertiginosa ascensão da tecnologia da informação no mercado, fica muito clara a importância da informação. Não é nem a infraestrutura nem o desenvolvimento o que importa para as empresas: elas têm estes setores porque os armários de arquivos são muito lentos. Mas o que importa é a informação processada por elas.

Estava me lembrando de alguns vídeos muito bacanas de um consultor de carreira chamado Waldez Ludwig, falando sobre esta questão. Deem uma olhada:


Como o SharePoint 2010 se posiciona no mercado, segundo Gartner

O SharePoint 2010 está aparecendo com destaque segundo as avaliações do Gartner. Muito bem avaliado e classificado em dois quadrantes, é uma das principais plataformas colaborativas do mercado.


Social Software in the Workplace
Foi considerado o melhor em habilidade de execução e o segundo mais visionário. Esta avaliação foi feita em cerca de 12 meses passando por critérios como facilidade de adoção, usabilidade e inovação tecnológica.

Veja o artigo oficial sobre Social Software in the Workplace, no Gartner
http://www.gartner.com/technology/media-products/reprints/microsoft/vol14/article5/article5.html 



Horizontal Portals
Nesta área o SharePoint obteve a melhor colocação do mercado. Aparece em primeiro em habilidade de execução e como visionário. Esta análise foi feita por Jim Murphy, Gene Phifer, Ray Valdes, Eric Knipp. Avaliaram caracteristicas RIA (Rich Internet Applications), Web 2.0 entre outras.
Segundo o artigo, o SharePoint é bem considerado em mais de 70% das avaliações do Garnter.

Veja o Artigo oficial sobre Horizontal Portals, no Gartner
http://www.gartner.com/technology/media-products/reprints/microsoft/vol13/article10/article10.html

Como gerar documentação automaticamente em .NET?

Gerar documentação para os projetos de desenvolvimento nem sempre são tratadas como importantes. Nem todos pensam (ou sabem pensar) que o legado do projeto é da empresa e não do programador. A solução de documentação que quero falar é muito boa e eficiente, independente do projeto em questao ter a documentação como um artefato formal.




Sandcastle - Help File Builder
Esta solução gera documentação apartir dos comentários de 3 barras feito no código. A documentação gerada é semelhante a documentação do MSDN ou dos SDKs em documentos HTML ou CHM (Help do Windows).

/// <summary>
/// Responsável por realizar cálculos
///
</summary>
public class Calculadora
{
    ///
<summary>
    /// Útil para realizar somatório de números inteiros
    ///
</summary>
    /// <param name="i">Primeiro número a participar do somatório</param>
    /// <param name="j">Segundo número a participar do somatório</param>
    /// <returns>Retorna a soma entre dois valores</returns>
    int soma(int i, int j)
    {
        return i + j;
    }
}

Faça download do SandCastle
http://shfb.codeplex.com/


Como instalar o SandCastle?
1: Faça download do instalador, descompacte e execute-o
Instalação do SandCastle

2: Avance a instalação
Avance e leia atentamente todos os pontos da instalação.
Quando chegar em "SandCastle Pacth" clique em "Apply Patch"

Configurando a instalação do SandCastle

3: Avance a instalação, novamente
Prossiga até chegar em "SandCastle Help File Builder" clique em "Install SHFB"
Instalando o SandCastle Help File Builder
SandCastle Help File Builder


4: Feito.
SandCastle instalado com sucesso.
Reinicie seu computador.
Instalação do SandCastle finalizada



Como preparar meu projeto do visual studio para gerar documentação?
1: Crie seu projeto com comentários de 3 barras
Como demonstrado no inicio do artigo.


2: Configure o projeto
Vá no "Solution Explorer" do seu projeto e clique em Propriedades
Selecionar: Propriedades do Projeto


Vá na aba "Build" e selecione o checkbox "XML documentation file"
Na aba Build, selecionar XML Documentation

3: Compile seu projeto
Vá até o local onde está o executavel ou DLL do projeto. 
Você deve encontrar um documento XML com os comentários


4: Pronto

Como utilizar o SandCastle?
1: Abra a aplicação do SandCastle
Encontra-se no menu iniciar > SandCastle Help File Builder > SandCastle Help File Builder GUI

SandCastle Help File Builder GUI


2: Crie um novo projeto
Vá no menu "File" > "New Project" e escolha um local para salvamento de seu novo projeto

Criando Projeto no SandCastle


3: Adicione arquivos para geração da documentação
Vá na aba "Project Explorer" encontrada, inicialmente, à direita.
Clique com o botão direito em "Documentation Sources" e escolha as DLLs de seus projetos e XMLs de seus comentários
Adicionando DLLs e XMLs no SandCastle

4: Gere a documentação
Vá no menu "Documentation" > "Build" e espere.
O sistema gerará logs visíveis na tela e mostrará um barra de progresso no canto inferior direito.
Gerando arquivo CHM de ajuda


5: Leia a documentação gerada
Vá na pasta onde o projeto do SandCastle, criado no passo 1, foi salvo. Encontre uma pasta chamada Help e abra o arquivo "Documentation.chm"
Abrindo arquivo .CHM gerado automáticamente


6: Pronto
Sua documentação foi gerada com sucesso
Abrindo o arquivo .CHM gerado automáticamente com base nos comentários


Obs.: Esta tarefa pode demorar. Por exemplo, tenho um documento de uns 100 métodos comentados, e umas 20 classes. Para gerar a documentação demora de 5 a 10 minutos, numa maquina de 2GB de ram.

É possível fazer diversas configurações no SandCastle. Está é a configuração mais básica. Num próximo post falo mais.

O que é Teste Unitário?

A qualidade do software é uma das variáveis mais complexas de um software. Vai desde o processo administrativo até o padrão de código aplicado. Qualquer dia eu falo de qualidade e outras coisas do gênero; hoje vou falar apenas sobre uma pequena fatia dessa torta: Testes Unitários.
Os testes unitários têm um objetivo simples: garantir que os retornos dos métodos estejam de acordo com as expectativas. Certamente existem definições melhores e mais completas, mas repare: não falei que teste garante a qualidade. É um erro comum acreditar que os testes são a solução para todos os problemas, a bala de prata, infelizmente não são.
Testes unitários são aplicados as unidades de código, como funções, propriedades, procedures e semelhantes.  Veja uma código de exemplo de uma calculadora simples, como exemplo.

namespace calculadora
{
    public class Calculadora
    {
        int soma(int i, int j)
        {
            return i + j;
        }
        int multiplicacao(int i, int j)
        {
            return i * j;
        }
        int subtracao(int i, int j)
        {
            return i - j;
        }
        int divisao(int i, int j)
        {
            return i / j;
        }
    }
}
Parece um código simples demais para um programador  vacilar e cometer erros. Mas, vamos ver.

Como seria um teste unitário?
Veja um  teste unitário aplicado a calculadora do exemplo:
[TestMethod()]
public void CalculadoraConstructorTest()
{
    Calculadora target = new Calculadora();
}

[TestMethod()]
[DeploymentItem("calculadora.exe")]
public void divisaoTest()
{
    Calculadora_Accessor target = new Calculadora_Accessor();
    int i = 50;
    int j = 2;
    int expected = 25;
    int actual;
    actual = target.divisao(i, j);
    Assert.AreEqual(expected, actual);
}
[TestMethod()]
[DeploymentItem("calculadora.exe")]
public void multiplicacaoTest()
{
    Calculadora_Accessor target = new Calculadora_Accessor();
    int i = 50;
    int j = 2;
    int expected = 100;
    int actual;
    actual = target.divisao(i, j);
    Assert.AreEqual(expected, actual);
}

[TestMethod()]
[DeploymentItem("calculadora.exe")]
public void somaTest()
{
    Calculadora_Accessor target = new Calculadora_Accessor();
    int i = 50;
    int j = 2;
    int expected = 52;
    int actual;
    actual = target.divisao(i, j);
    Assert.AreEqual(expected, actual);
}

[TestMethod()]
[DeploymentItem("calculadora.exe")]
public void subtracaoTest()
{
    Calculadora_Accessor target = new Calculadora_Accessor();
    int i = 50;
    int j = 2;
    int expected = 48;
    int actual;
    actual = target.divisao(i, j);
    Assert.AreEqual(expected, actual);
}


Parece muito simples e fácil. Parece até mesmo desnecessário de tão óbvio. Entretanto, este teste está incorreto. Ele não considera que a classe Calculadora poderia realizar divisões por zero ou gerar estouros de buffer. Num projeto com diversas classes e chamadas os testes unitários ganham destaque.

Porque os testes unitários não garantem qualidade?
Não garantem porque o número de variantes de testes possíveis é grande demais. E a avaliação sobre que testes devem ser feitos e como devem ser feitos é humana, e não automática. A variável humana insere infinitas incertezas aos projetos de teste.

Porque utilizar Testes Unitários?
Eles são úteis para melhorar a qualidade dos softwares. Quando um software é modificado é comum perceber vários problemas decorrentes da alteração. Uma modificação impacta diversas coisas que nem sempre são pensadas pelos programadores, em primeiro momento. Aí que entra o teste unitário. É possível, automaticamente rodar todos os testes unitários e saber o impacto unitário da modificação realizada.

Passo a Passo: Como Fazer Teste Unitário no Visual Studio?
Novo Projeto

Projeto de Teste

Projeto de teste criado

Adicionar > Teste Unitário

Wizard para criação de Testes Unitários

Projeto criado pelo wizard

Projeto Alterado para refletir a realidade

Testes realizados pelo Visual Studio