Os desenvolvedores devem ser responsáveis ​​por outros testes que não os testes de unidade; se sim, quais são os mais comuns?

35

Atualmente, estou trabalhando em um projeto bastante grande e usei o JUnit e o EasyMock para funcionalidade de teste de unidade bastante extensiva. Agora estou interessado em que outros tipos de teste eu deveria me preocupar. Como desenvolvedor, é minha responsabilidade me preocupar com coisas como testes funcionais ou de regressão? Existe uma boa maneira de integrá-los de maneira útil em ferramentas como Maven / Ant / Gradle? Eles são mais adequados para um testador ou BA? Existem outros tipos úteis de testes que estão faltando?

Jackie
fonte
2
Embora simplista na prática, expanda-o até o limite permitido em seu ambiente, mantendo-se conversacional na prática versus isolado, o que normalmente existe. Pense na equipe de ponta a ponta como mais do que segregação e mais sobre o conjunto de habilidades, cada equipe representa um conjunto de habilidades variado que deve ser aproveitado para o sucesso de ponta a ponta. A equipe deve ser responsável pelo sucesso de quais testes são necessários para alcançar. Como eles são tratados com relação à implementação é exatamente isso, um detalhe da implementação baseado no conjunto de habilidades.
Aaron McIver
11
A resposta a esta pergunta também dependerá do nível de habilidade dos outros membros da equipe. Por exemplo, em uma equipe em que o controle de qualidade não possui fortes habilidades de programação, os desenvolvedores podem se fazer mais do que em uma equipe em que o controle de qualidade pode escrever seus próprios equipamentos de teste.
neontapir
Um bom critério é a automatização dos testes. Os programadores são bons em automatizar as coisas com código.
amigos estão dizendo sobre rwong

Respostas:

44

É sua responsabilidade se esforçar para fornecer código sem defeitos. Você deve escrever, ajudar a escrever ou garantir que os testes sejam escritos ou executados para dar confiança no código que você está entregando.

Nota: não estou dizendo que você é obrigado a fornecer código sem defeitos. Em vez disso, você deve tentar escrever o melhor código possível para os requisitos que foram fornecidos. Parte da capacidade de fazer isso significa que o código deve ser testado.

Se isso significa que você é pessoalmente responsável pelos testes funcionais e de regressão, é principalmente uma função de como sua empresa está organizada. Todos os programadores mais qualificados que conheço não se perguntam "é minha responsabilidade escrever testes do tipo X?". Em vez disso, eles se perguntam "o que devo fazer para garantir que meu código seja testado corretamente?". A resposta pode ser escrever testes de unidade ou adicionar testes à regressão, ou pode significar conversar com um profissional de controle de qualidade e ajudá-lo a entender quais testes precisam ser escritos. Em todos os casos, no entanto, isso significa que eles se importam o suficiente com o código que estão escrevendo para garantir que ele seja testado corretamente.

Conclusão: você deve ser responsável por fornecer código de alta qualidade. Se isso significa que você precisa escrever alguns testes funcionais ou de regressão, faça-o.

