segunda-feira, 30 de abril de 2012

Como aprender a programar para teste de software (automação)?

Na lista de emails do DFTestes tivemos uma pergunta, que no meu ponto de vista foi muito bem colocada, que era:
Como vocês aprenderam a programar especificamente para testes?

Eu, particularmente, fui programador comercial no início da minha carreira em TI, porém não há uma diferenciação entre programar para "testes" e programar comercialmente.

Não deixe de ler depois o post Como obter conhecimento técnico em Teste de Software (de forma gratuita)
Em testes, basicamente, precisamos aprender o básico dos dois itens abaixo:
  • Aprender o básico de alguma linguagem de programação
  • Aprender sobre a ferramenta de automação de teste funcional escolhida

Como aprender o básico de alguma linguagem de programação?
Eu sempre falo que para ser um automatizados o profissional de testes não precisa ter grandes skills de desenvolvimento, apenas saber, entender e aplicar o básico de uma linguagem de programação.

Mas Elias, o que é o básico de uma linguagem de programação?
Para ser mais assertivo com essa resposta fiz uma pesquisa nos principais cursos de desenvolvimentos das principais empresas de treinamento do Brasil. Foquei nas linguagens Java, .NET e Ruby por serem as comercialmente mais usadas. Eis o resultado:
  • Sintaxe básica de linguagem
    • Fundamentos da linguagem
    • Variáveis (tipos, escopo)
    • Operadores (aritméticos, comparação e lógicos)
    • Fluxo de controles (if/else, switch, while, do/while, for)
    • Arrays (bidimensionais, multidimensionais)
  • Orientação a Objetos
    • Classes
    • Encapsulamento
    • Associação
    • Herança
    • Polimorfismo

Os itens acima são muito básicos em qualquer linguagem, e especificamente para o item 2 - Orientação a Objetos para as linguagens orientadas a objetos (todas as tres citadas).

Quem fez ou está fazendo faculdade olhe com carinho a lista acima e responda: Há algum destes itens que você não viu na faculdade?

Geralmente todos estes pontos são abordados por qualquer disciplina de programação na faculdade e não nos damos conta da importância dos mesmos :-)

Como aprender sobre uma ferramenta de automação de teste funcional?
Ai vem o segundo ponto. Posso dizer que uma ferramenta tem dois segmntos:

Em uma aplicação estilo IDE a ferramenta é um software capaz de gravar os passos que executamos sobre o sistema. Após podemos editar o código-fonte gerado para melhorar o teste. Este código-fonte pode ser apresentado em diversas linguagens diferentes, porém geralmente uma única é utilizada pela ferramenta. A ferramenta também dispôe de funcionalidades prontas para o uso no script de teste, como checkpoints/asserções automáticas, conexão com banco de dados, etc...
Para o aprendizado desta ferramenta há três caminhos:
  • Leitura da documentação básica da ferramenta (telas, como gravar e executar testes, etc...)
  • Entendimento das principais funcionalidades "prontas" da ferramenta
  • Aprendizado da linguagem de programação adotada pela ferramenta

Exemplos deste tipo de aplicação são: TestComplete, HP QuickTest Professional, IBM Functional Tester entre outras.

Exemplo de uma aplicação estilo IDE - TestComplete
 
Em uma aplicação estilo API um ou vários arquivos (geralmente chamados de bibliotecas) são disponibilizados para que o profissional utilize métodos daquela API, ou seja, um conjunto de métodos/funções para teste são utilizados para que possamos escrever um script de teste.
Neste modelo os profissionais importam esses arquivos (bibliotecas) para uma IDE de Desenvolvimento (diferente da aplicação estilo IDE que mencionei acima) como Eclipse, Visual Studio, Netbeans entre outras.
Durante a programação do script de teste o profissional vai escrevendo os testes, condições e quaisquer tipos de funções que não estejam presentes, como o acesso ao banco de dados.
Para o aprendizado desta ferramenta há três caminhos:
  • Leitura da documentação básica da ferramenta
  • Leitura de sua API
  • Exercitar as funções da API na utilização da ferramenta

Exemplos deste tipo de aplicação são: Selenium, Watir, Robot Framework entre outras.

Estilo de uma aplicação estilo API usando Eclipse IDE - Selenium

Aplicações estilo API exigem uma capacidade/conhecimento de programação maior do que as aplicações estilo IDE

Adendo
É claro que atualmente existem vagas que não exigem somente o básico de programação para trabalhar na área de teste, como as vagas de SDET - Software Developer in Teste que são posições de desenvolvedores que também trabalham em testes com o intuito de criar sistemas (frameworks) para testar aplicações, além de também conhecer desenvolvimento muito bem.
Vamos encontrar este tipo de vaga em grandes empresas como Google, Microsoft, Amazon, Facebook entre outras.
Infelizmente isso não é uma realidade no Brasil, mas isso dá outro post depois...

Dica
Pela internet é faci encontrar diversos materiais sobre como aprender determinada linguagem de programação. Eu recomendo ler os links abaixo para quem quer começar a estudar por conta com um material confiável:

Abraços!

