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 Facebook
https://www.facebook.com/RenatoGroffeSW
 Perfil no Facebook
https://www.facebook.com/renatogroff
 LinkedIn
http://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 com
funcionalidades já implementadas →
 Eliminação de instruções duplicadas e eventuais melhorias
no código
Exemplo de classe
refatorada →
 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 Studio
http://www.devmedia.com.br/testes-unitarios-no-visual-studio-
2012/27215
 Novos recursos do Visual Studio 2015: Smart Unit Tests
http://netcoders.com.br/blog/visual-studio-2015-smart-unit-
tests/
 Test-Driven Development
http://martinfowler.com/bliki/TestDrivenDevelopment.html
 Unit Test
http://martinfowler.com/bliki/UnitTest.html
Obrigado!!!

TDD (Test-Driven Development)

  • 1.
  • 2.
     Mais de15 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
  • 3.
     Página noFacebook https://www.facebook.com/RenatoGroffeSW  Perfil no Facebook https://www.facebook.com/renatogroff  LinkedIn http://br.linkedin.com/in/renatogroffe
  • 4.
     Visual Studio2013  Visual Studio Unit Testing Framework (também conhecido como MS Test)
  • 5.
     Motivos quecontribuem 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
  • 7.
     A realizaçãode 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
  • 9.
     Retrabalho  Custosque 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
  • 11.
     Garantir queo 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
  • 12.
     Teste deunidade (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
  • 13.
     São característicascomumente 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
  • 14.
     Assim comoas 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
  • 15.
     Criando umnovo projeto de testes unitários:
  • 16.
  • 17.
     Executando ostestes definidos em uma classe
  • 18.
     A janelaTest Explorer e o resultado da execução de testes unitários
  • 19.
     O usodo 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
  • 20.
     Um poucomais 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
  • 21.
     Desenvolvimento baseadona 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
  • 22.
     Construção desoluçõ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”
  • 23.
     A implementaçãode uma funcionalidade segue um ciclo conhecido como Red-Green-Refactor (com a execução dos testes unitários em todos os estágios)
  • 24.
     Teste elaboradoantes 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→
  • 25.
    Teste unitário criadono Visual Studio →
  • 26.
     Funcionalidade codificadada forma mais simples possível, de maneira a garantir a execução com sucesso dos testes Exemplo anterior com funcionalidades já implementadas →
  • 27.
     Eliminação deinstruções duplicadas e eventuais melhorias no código Exemplo de classe refatorada →
  • 28.
     Código maisclaro, 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
  • 29.
     Ao buscarum 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)
  • 30.
     Cálculo dejuros compostos: Total a ser Pago = Vl. Empréstimo * ((1 + Taxa Juros Mensal) ^ Núm. Meses)  Casos de teste:  Classe a ser criada:
  • 31.
     Link paradownload da solução de exemplo: https://gallery.technet.microsoft.com/Exemplo-de-aplicao-que-4f2cb4c1
  • 32.
     O VisualStudio 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
  • 33.
     Casos detestes gerados automaticamente pelo Visual Studio 2015:
  • 34.
     Quando aplicarTDD? ◦ Testando todas as funcionalidades da aplicação, sem exceções? ◦ Considerando apenas funcionalidades mais significativas do ponto de vista do negócio?
  • 35.
  • 36.
     Testes Unitáriosno Visual Studio http://www.devmedia.com.br/testes-unitarios-no-visual-studio- 2012/27215  Novos recursos do Visual Studio 2015: Smart Unit Tests http://netcoders.com.br/blog/visual-studio-2015-smart-unit- tests/  Test-Driven Development http://martinfowler.com/bliki/TestDrivenDevelopment.html  Unit Test http://martinfowler.com/bliki/UnitTest.html
  • 37.