Estou estudando bastante sobre a atividade de testes ultimamente e sempre me encontro em um questionamento que acredito que seja comum entre as pessoas que praticam ou estudam essa pratica... Como provar ou avaliar que estou atendendo as expectativas do cliente?Testar segundo nosso amigo Dicionario e: Por a prova, submeter a avaliacao, submeter a teste ou experimentacao. Refletindo sobre o contexto de software percebemos no dia-a-dia o quanto e dificil ter certeza que o software desenvolvido esta de acordo com as expectativas do cliente.Imaginem um restaurante que voce vai pela primeira vez! O Restaurante novo requintado possui um cardapio com nomes esquisitos, molhos e massas com nomes nunca vistos antes e ai ficam as duvidas: Como sera esse prato? Que gosto vai ter essa mistura? Sera que a quantidade e suficiente?... Nesse momento sao criadas as expectativas, o cliente tem a necessidade (fome!!!) e viu as possiveis solucoes dentro da realidade que ele se encontra (restaurante novo!!!), quando ele realiza seu pedido ele acredita que aquilo vai atender as suas necessidades, mas ele nao tem certeza disso (notou alguma semelhanca?).O cozinheiro vai simplesmente pegar o pedido e fazer o que ele sempre faz, para atender aquele pedido. Apesar de diferente o contexto, o cozinheiro tambem esta preocupado em atender as expectativas do cliente, mas mesmo ele fazendo o que esta especificado no cardapio, ele nao tem certeza que vai atender as expectativas do cliente (e agora notou a semelhanca?).Apos o prato servido ao cliente inicia-se o processo de prova, ou experimentacao (Teste). O cliente experimenta com o olhar (prato bonito!), com o cheiro (ta cheirando bem!) e finalmente com a degustacao (eca...ta muito salgado!), e ai chegamos ao final do teste... o cliente sai insatisfeito e talvez nunca mais volte, ou na proxima vez ele da o feedback para o cozinheiro e ele refaz o prato (iterativo), com menos sal e entao o cliente ficara mais satisfeito (agora tenho certeza que voce notou a semelhanca!).Geralmente a atividade de teste e realizada ao final do processo de construcao do software e isso gera um custo que poderia ser minimizado caso tivessemos as expectativas do cliente mapeadas em teste para orientar o desenvolvimento (TDD Test Driven Development), assim teriamos criterios melhores para dizer que o software desenvolvido esta de acordo com as expectativas do cliente, mas mesmo assim ainda nao podemos afirmar com toda a certeza que estamos atendendo 100%, por que temos que lembrar que o cliente ainda esta descobrindo o que ele realmente necessita e por isso precisamos receber esse feedback constantemente para melhorar nossos criterios de aceite e melhorar o software desenvolvido. O objetivo no final e o mesmo que o do restaurante, cliente satisfeito!A pratica de TDD possui principios simples e importantes que ajudam a desenvolver software de maneira iterativa, com design simplificado e evolutivo, codigo enxuto e organizado (refatoracao constante). E o que orienta tudo isso sao os testes, ou seja, as expectativas mapeadas do cliente.No TDD primeiramente procura-se mapear o que o cliente espera do software, para depois construi-lo simplesmente atendendo aquela expectativa mapeada. Assim o software vai