17 comentários:

  1. Ae Elias trabalhando na emenda do feriado rs, parabéns pelo post

    ResponderExcluir
  2. Apriveitando pra blogar um pouco!
    Valeu!!! :-)

    ResponderExcluir
  3. Dae Elias!

    Muito legal esse post. Eu estava justamente com esta dúvida sobre as necessidades de conhecimento sobre uma linguagem de programação versus a de uma ferramenta de teste.

    Valeu pelas dicas!
    Abraço!

    ResponderExcluir
  4. Parabéns pelo Post Elias. Acompanho seu trabalho há um bom tempo e este com certeza é um dos melhores posts que já li.
    Excelente.
    Abraços,

    Rogério

    ResponderExcluir
  5. Um post interessante sobre a organização dos testes facilitando posteriormente a manutenção dos mesmos pode ser encontrado aqui:
    http://blog.caelum.com.br/organizacao-de-testes-de-aceitacao-com-pageobjects

    ResponderExcluir
  6. Oi Fabricio!
    Obrigado pela dica!

    Vale salientar que esse novo pattern 'Page Objects' veio proveniente de automação orientada a browser web, como as ferramentas de API citadas aqui.

    Grande abraço!

    ResponderExcluir
  7. Muito bom o post parabéns. Sempre é bom ter algo voltado, para os que como eu, estão dando os primeiros passos em teste.

    ResponderExcluir
  8. Parabéns, Elias, excelente matéria. Estamos utilizando a ferramenta Fit - Framework for Integrated Tests, aqui no meu trabalho e tenho conseguido escrever testes funcionais automatizados. Reparei que não é uma ferramenta muito citada. Vc já ouviu falar de alguém que a esteja utilizando? Eu gostaria de trocar ideias.
    Um abraço!

    ResponderExcluir
  9. Olá Cris!
    Obrigado pelo comentário.

    Te respondi via email com um amigo que entende muito desse assunto... rs

    Abraço!

    ResponderExcluir
  10. Gostei bastante do post Elias!!!

    Acredito que nos cursos de graduação há muito pouco incentivo para que os estudantes sejam futuros profissionais da área de qualidade e testes. Artigos como este talvez sirvam como um bom incentivo a esses estudantes...

    Elias e a importância de conhecimento em SQL, ferramentas de teste de unidade e de integração contínua? E o conhecimento sobre a arquitetura do sistema?

    Não sei se essas perguntas tem muita relação com o post, mas...
    Qual a importância desses pontos para um profissional de testes?

    []s

    ResponderExcluir
  11. Oi André!
    Estes pontos são muito importantes também.

    O que eu resolvi focar, neste primeiro post sobre o assunto, é que um testador mesmo deveria saber programar pelo menos o básico, que é o descrito neste post.

    Creio que um testador também possa ter conhecimentos de SQL, IC, Testes Unitários, etc... só que isso o torna um testador mais técnico. No mercado utilizamos a nomenclatura (não obrigatoriamente) de Engenheiro ou Arquiteto de Teste para isso, que seria a pessoa mais técnica que conheceria todos os niveis de teste, como aplicar ferramentas para automatizar o trabalho nestes niveis além de conhecimentos de arquitetura de desenvolvimento.

    Quem sabe estes pontos dão outro post... :)

    Abraço!

    ResponderExcluir
  12. Joia Elias, isso tudo é tudo de MUITA gente ;), gostei da forma que abordou o assunto: claro e objetivo e c/ exemplos ^^

    Agradecido e Atenciosamente / Thanks and Regards,

    - Felipe da Silva
    "A verdadeira mágica da descoberta não está em buscar novas paisagens, mas em ver com novos olhos" ( Marcel Proust)
    http://www.formspring.me/dexfelipe
    @dexfelipes
    http://br.linkedin.com/in/dexfelipe

    ResponderExcluir
  13. Muito bom o post. Atende a muitas das perguntas recorrentes nas listas, onde há uma certa confusão no papel das ferramentas e perfil de utilização.

    Poderia ser identificado também um outro conjunto de ferramentas que eu chamaria de "autoria de especificações", por falta de um nome melhor, que não se encaixam nas categorias do artigo. Nelas temos elementos de keyword-driven testing, combinadas com um front-end que permite edição numa linguagem específica de domínio, que é diferente de uma linguagem de programação.

    Exemplos destas seriam FitNesse, GreenPepper, CubicTest, RobotFramework e Tangle.
    Enfim, só uma ideia ...
    []s

    ResponderExcluir
  14. Muito bom o post. Atende a muitas das perguntas recorrentes nas listas, onde há uma certa confusão no papel das ferramentas e perfil de utilização.

    Poderia ser identificado também um outro conjunto de ferramentas que eu chamaria de "autoria de especificações", por falta de um nome melhor, que não se encaixam nas categorias do artigo. Nelas temos elementos de keyword-driven testing, combinadas com um front-end que permite edição numa linguagem específica de domínio, que é diferente de uma linguagem de programação.

    Exemplos destas seriam FitNesse, GreenPepper, CubicTest, RobotFramework e Tangle.
    Enfim, só uma ideia ...
    []s

    ResponderExcluir
  15. Oi elias,

    Me baseando em uma pergunta do andré ali em cima, o NUNIT é apenas para teste unitário ou serve também para teste funcional?

    Por que usamos o NUNT + Selenium RC...então fiquei na dúvida

    ResponderExcluir
  16. Oi Sérgio!
    O NUnit é sim somente para teste unitário.

    Geralmente criando testes com Selenenium usamos algum framework de testes unitários em conjunto com ele para aproveitar as funções de assert (que vai validar o resultado esperado x resultado obtido) e mais algumas funções especificas de cada framework.

    Mas é bem importante fazer essa separação: o Selenium faz testes funcionais e pode ser usado em conjunto com o NUnit para melhorar e tormar mais rapida o desenvolvimento dos scripts, e o NUnit é somente para testes unitários.

    Abraço!

    ResponderExcluir