O documento apresenta uma palestra sobre Desenvolvimento Dirigido por Testes (TDD). A palestra discute o que é TDD, como funciona, frameworks de teste de unidade, mitos sobre TDD e exemplos práticos em .NET e Java. O palestrante tem mais de cinco anos de experiência em engenharia de software e é instrutor de teste de software.
17. Framework Praxis em JavaFiquem à vontade para questionar qualquer assunto ou perguntar suas dúvidas. Ao final teremos alguns exemplos práticos e tempo para perguntas também.
19. Conceito: Teste de Unidade Teste realizado com os componentes individuais de um software. [Subsequente ao IEEE 610] – Glóssário de termos do ISTQB Testes de unidade é um método pelo qual as unidades individuais do código-fonte são testados para determinar se eles estão aptos para o uso. A unidade é a menor parte testável de um aplicativo. Na programação procedural uma unidade pode ser uma função individual ou procedimento. Na programação orientada a objeto uma unidade é normalmente um método. Os testes unitários são criados por programadores ou ocasionalmente por testadores de caixa branca durante o processo de desenvolvimento. – Tradução Literal da Wikipedia Inglesa
20. O Modelo V Tradicional Planeja > Teste de Aceite Requisitos Teste de Sistema Planeja > Análise Teste de Integração Planeja > Desenho Planeja > Código Teste de Unidade
21. Problema de escrever testes depois Você escreverá testes para passarem. Testes não podem ser feitos para “passar”, devem ser feitos para avaliar o código de produção. Testes feitos para ter testes não tem valor.
23. O modelo V aplicado ao TDD Planeja > Teste de Aceite Requisitos Teste de Sistema Planeja > Análise Teste de Integração Planeja > Desenho Gera > Código Teste de Unidade
24. Framework de Teste de Unidade Código de produção Requisitos Gera É testado por Classe de Teste Acessa Acessa Implementa Dados(DB, XML, Excel) Framework
25. Considerações sobre Teste de Unidade Teste de unidade valida uma unidade; Teste de unidade deve ser executável independente dos dados; O teste de unidade deve conter tudo o que o teste necessita; Teste de unidade não é teste de integração (Cuidado) Teste de unidade feito por fazer não tem valor; Teste de unidade sempre será usado como teste de regressão
26. Outras Considerações Teste de Unidade Nunca use lógica em testes de unidade. Testes de unidade devem ser configurados (Não queremos mais bugs :p ) Não altere ou exclua testes para ter um novo. Sempre adicione o novo. O teste só deve mudar quando a funcionalidade mudar; Quando todos os testes passarem, mude algum if, mude atribuições e retornos de lugar no seu código de produção para ver se os testes são efetivos; Code Review e Test Code Review tem a mesma importância; Teste de unidade deve testar o Contrato, não teste nada além do contrato; Testes de unidade devem ser isolados; Reuse o código de teste;
28. O que tem de teste de software? Uso de técnicas de teste como valores limites, partição de equivalência ou qualquer outra técnica usada para testes de sistema; Casos de teste (em forma de código); São requeridas as mesmas skills dos testes funcionais (criatividade, curiosidade, senso crítico, etc.) . . .
29. O que tem de desenvolvimento? Orientação por Objetos; Acesso a bancos de dados e qualquer outro repositório usado em programação; Padrões de projeto como commanded, value object, imposter, factory method e composite ou qualquer outro usado em programação; Acesso irrestrito a todos os recursos da linguagem e IDE usada; . . .
30. Como o TDD Funciona? Adicionar um teste: Incluir um teste, que pode por exemplo, ter o formato de um caso de teste. Executar o teste: Devemos ter certeza que o teste falha antes da implementação. Se necessário, desenvolva apenas o contrato ou mockspara isso; Desenvolva: Agora complete seu contrato com o código funcional, como sempre fez. Execute o teste: Agora o teste deve passar. Caso existam defeitos, o teste de unidade vai demonstrar erros; Correção e reteste: Agora mude o código fonte de produção até que o teste de unidade tenha um resultado positivo; *Se algo nos requisitos mudar, os testes mudam. http://www.agiledata.org/essays/tdd.html
31. Tem pra Java? http://en.wikipedia.org/wiki/List_of_unit_testing_frameworks
32. Tem pra .Net? http://en.wikipedia.org/wiki/List_of_unit_testing_frameworks
33. Tem pra outras linguagens? 2.41 Perl 2.42 PHP 2.43 PL/SQL 2.44 PostgreSQL 2.45 PowerBuilder 2.46 Progress 4GL 2.47 Prolog 2.48 Python 2.49 R programming language 2.50 REALbasic 2.51 Rebol 2.52 RPG 2.53 Ruby 2.54 SAS 2.55 Scala 2.56 Scheme 2.57 Shell 2.58 Simulink 2.59 Smalltalk 2.60 SQL 2.61 TargetLink 2.62 Tcl 2.63 TinyOS/nesC 2.64 Transact-SQL 2.65 Visual FoxPro 2.66 Visual Basic (VB6) 2.67 Visual Lisp 2.68 XML 2.69 XSLT 2.70 Other Pyunit http://pyunit.sourceforge.net/pyunit.html PHPUnithttp://phpunit.sourceforge.net/ CppTest http://cpptest.sourceforge.net/ Test::Unit http://test-unit.rubyforge.org/ http://en.wikipedia.org/wiki/List_of_unit_testing_frameworks
35. Pré-Condição Podem ser usados MOCKs, Stubs, fakes, procedures (Querys), importações, ou qualquer outro recurso computacional para preparar o ambiente para o teste. A pré-condição também pode ser a execução de outro teste (ou outros). O Visual Studio usa o atributteTestInitialize em um método para executar algo que prepara o ambiente. Aqui é onde configuramos o teste
36. Passos ou Procedimentos de Teste São feitas as atribuições e executadas as funcionalidades. Aqui também são feitas conferências parciais se necessárias. Para finalizar é realizado ultimo procedimento que deve realizar a funcionalidade a ser testada. Aqui é onde configuramos o que será testado
37. Resultados Esperados / Pós condições Aqui são realizadas a comparação (ou comparações se necessária mais de uma) entre o resultado esperado e o resultado atual. Normalmente o framework disponibiliza recursos para execução e registro automático do teste. Aqui é onde verificamos se o resultado esperado e atual são iguais
40. Mitos sobre TDD Só TDD realiza todos os testes que meu projeto precisa; TDD deve ser realizado pelo Analista de Testes; TDD é uma prática exclusiva de métodos ágeis; Testes de Unidade e Testes Funcionais Automatizados são a mesma coisa; TDD faz o projeto ficar mais caro, porque meu programador desenvolve duas vezes; TDD não é escalável (não evolui com o projeto); TDD deve ser usado para 100% do meu código fonte*; TDD = Bala de prata. Se feitos corretamente, pegam todos os bugs;
44. Referências Modelo V descrevendo o paralelismo entre as atividades de desenvolvimento e teste de software (CRAIG e JASKIEL, 2002) http://www.agiledata.org/essays/tdd.html#Misconceptions (em 16/05/2011) http://en.wikipedia.org/wiki/List_of_unit_testing_frameworks(em 18/05/2011) http://artofunittesting.com/ (em 16/05/2011) http://gustavoquezada.blogspot.com/2010/01/vsts-visual-studio-team-system-para.html (Exemplo prático) (em 16/05/2011) http://www.bugbang.com.br/?p=1661 (Vídeo) (em 16/05/2011) http://www.bugbang.com.br/?p=839 (Exemplo prático) (em 16/05/2011) http://www.agiledata.org/essays/tdd.html(em 16/05/2011) http://www.extremeprogramming.org/rules/unittests.html(em 16/05/2011) http://msdn.microsoft.com/en-us/library/aa292197(v=vs.71).aspx(em 16/05/2011) http://viniciusquaiato.com/blog/tag/unit-testing/(em 16/05/2011) http://social.msdn.microsoft.com/Forums/pt-BR/vsunittest/threads (Fórum) (em 16/05/2011) http://diveintopython.org/unit_testing/index.html (em 16/05/2011) http://artofunittesting.com/ (Vídeo) (em 16/05/2011)