Testes de Software
TDD, MOCKS, BDD E SELENIUM
Renato Groffe
◦ Microsoft Most Valuable Professional (MVP)
◦ Multi-Plataform Technical Audience Contributor (MTAC)
◦ Mais de 15 anos de experiência na área de Tecnologia
◦ Autor Técnico e Palestrante
Contatos
http://renatogroffe.net/
/renatogroffe /in/renatogroffe
/canaldotnet
/renatogroffe/@renato.groffe
/canaldotnet
Agenda
◦ Desenvolvimento de software – Cenários Comuns
◦ Test-Driven Development
◦ Mock Objects
◦ Behavior-Driven Development
◦ Testando interfaces Web com Selenium
Desenvolvimento de Software – Cenários comuns
Desenvolvimento – Cenários comuns
◦ Pressões por uma rápida entrega, prazos
muito curtos
Desenvolvimento – Cenários comuns
◦ Equipes reduzidas
Desenvolvimento – Cenários comuns
◦ Mudanças frequentes em requisitos
Desenvolvimento – Cenários Comuns
◦ Áreas de Negócio e Técnica nem sempre falam a mesma língua
Desenvolvimento – Cenários comuns
◦ Testes não são levados tão a sério
como se deveria
Como contornar estes problemas?
Como contornar estes problemas?
Metodologias ágeis
◦ XP (Extreme Programming) e Scrum
são os exemplos mais famosos
Testando um software
◦ Diferentes abordagens
Por que testar um software?
◦ Garantir que o projeto atende às especificações
◦ Detectar falhas e defeitos antes da subida para produção
Alguns tipos de testes
◦ Teste de unidade
◦ Teste de integração
◦ Teste de sistema
◦ Teste de aceitação
◦ Teste de regressão
◦ Teste de UI
Testes de unidade
◦ Automatizados
◦ Repetíveis
◦ Facilidade de implementação
◦ Reuso futuro
◦ Facilidade e rapidez de execução
Testes de Unidade na plataforma .NET
MS Test
Test-Driven Development (TDD)
◦ Desenvolvimento cíclico baseado na
codificação e execução de testes de unidade
◦ Testes são escritos antes mesmo da
codificação de classes ou métodos
◦ Validação de objetos e métodos (unidades)
◦ Abordagem comumente associada às
metodologias ágeis
Test-Driven Development (Red-Green-Refactor)
Exemplo prático - TDD
Recursos Utilizados
◦Microsoft Visual Studio 2017
◦.NET Core 2.0
◦MS Test, xUnit e NUnit
Exemplo de uso do xUnit
◦ Conversão de temperatura – Escala Fahrenheit para Celsius:
◦ Casos de teste (considerar 2 casas decimais para arredondamento):
C = (F – 32) / 1,8
Exemplo de uso do xUnit
◦ Classe a ser criada:
Sempre será fácil testar?
Dificuldades técnicas comuns
◦ Dependências entre diferentes partes de um
software
◦ Inexistência de ambientes com configurações
específicas para testes
◦ Integrações com parceiros que não disponibilizam
condições adequadas para testes
◦ O teste de determinados recursos precisa esperar
pela conclusão de uma ou mais funcionalidades
específicas
Como superar então estas dificuldades?
Simulando...
Imitando...
Algumas soluções para testes automatizados
Implementações fake
◦ Estruturas normalmente descartadas em produção
◦ Implementações contendo dados fixos e nenhuma
lógica
◦ Exemplo: utilização de um banco de dados “em
memória”
Algumas soluções para testes automatizados
Mock Objects
◦ Estruturas que simulam objetos reais
◦ Baseados em expectativas
◦ Enfatizam a interação entre objetos (comportamento),
prevendo inclusive possíveis falhas de execução
◦ Frameworks simplificam a utilização destas construções
Algumas soluções para testes automatizados
Stubs
◦ Estruturas com comportamento pré-determinado
◦ Podem fazer uso de implementações fake ou até
mesmo um framework para mock
◦ Não há a configuração de expectativas
Algumas considerações adicionais
◦ O termo dublê pode se referir a implementações fakes, mocks e stubs
◦ Temos também o conceito de objetos “dummy” (criados apenas para passagem de
parâmetros, sem uso posterior)
Um pouco de teoria
Mocks Aren't Stubs – Martin Fowler
https://martinfowler.com/articles/mocksArentStubs.html
Mocking Test em .NET
Moq
◦ Framework open source
◦ Simplifica a utilização de Mocks na validação de soluções
construídas em .NET
◦ Permite definir o retorno de métodos, propriedades e até a
geração de exceções em tempo de execução
◦ Dispensa a criação de Fakes e outras estruturas que seriam
descartadas posteriormente
NSubstitute
◦ Framework também open source
◦ Alternativa ao uso do Moq, com um
funcionamento bastante semelhante ao deste
último
E como utilizar isso em .NET?
Combinando o uso do Moq ou Nsubstitute a frameworks como MS Test, NUnit, xUnit.net,
SpecFlow, Selenium, Fluent Assertions...
MS Test
Exemplo prático
Caso de Estudo
◦ Consulta a um serviço de crédito (via CPF) – status possíveis:
◦ Parâmetro de envio inválido (retorno de pendências = null)
◦ Erro de comunicação (exceção retornada ao se invocar o serviço)
◦ Pessoa física sem Pendências (zero itens no retorno de pendências)
◦ Pessoa física inadimplente (ao menos uma pendência encontrada)
◦ A ideia por trás do uso de Mock Objects nesta situação é evitar consultas a um
tipo de serviço que é pago → as empresas que fornecem os dados não
costumam disponibilizar ambientes para testes
Caso de Estudo
Recursos a serem utilizados
◦ Microsoft Visual Studio 2017
◦ .NET Core 2.0
◦ MS Test
◦ xUnit
◦ Moq
◦ NSubstitute
◦ Fluent Assertions
Dificuldades na adoção de TDD
◦ Verificar pontos isolados (métodos, classes) nem sempre é uma solução
eficiente ou garantia de sucesso
◦ Problemas costumam surgir durante a integração de partes relacionadas
◦ Testes de unidade são compreendidos apenas por pessoas com um perfil
mais técnico
E como superar tais dificuldades?
A abordagem conhecida como Behavior-Driven Development pode
ser uma resposta a esta pergunta
Behavior-Driven Development (BDD)
◦ Metodologia de desenvolvimento proposta por Dan North em 2006
◦ User stories (histórias) descrevem o comportamento de features
(funcionalidades)
Estrutura de uma user story
Behavior-Driven Development (BDD)
◦ As histórias fazem uso de uma linguagem ubíqua (compreendida por todos
os envolvidos no projeto)
Behavior-Driven Development (BDD)
◦ Ciclo de desenvolvimento muito semelhante àquele existente para TDD
Behavior-Driven Development (BDD)
◦ Frameworks permitem que as user stories sejam executadas como testes de
aceitação ou regressão a partir de uma IDE
◦ Cucumber → primeira ferramenta a suportar BDD e base utilizada pelos principais
frameworks
◦ Gherkin → mecanismo utilizado pelo Cucumber para interpretar uma história;
suporte à internacionalização
BDD - Benefícios
◦ Melhor comunicação entre os profissionais envolvidos em um projeto
◦ Documentação simples e gerada de forma dinâmica
◦ Facilita o compartilhamento de conhecimentos a respeito de um projeto
◦ User stories apresentam objetivos mais claros e bem definidos
◦ Instrumento de grande valia em equipes que seguem metodologias ágeis
BDD e a plataforma .NET
◦ A opção mais utilizada na atualidade é o framework gratuito SpecFlow
http://www.specflow.org/
◦ O SpecFlow trabalha com especificações de funcionalidades, baseando-se para isto
em user stories
◦ Cenários correspondem a diferentes casos de teste no SpecFlow
◦ A utilização do SpecFlow costuma acontecer em conjunto com outros frameworks
SpecFlow e outros frameworks
◦ MS Test, Nunit, xUnit.net, Selenium, Moq, NSubstitute e Fluent Assertions
são algumas das opções possíveis...
MS Test
Exemplo prático - BDD
Recursos Utilizados
◦ Microsoft Visual Studio 2017
◦ MS Test
◦ SpecFlow
Exemplo de uso do SpecFlow
◦ Funcionalidade para conversão de alturas em pés para o equivalente em
metros
◦ Classe a ser implementada:
Exemplo de uso do SpecFlow
◦ Casos de teste:
◦ Considerar 2 casas decimais para arredondamento da distância em metros
Exemplo de uso do SpecFlow
◦ Regras para a implementação da classe ConversorTemperatura:
C = (F – 32) / 1,8
K = C + 273,15
Selenium
◦ Testes automatizados de interfaces Web
◦ Suporta linguagens como C#, Java, Ruby, Python e Node.js
◦ Compatibilidade com browsers como Firefox, Chrome, Internet Explorer,
Opera
◦ Site: http://www.seleniumhq.org/
E como utilizar o Selenium em .NET?
Combinando o uso do Selenium a frameworks como MS Test, NUnit, xUnit.net, SpecFlow, Moq,
Nsubstitute, Fluent Assertions ....
MS Test
Selenium e boas práticas
◦ Uso do padrão Page Object, proposto por Martin Fowler
◦ Encapsulamento das chamadas envolvendo a manipulação de elementos
HTML, de forma a simplificar a escrita de testes
◦ Referência:
http://martinfowler.com/bliki/PageObject.html
Exemplo prático – SpecFlow + Selenium
SpecFlow + Selenium
◦ Conversão de milhas para Km
◦ 4 casas de arredondamento
Dúvidas?
Parabéns Luigi!
Obrigado!

