Test-Driven Development (TDD) utilizando o framework xUnit.net

Preview:

Citation preview

Test-Driven Development (TDD) utilizando o framework xUnit.net

Renato GroffeJulho/2015

Apresentação – Renato Groffe

Mais de 15 anos de experiência na área de Tecnologia

Pós-graduação em Engenharia de Software – ênfase em SOA

MBA em Business Intelligence

Graduação em Sistemas de Informação

Técnico em Processamento de Dados

MTAC (Microsoft Technical Audience Contributor), MCP, Microsoft Specialist, MCTS, OCA, ITIL, COBIT

Contatos Página no Facebook

https://www.facebook.com/RenatoGroffeSW

Perfil no Facebookhttps://www.facebook.com/renatogroff

LinkedInhttp://br.linkedin.com/in/renatogroffe

Recurso Utilizados Visual Studio 2013

xUnit 2.0.0

Motivos que contribuem para a falta de testes

Quais os impactos da falta de testes?

Visão geral dos diferentes tipos de testes na área de software

Testes unitários e a plataforma .NET

TDD: conceitos gerais

Implementação de um exemplo prático

Data-Driven Unit Testing

Testes unitários e o Visual Studio 2015

Agenda

Testes são realmente levados a sério?

Motivos que contribuem para a falta de testes A realização de testes é muitas vezes negligenciada:

◦ Falta de planejamento

◦ Tempo escasso

◦ Equipes reduzidas e sobrecarregadas, trabalhando simultaneamente em vários projetos

◦ Falta de hábito

◦ Excesso de confiança de alguns profissionais

Negligência seguida de consequências desagradáveis...

Quais os impactos da falta de testes?

Retrabalho

Custos que excedem o orçamento

Conflitos entre membros de uma equipe técnica ou junto à área de negócios

Prejuízos à imagem da equipe ou empresa responsável por um projeto

Software: esperado x entregue

Objetivos dos testes em um software

Garantir que o produto atende aquilo que foi especificado para o projeto

◦ Verificação do correto funcionamento de uma aplicação

◦ Detecção de falhas e defeitos que poderiam passar em branco até a subida em Produção

Os diferentes tipos de teste na área de software

Teste de unidade (ou teste unitário): verificação das menores unidades (método, classe, objeto) em um software, a fim de determinar a lógica de uma estrutura sob análise

Teste de integração: análise do funcionamento em conjunto das diferentes partes que compõem uma aplicação

Teste de sistema: simulação de uma situação real, em um ambiente equivalente ao de Produção

Teste de aceitação: conduzidos por um grupo de usuários finais com o intuito de simular operações cotidianas

Teste de regressão: verifica se mudanças introduzidas em uma versão resultam em efeitos colaterais nas funcionalidades pré-existentes

Testes unitários: uma visão geral

São características comumente atribuídas aos testes unitários:

◦ São automatizados e repetíveis

◦ Podem ser implementados facilmente

◦ Uma vez escritos, os testes devem ser mantidos para reuso futuro

◦ Qualquer profissional envolvido com o desenvolvimento de uma aplicação deve ser capaz de executá-los

◦ Facilmente acionáveis, com isto acontecendo a partir de um botão ou item de menu dentro de uma IDE

◦ Rapidez na execução

Testes unitários na plataforma .NET

Assim como as principais plataformas da atualidade, o .NET Framework conta com diversas alternativas para a implementação de testes unitários:

◦ Visual Studio Unit Testing Framework (MS Test)

