40
Test-Driven Development (TDD) utilizando o framework xUnit.net Renato Groffe Julho/2015

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

Embed Size (px)

Citation preview

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

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

Renato GroffeJulho/2015

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

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

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

Contatos Página no Facebook

https://www.facebook.com/RenatoGroffeSW

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

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

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

Recurso Utilizados Visual Studio 2013

xUnit 2.0.0

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

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

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

Testes são realmente levados a sério?

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

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

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

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

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

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

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

Software: esperado x entregue

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

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

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

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

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

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

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

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

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

Testes unitários e o Visual Studio 2013

Criando um novo projeto de testes unitários:

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

Testes unitários e o Visual Studio 2013

O menu TEST

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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”

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

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)

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

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→

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

Como TDD funciona? → Red

Teste unitário criado criado com o framework

xUnit.net →

Page 27: Test-Driven Development (TDD) utilizando 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 →

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

Como TDD funciona? → Refactor

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

Exemplo de classerefatorada →

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

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

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

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)

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

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):

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

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

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

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

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

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

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

Retomando o Exemplo de Implementação

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

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

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”

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

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?

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

Dúvidas, sugestões???

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

Obrigado!!!