Bryan Oakley
fonte
Concordo plenamente com a parte do código de entrega de alta qualidade. Eu estava me referindo mais ao bom código "acima e além". Por exemplo, as alterações consideradas "livres de erros" na sua perspectiva têm um desempenho negativo em outro lugar. O melhor exemplo em que consigo pensar é que um requisito não é devidamente avaliado quanto à carga. Portanto, meu código causa problemas de carregamento no servidor, mesmo que seja "livre de bugs" (ok, então é possível argumentar que não é senão humor). PS: Eu acho que sua parte da confiança é fundamental aqui.
21712 Jackie
10
É de sua responsabilidade fornecer código sem defeitos. É de responsabilidade do desenvolvedor criar o que foi solicitado . Defeitos podem e superfície de requisitos mal reunidos / interpretados, questões ambientais em uma determinada implantação, os conflitos dentro de um sistema operacional, etc ... A menos que a análise da causa raiz é realizada em cada defeito, de código livre de defeitos para o negócio significa que eles esperam fazer o que o usuário espera e menos do que isso é um defeito. Não é realista supor que um desenvolvedor possa permanecer envolvido por todo o SDLC para simplesmente aumentar a confiança; isso não vai escalar.
Aaron McIver
2
"O teste do programa pode ser uma maneira muito eficaz de mostrar a presença de bugs, mas é irremediavelmente inadequado para mostrar sua ausência." - Edsger W. Dijkstra, "The Humble Programmer" (palestra do Prêmio Turing), 1972.
John R. Strohm
11
"É sua responsabilidade fornecer código sem defeitos". é terra de fadas. Você pode entregar o que o escopo exige, mas casos extremos e interpretações da lógica de negócios tornam sua declaração impossível de cumprir. Por que você acha que todas as principais versões de software têm versões e patches, etc? Porque somos todos imperfeitos, incluindo a lógica de negócios.
Jason Sebring
4
Todos os que estão enfrentando problemas com a primeira frase desta resposta ficariam mais felizes se Bryan a tivesse escrito "É seu objetivo fornecer código sem defeitos"?
Carson63000
13

Isso pode ajudá-lo:

Os quadrantes de testes ágeis

Q1 são escritos pelos desenvolvedores.

O Q2 é automatizado pelos desenvolvedores e escrito em colaboração com os negócios e / ou testadores.

foobarcode
fonte
Os desenvolvedores também estão frequentemente envolvidos nos testes do quarto trimestre.
neontapir
O arquivo vinculado não pode mais ser encontrado.
Dušan Rychnovský
3

Existem outros tipos úteis de testes que estão faltando?

Existem testes de aceitação para os quais eu recomendaria estruturas no estilo BDD que usam a linguagem Gherkin : JBehave (Java), Pepino (Ruby), Behat (PHP) etc. Este tipo de teste tem algumas vantagens sobre os testes de unidade:

  • Os testes são facilmente legíveis por não desenvolvedores, para que você possa mostrá-los aos clientes
  • Os testes descrevem claramente os processos de negócios sem entrar em detalhes da implementação (não quero dizer que a implementação não seja importante - com certeza é - mas é melhor quando você separa os requisitos de negócios do próprio código)
  • Os testes fazem coisas que os usuários farão usando seu aplicativo
  • Eles são mais fáceis de escrever (IMHO, pode depender da linguagem e da estrutura): sem zombaria, menos detalhes técnicos
scriptin
fonte
3

O teste funcional pode ser automatizado como testes de unidade e é muito útil para testar como os diferentes componentes do seu projeto funcionam juntos e quão bem o seu sistema reflete as regras de negócios.

Além disso, esse teste automatizado serve como suíte de testes de regressão e aceitação para qualquer alteração principal (ou secundária) que você precise fazer no software (correção de bugs, refatoração, alteração comercial, nova funcionalidade etc.). Isso dá aos desenvolvedores muito mais confiança para fazer isso.

Existem várias estruturas para esse tipo de teste, estamos usando fitnesse com resultados muito bons. Possui uma biblioteca muito boa para testar páginas da Web (usamos para testar nosso aplicativo e serviços da Web) e se integra muito bem ao Maven e Jenkins .

Também costumávamos fazer "testes funcionais cruzados", entre desenvolvedores, mas esse tipo de teste não é "repetível", portanto, sua utilidade é limitada ...

Pablo Lascano
fonte
2

Como desenvolvedor, considero-me responsável pelo teste de unidade de todo o meu código e garanto, da melhor forma possível, que ele não tem defeito. É por isso que temos tantas ferramentas à nossa disposição, como zombarias. O objetivo de criar objetos de simulação em seus testes é exatamente tentar isolar seu código do mundo "externo" e garantir que ele esteja funcionando bem e se houver alguma falha, "a culpa não é sua".

