O documento resume as principais técnicas e ferramentas para testes de software, como TDD, mocks, BDD e Selenium. Apresenta os conceitos e benefícios de cada abordagem, além de exemplos práticos de implementação com .NET.
2. 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
4. Agenda
◦ Desenvolvimento de software – Cenários Comuns
◦ Test-Driven Development
◦ Mock Objects
◦ Behavior-Driven Development
◦ Testando interfaces Web com Selenium
12. Como contornar estes problemas?
Metodologias ágeis
◦ XP (Extreme Programming) e Scrum
são os exemplos mais famosos
Testando um software
◦ Diferentes abordagens
13. Por que testar um software?
◦ Garantir que o projeto atende às especificações
◦ Detectar falhas e defeitos antes da subida para produção
14. 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
15. Testes de unidade
◦ Automatizados
◦ Repetíveis
◦ Facilidade de implementação
◦ Reuso futuro
◦ Facilidade e rapidez de execução
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
21. 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
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
28. 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”
29. 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
30. 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
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 de teoria
Mocks Aren't Stubs – Martin Fowler
https://martinfowler.com/articles/mocksArentStubs.html
34. 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
35. NSubstitute
◦ Framework também open source
◦ Alternativa ao uso do Moq, com um
funcionamento bastante semelhante ao deste
último
36. 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
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
40. Recursos a serem utilizados
◦ Microsoft Visual Studio 2017
◦ .NET Core 2.0
◦ MS Test
◦ xUnit
◦ Moq
◦ NSubstitute
◦ Fluent Assertions
41. 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
42. E como superar tais 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)
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 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
50. 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
53. Exemplo de uso do SpecFlow
◦ Funcionalidade para conversão de alturas em pés para o equivalente em
metros
◦ Classe a ser implementada:
54. Exemplo de uso do SpecFlow
◦ Casos de teste:
◦ Considerar 2 casas decimais para arredondamento da distância em metros
55. Exemplo de uso do SpecFlow
◦ Regras para a implementação da classe ConversorTemperatura:
C = (F – 32) / 1,8
K = C + 273,15
56. 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/
57. 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
58. 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