Testes na plataforma .NET: TDD, Mocks, BDD e Selenium - Developers-SP - Janeiro-2018

  • 1.
    Testes de Software TDD,MOCKS, BDD E SELENIUM
  • 2.
    Renato Groffe ◦ MicrosoftMost Valuable Professional (MVP) ◦ Multi-Plataform Technical Audience Contributor (MTAC) ◦ Mais de 15 anos de experiência na área de Tecnologia ◦ Autor Técnico e Palestrante
  • 3.
  • 4.
    Agenda ◦ Desenvolvimento desoftware – Cenários Comuns ◦ Test-Driven Development ◦ Mock Objects ◦ Behavior-Driven Development ◦ Testando interfaces Web com Selenium
  • 5.
    Desenvolvimento de Software– Cenários comuns
  • 6.
    Desenvolvimento – Cenárioscomuns ◦ Pressões por uma rápida entrega, prazos muito curtos
  • 7.
    Desenvolvimento – Cenárioscomuns ◦ Equipes reduzidas
  • 8.
    Desenvolvimento – Cenárioscomuns ◦ Mudanças frequentes em requisitos
  • 9.
    Desenvolvimento – CenáriosComuns ◦ Áreas de Negócio e Técnica nem sempre falam a mesma língua
  • 10.
    Desenvolvimento – Cenárioscomuns ◦ Testes não são levados tão a sério como se deveria
  • 11.
  • 12.
    Como contornar estesproblemas? Metodologias ágeis ◦ XP (Extreme Programming) e Scrum são os exemplos mais famosos Testando um software ◦ Diferentes abordagens
  • 13.
    Por que testarum software? ◦ Garantir que o projeto atende às especificações ◦ Detectar falhas e defeitos antes da subida para produção
  • 14.
    Alguns tipos detestes ◦ Teste de unidade ◦ Teste de integração ◦ Teste de sistema ◦ Teste de aceitação ◦ Teste de regressão ◦ Teste de UI
  • 15.
    Testes de unidade ◦Automatizados ◦ Repetíveis ◦ Facilidade de implementação ◦ Reuso futuro ◦ Facilidade e rapidez de execução
  • 16.
    Testes de Unidadena plataforma .NET MS Test
  • 17.
    Test-Driven Development (TDD) ◦Desenvolvimento cíclico baseado na codificação e execução de testes de unidade ◦ Testes são escritos antes mesmo da codificação de classes ou métodos ◦ Validação de objetos e métodos (unidades) ◦ Abordagem comumente associada às metodologias ágeis
  • 18.
  • 19.
  • 20.
    Recursos Utilizados ◦Microsoft VisualStudio 2017 ◦.NET Core 2.0 ◦MS Test, xUnit e NUnit
  • 21.
    Exemplo de usodo xUnit ◦ Conversão de temperatura – Escala Fahrenheit para Celsius: ◦ Casos de teste (considerar 2 casas decimais para arredondamento): C = (F – 32) / 1,8
  • 22.
    Exemplo de usodo xUnit ◦ Classe a ser criada:
  • 23.
  • 24.
    Dificuldades técnicas comuns ◦Dependências entre diferentes partes de um software ◦ Inexistência de ambientes com configurações específicas para testes ◦ Integrações com parceiros que não disponibilizam condições adequadas para testes ◦ O teste de determinados recursos precisa esperar pela conclusão de uma ou mais funcionalidades específicas
  • 25.
    Como superar entãoestas dificuldades?
  • 26.
  • 27.
  • 28.
    Algumas soluções paratestes automatizados Implementações fake ◦ Estruturas normalmente descartadas em produção ◦ Implementações contendo dados fixos e nenhuma lógica ◦ Exemplo: utilização de um banco de dados “em memória”
  • 29.
    Algumas soluções paratestes automatizados Mock Objects ◦ Estruturas que simulam objetos reais ◦ Baseados em expectativas ◦ Enfatizam a interação entre objetos (comportamento), prevendo inclusive possíveis falhas de execução ◦ Frameworks simplificam a utilização destas construções
  • 30.
    Algumas soluções paratestes automatizados Stubs ◦ Estruturas com comportamento pré-determinado ◦ Podem fazer uso de implementações fake ou até mesmo um framework para mock ◦ Não há a configuração de expectativas
  • 31.
    Algumas considerações adicionais ◦O termo dublê pode se referir a implementações fakes, mocks e stubs ◦ Temos também o conceito de objetos “dummy” (criados apenas para passagem de parâmetros, sem uso posterior)
  • 32.
    Um pouco deteoria Mocks Aren't Stubs – Martin Fowler https://martinfowler.com/articles/mocksArentStubs.html
  • 33.
  • 34.
    Moq ◦ Framework opensource ◦ Simplifica a utilização de Mocks na validação de soluções construídas em .NET ◦ Permite definir o retorno de métodos, propriedades e até a geração de exceções em tempo de execução ◦ Dispensa a criação de Fakes e outras estruturas que seriam descartadas posteriormente
  • 35.
    NSubstitute ◦ Framework tambémopen source ◦ Alternativa ao uso do Moq, com um funcionamento bastante semelhante ao deste último
  • 36.
    E como utilizarisso em .NET? Combinando o uso do Moq ou Nsubstitute a frameworks como MS Test, NUnit, xUnit.net, SpecFlow, Selenium, Fluent Assertions... MS Test
  • 37.
  • 38.
    Caso de Estudo ◦Consulta a um serviço de crédito (via CPF) – status possíveis: ◦ Parâmetro de envio inválido (retorno de pendências = null) ◦ Erro de comunicação (exceção retornada ao se invocar o serviço) ◦ Pessoa física sem Pendências (zero itens no retorno de pendências) ◦ Pessoa física inadimplente (ao menos uma pendência encontrada) ◦ A ideia por trás do uso de Mock Objects nesta situação é evitar consultas a um tipo de serviço que é pago → as empresas que fornecem os dados não costumam disponibilizar ambientes para testes
  • 39.
  • 40.
    Recursos a seremutilizados ◦ Microsoft Visual Studio 2017 ◦ .NET Core 2.0 ◦ MS Test ◦ xUnit ◦ Moq ◦ NSubstitute ◦ Fluent Assertions
  • 41.
    Dificuldades na adoçãode TDD ◦ Verificar pontos isolados (métodos, classes) nem sempre é uma solução eficiente ou garantia de sucesso ◦ Problemas costumam surgir durante a integração de partes relacionadas ◦ Testes de unidade são compreendidos apenas por pessoas com um perfil mais técnico
  • 42.
    E como superartais dificuldades? A abordagem conhecida como Behavior-Driven Development pode ser uma resposta a esta pergunta
  • 43.
    Behavior-Driven Development (BDD) ◦Metodologia de desenvolvimento proposta por Dan North em 2006 ◦ User stories (histórias) descrevem o comportamento de features (funcionalidades)
  • 44.
    Estrutura de umauser story
  • 45.
    Behavior-Driven Development (BDD) ◦As histórias fazem uso de uma linguagem ubíqua (compreendida por todos os envolvidos no projeto)
  • 46.
    Behavior-Driven Development (BDD) ◦Ciclo de desenvolvimento muito semelhante àquele existente para TDD
  • 47.
    Behavior-Driven Development (BDD) ◦Frameworks permitem que as user stories sejam executadas como testes de aceitação ou regressão a partir de uma IDE ◦ Cucumber → primeira ferramenta a suportar BDD e base utilizada pelos principais frameworks ◦ Gherkin → mecanismo utilizado pelo Cucumber para interpretar uma história; suporte à internacionalização
  • 48.
    BDD - Benefícios ◦Melhor comunicação entre os profissionais envolvidos em um projeto ◦ Documentação simples e gerada de forma dinâmica ◦ Facilita o compartilhamento de conhecimentos a respeito de um projeto ◦ User stories apresentam objetivos mais claros e bem definidos ◦ Instrumento de grande valia em equipes que seguem metodologias ágeis
  • 49.
    BDD e aplataforma .NET ◦ A opção mais utilizada na atualidade é o framework gratuito SpecFlow http://www.specflow.org/ ◦ O SpecFlow trabalha com especificações de funcionalidades, baseando-se para isto em user stories ◦ Cenários correspondem a diferentes casos de teste no SpecFlow ◦ A utilização do SpecFlow costuma acontecer em conjunto com outros frameworks
  • 50.
    SpecFlow e outrosframeworks ◦ MS Test, Nunit, xUnit.net, Selenium, Moq, NSubstitute e Fluent Assertions são algumas das opções possíveis... MS Test
  • 51.
  • 52.
    Recursos Utilizados ◦ MicrosoftVisual Studio 2017 ◦ MS Test ◦ SpecFlow
  • 53.
    Exemplo de usodo SpecFlow ◦ Funcionalidade para conversão de alturas em pés para o equivalente em metros ◦ Classe a ser implementada:
  • 54.
    Exemplo de usodo SpecFlow ◦ Casos de teste: ◦ Considerar 2 casas decimais para arredondamento da distância em metros
  • 55.
    Exemplo de usodo SpecFlow ◦ Regras para a implementação da classe ConversorTemperatura: C = (F – 32) / 1,8 K = C + 273,15
  • 56.
    Selenium ◦ Testes automatizadosde interfaces Web ◦ Suporta linguagens como C#, Java, Ruby, Python e Node.js ◦ Compatibilidade com browsers como Firefox, Chrome, Internet Explorer, Opera ◦ Site: http://www.seleniumhq.org/
  • 57.
    E como utilizaro Selenium em .NET? Combinando o uso do Selenium a frameworks como MS Test, NUnit, xUnit.net, SpecFlow, Moq, Nsubstitute, Fluent Assertions .... MS Test
  • 58.
    Selenium e boaspráticas ◦ Uso do padrão Page Object, proposto por Martin Fowler ◦ Encapsulamento das chamadas envolvendo a manipulação de elementos HTML, de forma a simplificar a escrita de testes ◦ Referência: http://martinfowler.com/bliki/PageObject.html
  • 59.
    Exemplo prático –SpecFlow + Selenium
  • 60.
    SpecFlow + Selenium ◦Conversão de milhas para Km ◦ 4 casas de arredondamento
  • 61.
  • 62.
  • 63.