O teste de unidade é desenvolvimento ou teste?

24

Tive uma discussão com um gerente de testes sobre o papel dos testes de unidade e integração. Ela solicitou que os desenvolvedores relatassem o que eles testaram na unidade e na integração e como. Minha perspectiva é que os testes de unidade e integração fazem parte do processo de desenvolvimento, não do processo de teste. Além da semântica, o que quero dizer é que os testes de unidade e integração não devem ser incluídos nos relatórios de teste e os testadores de sistemas não devem se preocupar com eles. Meu raciocínio é baseado em duas coisas.

  1. Testes de unidade e integração são planejados e executados sempre contra uma interface e um contrato. Independentemente de você usar contratos formalizados, você ainda testa o que, por exemplo, um método deve fazer, ou seja, um contrato.

    No teste de integração, você testa a interface entre dois módulos distintos. A interface e o contrato determinam quando o teste passa. Mas você sempre testa uma parte limitada de todo o sistema. O teste de sistemas, por outro lado, é planejado e executado de acordo com as especificações do sistema. A especificação determina quando o teste passa.

  2. Não vejo nenhum valor em comunicar a amplitude e a profundidade dos testes de unidade e integração ao testador (sistemas). Suponha que eu escreva um relatório que liste que tipo de testes de unidade são executados em uma classe de camada de negócios específica. O que ele / ela deveria tirar disso?

    Julgar o que deve e o que não deve ser testado é uma conclusão falsa, porque o sistema ainda pode não funcionar da maneira que as especificações exigem, mesmo que todos os testes de unidade e integração sejam aprovados.

Pode parecer uma discussão acadêmica inútil, mas se você trabalha em um ambiente estritamente formal como eu, é realmente importante determinar como fazemos as coisas. Enfim, eu estou totalmente errado?

Rubio
fonte
9
Isso importa?
usar o seguinte
5
@YannisRizos Do título, não. De toda a pergunta, certanly parece tão fro a pessoa que solicita
Ludwig Magnusson
2
@Rubio De sua pergunta, concordo que os relatórios de testes de unidade são inúteis para o testador de sistema. Os testes de unidade são uma ferramenta útil para o desenvolvedor. Como o gerente de testes motiva a necessidade desses relatórios?
Ludwig Magnusson
2
@LudwigMagnusson True, no entanto, se isso importa apenas para a pessoa que pergunta, é muito localizado.
precisa
5
desenvolvedores que se reportam ao gerente de testes estão errados, não importa o quê. Se ela passou essa solicitação através do seu ( gerente de desenvolvimento ), você teria que fazer o que seu chefe lhe disse. "Fale com meu gerente" é a arma que você precisa saber como usar em "ambiente estritamente formal" como o seu
gnat

Respostas:

30

Escrever testes automatizados é um trabalho do desenvolvedor; os testes fazem parte da base de código e devem ser tratados como tal - devem estar sujeitos às mesmas revisões de código, padrões de codificação, disciplina de controle de origem, etc., como o restante do projeto.

A execução desses testes é realizada por dois motivos: primeiro, como uma ferramenta para orientar os desenvolvedores. Você executa testes para verificar se o código que você acabou de escrever faz o que deveria, usa-os como documentação adicional e para verificar se as alterações não quebram nenhuma funcionalidade existente. Se você faz TDD real, os testes também são uma fonte autorizada de especificações técnicas. O segundo motivo para usar os testes é durante o controle de qualidade e a implantação. A execução de todos os testes automatizados deve ser uma das primeiras etapas em cada rodada de teste; a execução de testes automatizados é barata (praticamente nenhuma mão de obra necessária) e não faz muito sentido entrar em testes manuais se os automatizados falharem.

Isso significa que as responsabilidades devem ser assim:

  • Os desenvolvedores escrevem testes automatizados
  • Os desenvolvedores executam testes automatizados individuais, conforme necessário, como parte de seu fluxo de trabalho de desenvolvimento
  • O controle de qualidade executa todos os testes automatizados como um dos primeiros estágios do teste

Se você possui um servidor de construção, a tarefa do controle de qualidade (referente aos testes automatizados) se resume a "abrir o relatório do servidor de construção e verificar se tudo está verde".

