tdd (test-driven development)
TRANSCRIPT
Renato Groffe
Abril/2015
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
Página no Facebookhttps://www.facebook.com/RenatoGroffeSW
Perfil no Facebookhttps://www.facebook.com/renatogroff
LinkedInhttp://br.linkedin.com/in/renatogroffe
Visual Studio 2013
Visual Studio Unit Testing Framework (também conhecido como MS Test)
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
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
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
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
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
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
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
Criando um novo projeto de testes unitários:
O menu TEST
Executando os testes definidos em uma classe
A janela Test Explorer e o resultado da execução de testes unitários
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
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
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
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”
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)
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→
Teste unitário criado no Visual Studio →
Funcionalidade codificada da forma mais simples possível, de maneira a garantir a execução com sucesso dos testes
Exemplo anterior comfuncionalidades já implementadas →
Eliminação de instruções duplicadas e eventuais melhorias no código
Exemplo de classerefatorada →
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
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)
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:
Link para download da solução de exemplo:https://gallery.technet.microsoft.com/Exemplo-de-aplicao-que-4f2cb4c1
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
Casos de testes gerados automaticamente pelo Visual Studio 2015:
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???
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
Obrigado!!!