Dito isto, apesar do fato de que a culpa não é sua e que seu código está funcionando como deveria, isso não significa que você não pode ajudar no restante dos testes. Acredito que também é sua a responsabilidade de ajudar e integrar seu trabalho no trabalho de outras pessoas. As equipes de desenvolvimento de TI devem trabalhar sempre como uma máquina bem lubrificada, trabalhando em conjunto com outros departamentos (como o QA) como uma equipe maior para fornecer software confiável.

Mas esse é o trabalho de uma equipe, não apenas o seu.

nunomvbarreiro
fonte
1

Obviamente testes de integração ; eles são mais importantes e mais difíceis de escrever do que os testes de unidade. É como construir uma casa; Com o teste de unidade, você garante apenas que os tijolos são sólidos e resistem à pressão, temperatura, umidade e outras condições. Mas você não tem idéia de como a casa se parece e se comporta com os tijolos juntos.

O problema com grandes projetos, especialmente os Java que residem em um contêiner, é que o teste de integração é difícil. Portanto, para facilitar os testes de integração do sistema em grandes projetos, é necessária uma estrutura de teste, feita especialmente para o projeto, que é o trabalho do desenvolvedor para codificá-lo. Recentemente, grandes melhorias foram feitas nessa área e plataformas como o Arquillian simplificam muito a escrita de uma estrutura de teste (ou mesmo a substitui).

m3th0dman
fonte
1

No mundo real, você é tão responsável quanto seu time / chefe o considera responsável. Se você é pago ou está empenhado em trabalhar incessantemente para encontrar todos os casos extremos e ir direto ao capricho da interpretação do seu chefe (ou pior, do marketing) dos bugs da lógica de negócios, então, de qualquer maneira, você é responsável por tudo.

Portanto, em outras palavras, faça o que for exigido pelo escopo fornecido a você. É um acréscimo legal para mostrar algum senso comum ou ver outras pessoas usarem o produto que você está construindo para ter uma noção dos casos de uso e possíveis problemas a serem corrigidos, mas leve isso à sua equipe ou chefe antes de "consertar". Isso inclui as ferramentas de sua escolha. Todos os seus esforços devem ser algo com que todos estejam envolvidos.

Se sua pergunta for útil sobre rastreamento de bugs, eu gosto do bugzilla, google docs, zendesk ou basecamp em termos de sistemas de comunicação.

Jason Sebring
fonte
1

Eu não acho que isso já foi coberto - desculpe se eu perdi.

Uma questão é o uso eficiente do tempo dos desenvolvedores.

Os desenvolvedores geralmente não têm as habilidades necessárias para serem bons em certos tipos de teste. Em parte, isso é natural. É a mesma razão pela qual os autores têm editores. É muito difícil ver as deficiências em algo se você estiver muito próximo disso. Mas também trata de diferentes conjuntos de habilidades e especialidades diferentes.

Sendo esse o caso, um desenvolvedor que gasta tempo testando é pobre em termos de custo: benefício. Esse desenvolvedor seria mais produtivo ao fazer outras coisas, e um testador especialista seria mais produtivo ao fazer o teste.

Claro que isso faz várias suposições que não são necessariamente válidas. Em uma empresa pequena, por exemplo, pode não fazer sentido empregar pessoas especializadas em testes. Embora possa fazer mais sentido contratar uma equipe de suporte extra e fazer com que eles façam alguns testes, ou pelo menos fazer com que as pessoas testem código que não escreveram por si mesmas.

Steve314
fonte
0

Acredito que é nossa responsabilidade (também do desenvolvedor) abranger todos os cenários de teste possíveis antes de ser lançado para o controle de qualidade. O objetivo do controle de qualidade é validar o software. Além disso, martelar seu próprio código por erros sempre fará com que você pareça bem na hora do controle de qualidade.