tdammers
fonte
Excelente post, exatamente ao longo das linhas que eu ia postar. Somente o qualm depende muito de testes de unidade, bem como testes de integração podem levar a problemas futuros. Discordo do fato de que a tarefa do controle de qualidade se resume a verificar o servidor de compilação (suponho que você queira dizer algo como Hudson). Isso está colocando toda a carga de teste dos desenvolvedores para escrever testes que cobrem TODAS as lógicas de negócios, o tempo todo, o que parece estar colocando muito peso nos desenvolvedores.
dardo
4
@ardo: É claro que testes automatizados não são os únicos testes que você deve executar, caso contrário, você pode simplesmente se livrar do controle de qualidade. Isso seria ridículo - muitos aspectos cruciais de qualquer produto de software simplesmente não podem ser testados automaticamente. O que quero dizer é que, dada a existência de testes automatizados, o controle de qualidade não precisa se preocupar com eles, além de verificar a saída do servidor de compilação; depois disso, eles fazem suas coisas normais - testes manuais e semi-automatizados na compilação concluída.
tdammers
Ah sim, concordo 100% Como uma espécie de ponto de verificação, eles estão lá, eles passam, etc.
dardo
@ tdammers - Os testes são apenas uma pequena parte da garantia de qualidade.
Matthew Flynn
2
Excelente resposta, porém não concordo que os testes devam ser vistos como an authoritative source of technical specifications. Os testes devem ser uma confirmação das especificações, mas certamente não uma substituição. Isso não quer dizer que estou defendendo uma grande especificação inicial, mas sim que estou fazendo a distinção de que aplicamos testes para validar as coisas que sabemos sobre a maneira como um sistema deve se comportar, em vez de ter o testes definem o comportamento. Uma distinção pedante, talvez, mas importante, no entanto.
S.Robins
10

Acho que o mais importante para você seria esclarecer por que ela precisa desse relatório.

Pode haver explicações diferentes (como sugerido por várias respostas), que exigem estratégias muito diferentes.

  • se ela é uma pessoa razoável, simplesmente querendo obter informações para ajudar o trabalho de sua equipe de teste, faz sentido chegar a um entendimento comum e elaborar alguma solução que seja adequada para vocês dois. Você pode discutir com ela a natureza dos testes de unidade e a diferença fundamental entre os testes de unidade versus funcional / sistema / aceitação. Espero que você entenda que eles funcionam em níveis muito diferentes e que nenhum deles pode substituir o outro.
  • se ela é uma maníaca ou burocrata de controle, exigindo um relatório apenas por isso, você pode gerar algo para satisfazer seus caprichos com o mínimo de esforço (por exemplo, o que o @Doc sugeriu :-).
  • se ela estiver em algum jogo poderoso, você pode questionar se ela tem o direito de exigir relatórios dos desenvolvedores. Na minha experiência, os desenvolvedores geralmente não devem se reportar ao departamento de controle de qualidade.
Péter Török
fonte
Bons pontos. Ela parece uma pessoa razoável. Meu medo, que não deixei muito claro, é que os testes de unidade conduzam os testadores na direção errada e na segurança falsa naquilo que eles precisam e não precisam testar.
Rubio
2
@ Rubio, de fato, você deve esclarecer a ela que os testes de unidade não podem substituir os testes do sistema. De fato, a alta cobertura de teste unitário de um módulo específico pode até ser um sinal de aviso de que esse módulo precisa de atenção extra durante o teste do sistema! Se os desenvolvedores tiveram o cuidado de escrever muitos testes, o código pode ter sido drasticamente alterado / estendido recentemente e / ou está cheio de bugs.
Péter Török
7

Acho que o papel do controle de qualidade e desenvolvimento e a interação podem variar muito entre as organizações. Mas, em geral, na minha equipe, digo aos membros para fingir que não há uma equipe de controle de qualidade, no sentido de que eles são responsáveis ​​pelas mudanças que estão promovendo na produção. Por sua vez, nossa equipe de controle de qualidade não assume muito a respeito dos testes dos desenvolvedores e faz uma boa quantidade de testes no sistema como um todo funcional.

Por esse motivo, nossa equipe de controle de qualidade não se importa muito com o que é e o que não é testado em unidade antes de começar.

Eu acho que é útil para a equipe de controle de qualidade entender o que os testes de unidade fazem e não cobrem, em alto nível, para que possamos trabalhar coletivamente para identificar lacunas e áreas que possam precisar de mais rigor. Portanto, talvez seu colega esteja procurando um resumo de alto nível, em oposição aos detalhes sangrentos.

Paul Sanwald
fonte
5

Ela insistiu que os desenvolvedores relatassem o que eles testaram na unidade e na integração e como.

Ela está realmente tentando discutir se esse tipo de teste está realmente no domínio do "desenvolvimento" ou está apenas tentando descobrir o quão bem seu código é coberto pelo teste de unidade? Apenas olhando as informações que você forneceu, parece que ela só quer saber quais partes do código são cobertas e onde ela deve concentrar o esforço de sua equipe.

Eu trabalhei em uma equipe de teste logo depois da escola antes de me mudar para uma função de desenvolvimento e posso ver como isso pode ser valioso para ela e sua equipe.