◦ NUnit (http://www.nunit.org/)

◦ xUnit.net (https://github.com/xunit)

É possível integrar a utilização destes frameworks ao processo de build de uma aplicação → O Team Foundation é um bom exemplo de solução que suporta este tipo de funcionalidade

Testes unitários e o Visual Studio 2013

Criando um novo projeto de testes unitários:

Testes unitários e o Visual Studio 2013

O menu TEST

Testes unitários e o Visual Studio 2013 Executando os testes definidos em uma classe

Testes unitários e o Visual Studio 2013 A janela Test Explorer e o resultado da execução de testes unitários

Testes unitários e o Visual Studio 2013 O uso do framework xUnit.net requer:

◦ A criação de um novo projeto de testes

◦ Referenciar a aplicação que será submetida a testes neste novo projeto

◦ A instalação de packages para a codificação de testes e execução dos mesmos na IDE

◦ A criação de classes que conterão os testes

◦ A definição de métodos para checagens nessas classes de testes, com estes últimos sendo marcados com os atributos “Fact” ou “Theory” e fazendo uso de funções definidas na classe Assert

Testes unitários e o Visual Studio 2013 Packages do xUnit.net em um projeto de testes

(xUnit.net e xUnit.net [Runners])

Testes unitários e o Visual Studio 2013

Um pouco mais sobre a classe Assert:

◦ Definida no namespace Xunit

◦ Caso uma checagem produza como resultado o valor false, considera-se que o teste em questão gerou um erro

◦ Alguns dos métodos disponibilizados por este tipo: Equal, NotEqual, False, True, Null e NotNull

Test-Driven Development

Desenvolvimento baseado na codificação de testes unitários

Abordagem que tem “início” em 2002, com a publicação do livro “Test-Driven Development: By Example” por Kent Beck (“pai” do XP - Extreme Programming)

SUT (“System Under Test”) ou CUT (“Class Under Test” ou “Code Under Test”) → alguns termos comuns dentro de TDD

TDD e a implementação de softwares

Construção de soluções de uma maneira que facilite a integração a ferramentas para a execução de testes unitários

Codificação de testes unitários antes mesmo da implementação das partes que serão submetidas a análises → evitando assim a elaboração de testes “viciados”

Como TDD funciona?

A implementação de uma funcionalidade segue um ciclo conhecido como Red-Green-Refactor (com a execução dos testes unitários em todos os estágios)

Como TDD funciona? → Red

Teste elaborado antes mesmo da funcionalidade ter sido codificada (apenas a estrutura básica foi definida), de forma a se evitar uma verificação “viciada”

Exemplo de definição de classe com funcionalidades ainda não implementadas→

Como TDD funciona? → Red

Teste unitário criado criado com o framework

xUnit.net →

Como TDD funciona? → Green

Funcionalidade codificada da forma mais simples possível, de maneira a garantir a execução com sucesso dos testes

Exemplo anterior comfuncionalidades já implementadas →

Como TDD funciona? → Refactor

Eliminação de instruções duplicadas e eventuais melhorias no código

Exemplo de classerefatorada →

Benefícios em se adotar TDD

Código mais claro, já que os testes são escritos com o objetivo de checar porções menos extensas de um projeto

Testes unitários podem ser encarados como uma forma de se documentar o código → entendimento de como o método ou classe funciona

Um rápido feedback, com a geração de alertas diante de eventuais problemas → algo extremamente importante ao se efetuarem testes de regressão

Uma maior cobertura de diferentes trechos de código, o que poderia não acontecer com outros tipos de testes

Falhas são apontadas durante o desenvolvimento, economizando assim tempo e recursos financeiros

TDD e boas práticas

Ao buscar um código mais simples e de fácil manutenção, a adoção de TDD acaba por favorecer uma melhor assimilação de boas práticas de desenvolvimento/arquitetura de software:

◦ Separação de Responsabilidades (ao isolar a lógica de negócios ou de acesso a dados das camadas de visualização de uma aplicação)

◦ Maior coesão (evitando a implementação de classes “faz-tudo”)

◦ Menor acoplamento (a simplificação do código visando a escrita de testes eficazes contribui para uma menor dependência entre diferentes partes de uma aplicação)

Exemplo de implementação no Visual Studio 2013

Conversão de temperatura – Escala Fahrenheit para Celsius:

Classe a ser criada:

C = (F – 32) / 1,8 Casos de teste (considerar 2 casas decimais para arredondamento):

Exemplo de implementação no Visual Studio 2013

Link para download da solução de exemplo:https://gallery.technet.microsoft.com/Test-Driven-Development-2aad5383

Considerações sobre o Exemplo Implementado

Cada caso de teste possui um método correspondente → duplicação de código (ao menos para este exemplo específico)

Casos de teste adicionais exigirão a implementação de novos métodos para cada situação

Data-Driven Unit Testing

Métodos parametrizados, com a utilização de mecanismos para prover os valores a serem testados

xUnit.net

◦ Métodos marcados com o atributo “Theory”

◦ O atributo “InlineData” é utilizado para a especificação de valores, estando associado a um método de teste

Retomando o Exemplo de Implementação

Ajustando a classe de testes para que utilize os atributos “Theory” e “InlineData” o resultado será:

Testes unitários e o Visual Studio 2015

IntelliTest

◦ Novo recurso que permite a geração automática de casos de testes a partir do Visual Studio 2015

◦ Anteriormente conhecido como “Smart Unit Tests”

Considerações finais

Quando aplicar TDD?

◦ Testando todas as funcionalidades da aplicação, sem exceções?

◦ Considerando apenas funcionalidades mais significativas do ponto de vista do negócio?

Dúvidas, sugestões???

Obrigado!!!

Recommended