Honus Wagner
fonte
Acho que estou tentando chegar ao que é considerado "martelar" eficaz.
21412 Jackie
Isso é definitivamente subjetivo. Eu diria que qualquer tipo de teste que se aplica ao seu projeto (nem todos os tipos de teste se aplicam a todos os projetos, é claro). Aqui está uma lista decente: softwaretestinghelp.com/types-of-software-testing . O que você faz e o que escolhe renunciar depende, é claro, de seu próprio tempo, recursos e capacidade. Por exemplo, talvez você não consiga executar o Teste de aceitação porque existem certas regras que apenas um usuário sabia seguir. Em resumo, faça tudo o que puder no tempo que tiver.
Honus Wagner
Para meus projetos que são principalmente na Web, geralmente tento abranger Unidade, Funcional, Usabilidade, Regressão, Desempenho, não importa o quê. Se eu tiver tempo, opto por Caixa Branca, Estresse, Compatibilidade e até Aceitação, se souber o suficiente. Meu estilo geral de codificação é extremamente voltado para o desempenho, então diminuo minha prioridade nisso. Nada disso significa que o controle de qualidade não encontrará algo errado em nenhum desses tipos de teste, apenas significa que eles encontrarão menos e facilitarão a rodada 2. #
Honus Wagner
0

Quem melhor que um desenvolvedor para saber quais casos de teste são os mais relevantes. O desenvolvedor deve ser responsável por fazer todos os testes de unidade, sempre que possível, o desenvolvedor deve ajudar a escrever e executar os scripts de teste. Como isso raramente é possível em grandes projetos, deve ser concedido tempo para o desenvolvedor revisar todos os casos de teste. Além disso, o desenvolvedor deve ter conhecimento e usar a grande variedade de ferramentas de teste automatizadas disponíveis.

Na minha carreira de desenvolvimento, acho que os projetos acabam com melhores resultados, onde há uma forte integração entre as equipes de desenvolvimento e as equipes de teste.

pelo menos um membro de cada equipe também deve participar das outras reuniões de planejamento e implementação.

Michelle Cannon
fonte
11
O único problema que tenho com isso é que deve haver um grau de isolamento entre os desenvolvedores e a equipe de teste, caso contrário, a equipe de teste ficará contaminada com a opinião do desenvolvedor "o código funciona". O controle de qualidade e os desenvolvedores têm objetivos opostos; o desenvolvedor está tentando fazê-lo funcionar, enquanto a equipe de controle de qualidade está tentando fazê-lo funcionar e nem sempre tem a melhor perspectiva sobre a relevância do teste.
Robert Harvey
Eu discordo cem por cento, mas, novamente, ultimamente, estive envolvido com aplicativos móveis e acho que eles exigem um nível de integração um pouco além do tradicional. Observe que eu uso o termo integração. pode haver isolamento, mas ambas as equipes devem revisar e contribuir para os casos de teste. É improvável que os desenvolvedores tenham acesso a todos os recursos de teste necessários para realizar os testes adequados, também é improvável que os testadores tenham conhecimento para desenvolver casos de teste para algo tão avançado quanto o streaming de vídeo através de redes celulares. muito isolamento = problemas.
perfil completo de Michelle Cannon
quanto mais vertical o mercado e mais especializado eles, mais integração entre as equipes é necessária. na verdade, todos devem entrar na fase de testes com a noção de que o código funciona sob algumas condições testadas, mas é mais provável que seja defeituoso do que não #
Michelle Cannon
Isso parece funcionar, a equipe de teste produz um documento de caso de uso usando a especificação funcional. A equipe de desenvolvimento revisa o documento de caso de uso com base em especificações técnicas e funcionais e adiciona casos conforme necessário. A equipe de teste desenvolve cenários de teste a partir de casos de uso. Casos de teste de revisão de teste de desenvolvimento. Consome muito tempo, mas é melhor do que testar mais tarde na fase de implantação ou produção.
Michelle canhão