Jason
fonte
11
Mas o foco não deveria vir das especificações? Há situações em que as alterações no código têm repercussões inesperadas e, em seguida, é muito importante para o desenvolvedor comunicar que o teste também deve cobrir isso e isso.
Rubio
11
@Rubio: Claro, mas de um ponto de vista puramente prático, tente e olhe para ela da perspectiva dela. Supondo que todas as partes do aplicativo não tenham quantidades perfeitamente iguais de código cobertas pelos testes de unidade, você não gostaria de dedicar mais recursos limitados às partes do aplicativo com menos cobertura? Para mim, é simplesmente uma questão de olhar para o relatório e dizer à minha equipe: "Ei, parece que a Área X tem menos código coberto por testes do que a Área Y, vamos tentar focar na execução de testes na Área X"
Jason
@ Rubio: sim, mas se você estiver fazendo TDD (ou seja, BDD) corretamente, seus testes devem ser contra as especificações em primeiro lugar. Se sua empresa fosse realmente esclarecida, a equipe de teste poderia escrever os testes para a equipe de desenvolvimento.
Gbjbaanb
2
O que é testado: relatório de cobertura de código gerado automaticamente. Como é testado: leia o código do teste de unidade. @gbjbaanb: "a equipe de teste pode escrever os testes para a equipe de desenvolvimento". Há tantas coisas erradas nessa afirmação que não sei por onde começar, exceto para dizer: Má ideia .
BryanH
5

Não vejo que isso importe demais.

Se você não os fornecer ao controle de qualidade / teste, e eles não fizerem os testes adequados, e ele falhar na produção, é culpa deles deixar o controle de qualidade entrar em produção sem verificar se funciona como especificado.

Se você os fornecer ao controle de qualidade / teste, e eles não fizerem os testes adequados ... o mesmo resultado como se você não os tivesse fornecido.

No entanto, se você os fornecer, eles também poderão compará-los com as especificações e / ou sugerir quais testes podem ser falhos ou precisam ser alterados porque encontraram um bug.

Realmente, não vejo muita desvantagem em fornecê-los. Ainda está em controle de qualidade / teste para validar com as especificações. Se eles tomam o caminho preguiçoso e apenas confiam que seus testes são bons o suficiente porque todos passaram, foram eles que falharam em seu trabalho. Contanto que eles ainda possuam as especificações, os resultados dos testes de unidade / integração são apenas leves e não devem machucá-lo de uma maneira ou de outra. Esta é a razão pela qual temos dev e QA. Várias verificações de que o aplicativo executa conforme especificado.

Os desenvolvedores cometem erros, o controle de qualidade comete erros, o ideal é que eles não cometam erros no mesmo item ... e se o fizerem ... é potencialmente um analista que deixou cair a bola escrevendo uma especificação pouco clara.

CaffGeek
fonte
2
A desvantagem para mim é um trabalho extra que oferece pouco ou nenhum valor.
Rubio
@ Rubio, que trabalho extra? Basta imprimir o resultado. Se eles forem bem nomeados, isso indica o que você está testando. Não deve precisar do código ou descrição real de como o método funciona. Se o fizerem, eles mesmos podem procurar.
CaffGeek
11
A geração de um relatório dos 3500 testes de unidade / integração aprovados provavelmente seria de pouca ajuda para o testador, mesmo que os testes fossem bem nomeados (que deveriam ser, mas não são). Para fornecer aos testadores informações significativas sobre o teste de unidade, o desenvolvedor precisaria examinar o teste de unidade associado a um recurso específico e, de alguma forma, comunicar ao testador o que é realmente testado e como é afirmado. Isso dá muito trabalho.
Rubio
11
@Rubio - automation é seu amigo. Você pode configurar um servidor de integração contínua que envie relatórios sempre que houver um check-in (isso também ajudará você). Se o controle de qualidade estiver solicitando uma explicação dos testes e do código, parece que eles foram além do nível de razoabilidade e entraram no campo da "falha em compreender o conceito". Se eles não puderem ou não quiserem ler o código, serão inúteis. Nesse ponto, uma conversa com seu gerente seria benéfica e você pode descrever como: "O controle de qualidade quer que eu gaste x% do meu tempo ajudando-os a ler o código, está bem?"
BryanH
11
+1 por dizer que não isenta o controle de qualidade de sua responsabilidade de testar o software independentemente .
2

O teste de unidade é de responsabilidade dos desenvolvedores, pois os testes podem ser úteis para entender como os trechos de código funcionam por conta própria. Alguns podem ver isso como uma forma de documentação e, portanto, têm algum valor, embora possa haver sobrecarga se os testes de unidade forem alterados regularmente.

O outro valor na passagem dos testes é que isso pode evitar duplicar os testes que podem ser redundantes em termos de garantia da funcionalidade básica.

