37
Renato Groffe Abril/2015

TDD (Test-Driven Development)

Embed Size (px)

Citation preview

Page 1: TDD (Test-Driven Development)

Renato Groffe

Abril/2015

Page 2: TDD (Test-Driven Development)

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

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

Cursando MBA em Business Intelligence (FIAP)

Graduação em Sistemas de Informação

Técnico em Processamento de Dados

MCP, Microsoft Specialist, MCTS, OCA, ITIL, COBIT

Page 3: TDD (Test-Driven Development)

Página no Facebookhttps://www.facebook.com/RenatoGroffeSW

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

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

Page 4: TDD (Test-Driven Development)

Visual Studio 2013

Visual Studio Unit Testing Framework (também conhecido como MS Test)

Page 5: TDD (Test-Driven Development)

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

Testes unitários e o Visual Studio 2015

Page 6: TDD (Test-Driven Development)
Page 7: TDD (Test-Driven Development)

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

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

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: TDD (Test-Driven Development)

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: TDD (Test-Driven Development)

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: TDD (Test-Driven Development)

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: TDD (Test-Driven Development)

Criando um novo projeto de testes unitários:

Page 16: TDD (Test-Driven Development)

O menu TEST

Page 17: TDD (Test-Driven Development)

Executando os testes definidos em uma classe

Page 18: TDD (Test-Driven Development)

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

Page 19: TDD (Test-Driven Development)

O uso do Visual Studio Unit Testing Framework requer:

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

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

◦ A criação de classes que conterão os testes, marcando as mesmas com o atributo “TestClass”

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

Page 20: TDD (Test-Driven Development)

Um pouco mais sobre a classe Assert:

◦ Definida no namespace Microsoft.VisualStudio.TestTools.UnitTesting

◦ 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: AreEqual, AreNotEqual, IsFalse, IsTrue, IsNull e IsNotNull

Page 21: TDD (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 22: TDD (Test-Driven Development)

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 23: TDD (Test-Driven Development)

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 24: TDD (Test-Driven Development)

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 25: TDD (Test-Driven Development)

Teste unitário criado no Visual Studio →

Page 26: TDD (Test-Driven Development)

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

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

Exemplo de classerefatorada →

Page 28: TDD (Test-Driven Development)

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 29: TDD (Test-Driven Development)

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 30: TDD (Test-Driven Development)

Cálculo de juros compostos:

Total a ser Pago = Vl. Empréstimo * ((1 + Taxa Juros Mensal) ^ Núm. Meses)

Casos de teste:

Classe a ser criada:

Page 31: TDD (Test-Driven Development)

Link para download da solução de exemplo:https://gallery.technet.microsoft.com/Exemplo-de-aplicao-que-4f2cb4c1

Page 32: TDD (Test-Driven Development)

O Visual Studio 2015 conta com um novo recurso chamado “Smart Unit Tests”, com o objetivo de simplificar o processo de geração de testes unitários:

◦ Geração de vários casos de teste a partir de um simples clique do mouse

◦ Emprega técnicas de análise de código que buscam exercitar todos os caminhos lógicos existentes dentro de um método/função

◦ Possibilidade de criação de um projeto de testes a partir dos casos levantados por esta ferramenta → útil em testes de regressão

Page 33: TDD (Test-Driven Development)

Casos de testes gerados automaticamente pelo Visual Studio 2015:

Page 34: TDD (Test-Driven Development)

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 35: TDD (Test-Driven Development)

Dúvidas, sugestões???

Page 36: TDD (Test-Driven Development)

Testes Unitários no Visual Studiohttp://www.devmedia.com.br/testes-unitarios-no-visual-studio-2012/27215

Novos recursos do Visual Studio 2015: Smart Unit Testshttp://netcoders.com.br/blog/visual-studio-2015-smart-unit-tests/

Test-Driven Developmenthttp://martinfowler.com/bliki/TestDrivenDevelopment.html

Unit Testhttp://martinfowler.com/bliki/UnitTest.html

Page 37: TDD (Test-Driven Development)

Obrigado!!!