Também há testes de aceitação do usuário que são separados de tudo isso, pois o usuário final pode ter seu próprio entendimento de como um sistema deve funcionar.

JB King
fonte
11
Teste redundante é o que costuma ser usado como argumento e, às vezes, pode ser verdade. No entanto, o teste do sistema é sempre executado em todo o sistema, enquanto o teste de unidade / integração se concentra em uma unidade específica. Eu vejo um perigo aqui.
Rubio
2

Se sua empresa possui uma metodologia definida para garantir a qualidade de seus produtos (se eles são compatíveis com SOX ou estão tentando melhorar seu nível de CMMI, provavelmente o fazem), os produtos devem ser capazes de resistir à auditoria para mostrar que o processo foi seguido.

Freqüentemente, o processo definido inclui testes de unidade (o que é uma coisa boa). Infelizmente, isso também significa que você deve documentar seus testes de unidade e provar que eles foram executados para resistir à auditoria. Isso significa que você precisa de uma maneira de relatar seus testes de unidade.

Olhe para uma ferramenta como o Sonar para ajudá-lo - ela relatará o nível de cobertura do código e os resultados dos testes de unidade.

Matthew Flynn
fonte
SOX não, CMMI sim. Nossos testes de unidade / integração fazem parte do processo de revisão de código e resistem à auditoria. Posso obter um relatório gerado a partir de uma execução de teste de unidade / integração, mas isso é bastante enigmático para um testador. A cobertura também está no relatório, mas isso por si só não significa nada.
Rubio
Primeiro, não dê nomes enigmáticos aos seus testes. Confira dannorth.net/introducing-bdd . Segundo, a cobertura do código pode não dizer muito sobre a qualidade dos testes, mas pelo menos mostra que as unidades que estão sendo testadas não explodem quando a maior parte do código é executada.
Matthew Flynn
Bom link, obrigado. Lembro-me de ler um excelente artigo de revista explorando maneiras diferentes de nomear testes de unidade, mas não posso encontrá-lo agora pela morte. Pode ter sido a Visual Studio Magazine ou Code Magazine.
Rubio
2

Isso realmente depende da empresa, mas pela minha experiência em trabalhar como testador de sistema em uma abordagem tradicional, mas também como testador trabalhando em uma equipe ágil em um modelo de CD, saber o que foi testado por unidade e integração é extremamente útil.

A qualidade é responsabilidade da equipe - desenvolvedores, testadores e gerenciamento de produtos e trabalhar juntos é a melhor maneira de garantir isso.

Portanto, o gerente de teste deseja saber o que foi testado por unidade e integração e é um pouco mais de trabalho extra para os desenvolvedores, mas economiza o trabalho geral do projeto! Ao fornecer as informações ao gerente de teste, eles podem concentrar o esforço da equipe de teste no que é crítico e importante. Como mencionado anteriormente, se uma área do código não é testada em unidade, a equipe pode concentrar seu esforço lá em comparação com uma área que é fortemente testada - por que duplicar o esforço? Todos vocês estão trabalhando para o mesmo objetivo final de software de alta qualidade lançado no prazo.

Lauren
fonte
1

Eu pensaria que seria benéfico fornecer esse tipo de coisa. A cobertura do teste de unidade deve ser algo conhecido pelo desenvolvimento e teste, para que eles possam explicar isso.

Obviamente, você precisa testar as coisas críticas dos negócios, não importa o quê. Você precisa testar a funcionalidade comumente usada com força, independentemente de ter uma excelente cobertura de teste de unidade. Não faria mal deixá-los saber que outros lugares são cobertos por testes de unidade. O código já verifica casos extremos neste pequeno controle? É útil saber esse tipo de coisa por todos os lados da empresa.

Chad Stewart
fonte
Eu estava prestes a escrever uma resposta semelhante. Embora o teste de unidade deva estar no domínio do desenvolvedor de software, dar à equipe de teste uma noção da cobertura do código pode ajudar a equipe de teste a entender e direcionar áreas específicas que podem exigir maior atenção pelos testadores. Também pode ser uma maneira de manter os desenvolvedores em seu jogo, em termos de garantir que eles representem o maior número possível de casos extremos. Isso permite que a equipe de teste não apenas valide a totalidade do sistema, mas também contabilize todas as coisas que, de outra forma, poderiam ser consideradas caras para testar.
precisa saber é o seguinte
1

Vale mencionar a abordagem discutida no livro "Como o Google testa o software": teste e controle de qualidade é responsabilidade de todos, e os padrões são rigorosos.

O verdadeiro papel do que é tradicionalmente chamado de departamento "Testes" é na verdade a produtividade do desenvolvedor; isto é, automação para permitir que a organização alcance economicamente o nível exigido de rigor.

William Payne
fonte