Considere isto:
public function polynominal($a, $b, $c, $d)
{
return $a * pow($x, 3) + $b * pow($x, 2) + $c * $x + $d;
}
Suponha que você escreva vários testes para a função acima e prove para si e para os outros que "funciona".
Por que não remover esses testes e viver feliz para sempre? O que quero dizer é que algumas funções não precisam ser testadas continuamente após terem sido comprovadas que funcionam. Estou procurando contra-pontos que afirmam que sim, essas funções ainda precisam ser testadas, porque: ... Ou que sim, essas não precisam ser testadas ...
php
unit-testing
testing
tdd
Dennis
fonte
fonte
override_function('pow', '$a,$b', 'return $a * $b;');
em sã consciência ... ou tentará reescrevê-lo para lidar com números complexos.(($a*$x + $b)*$x + $c)*$x + $d
que é fácil de errar, mas geralmente é consideravelmente mais rápida. Só porque você acha que não vai mudar, não significa que não.Respostas:
Teste de regressão
É tudo sobre testes de regressão .
Imagine o próximo desenvolvedor observando seu método e notando que você está usando números mágicos. Foi-lhe dito que os números mágicos são maus, então ele cria duas constantes, uma para o número dois, a outra para o número três - não há nada errado em fazer essa mudança; não é como se ele estivesse modificando sua implementação já correta.
Distraído, ele inverte duas constantes.
Ele confirma o código e tudo parece funcionar bem, porque não há testes de regressão em execução após cada confirmação.
Um dia (pode ser semanas depois), algo quebra em outro lugar. E em outro lugar, quero dizer, no local completamente oposto da base de código, que parece não ter nada a ver com
polynominal
função. Horas de depuração dolorosa levam ao culpado. Durante esse período, o aplicativo continua com falha na produção, causando muitos problemas aos seus clientes.Manter os testes originais que você escreveu pode impedir essa dor. O desenvolvedor distraído confirmaria o código e quase imediatamente veria que ele quebrou alguma coisa; esse código nem chegará à produção. Os testes de unidade também serão muito precisos sobre a localização do erro . Resolver isso não seria difícil.
Um efeito colateral ...
Na verdade, a maioria das refatorações é fortemente baseada em testes de regressão. Faça uma pequena alteração. Teste. Se passar, está tudo bem.
O efeito colateral é que, se você não tiver testes, praticamente qualquer refatoração se torna um risco enorme de quebrar o código. Como são muitos os casos, já é difícil explicar ao gerenciamento que a refatoração deve ser feita; seria ainda mais difícil após as tentativas anteriores de refatoração introduzirem vários bugs.
Por ter um conjunto completo de testes, você incentiva a refatoração e, portanto, melhor, um código mais limpo. Sem risco, torna-se muito tentador refatorar mais, regularmente.
Mudanças nos requisitos
Outro aspecto essencial é que os requisitos mudam. Você pode ser solicitado a lidar com números complexos e, de repente, é necessário pesquisar no log de controle de versão para encontrar os testes anteriores, restaurá-los e começar a adicionar novos testes.
Por que todo esse aborrecimento? Por que remover testes para adicioná-los mais tarde? Você poderia tê-los mantido em primeiro lugar.
fonte
Porque nada é tão simples que não pode haver erros.
Seu código, apesar de aparentá-lo, parece estar livre de erros. Na verdade, é uma representação programática simples de uma função polinomial.
Exceto que tem um bug ...
$x
não é definido como uma entrada para o seu código e, dependendo do idioma ou do tempo de execução ou do escopo, sua função pode não funcionar, causar resultados inválidos ou travar uma nave espacial .Termo aditivo:
Embora você possa considerar seu código livre de bugs por enquanto, é difícil dizer quanto tempo isso permanece. Embora se possa argumentar que escrever um teste para um pedaço de código tão trivial não vale a pena, depois de escrever o teste, o trabalho está concluído e excluí-lo está excluindo uma proteção segura tangível.
Digno de nota adicional são os serviços de cobertura de código (como coveralls.io) que fornecem uma boa indicação da cobertura fornecida por um conjunto de testes. Ao cobrir todas as linhas de código, você fornece uma métrica decente da quantidade (se não da qualidade) dos testes realizados. Em combinação com muitos testes pequenos, esses serviços pelo menos informam onde não procurar um bug quando isso acontecer.
Por fim, se você já tem um teste escrito, mantenha-o . Como a economia de espaço ou tempo decorrente da exclusão, provavelmente será muito menor do que a dívida técnica posteriormente, se ocorrer um erro.
fonte
Sim. Se pudéssemos dizer com 100% de confiança, com certeza: essa função nunca será editada e nunca será executada em um contexto que poderia causar falhas - se pudéssemos dizer isso, poderíamos interromper os testes e economizar alguns milissegundos a cada Construção de IC.
Mas nós não podemos. Ou, não podemos com muitas funções. E é mais simples ter uma regra de executar todos os testes o tempo todo do que se esforçar para determinar exatamente com qual limiar de confiança estamos satisfeitos e com quanta confiança temos na imutabilidade e infalibilidade de qualquer função.
E o tempo de processamento é barato. Esses milissegundos salvos, mesmo multiplicados muitas vezes, não são suficientes para justificar o tempo gasto em todas as funções a serem perguntadas: temos confiança suficiente para nunca precisar testá-lo novamente?
fonte
Tudo o que foi dito nas outras respostas está correto, mas vou acrescentar mais uma.
Documentação
Os testes de unidade, se bem escritos, podem explicar ao desenvolvedor exatamente o que uma função faz, quais são suas expectativas de entrada / saída e, mais importante, qual comportamento pode ser esperado dela.
Isso pode facilitar a detecção de um bug e diminuir a confusão.
Nem todo mundo se lembra de polinômios, geometria ou até álgebra :) Mas um bom teste de unidade verificado no controle de versão será lembrado por mim.
Para um exemplo de como pode ser útil como documentação, veja a introdução do Jasmine: http://jasmine.github.io/edge/introduction.html Aguarde alguns segundos para carregar e role para baixo. Você verá toda a API do Jasmine documentada como saída de teste de unidade.
[Atualização com base nos comentários do @Warbo] Os testes também estão atualizados, pois, se não estiverem, eles falharão, o que geralmente causará uma falha na compilação se o IC for usado. A documentação externa é alterada independentemente do código e, portanto, não está necessariamente atualizada.
fonte
Reality Check
Eu estive em ambientes desafiadores nos quais os testes são "uma perda de tempo" durante o orçamento e o cronograma e, em seguida, "uma parte fundamental da garantia da qualidade" quando o cliente está lidando com bugs, então minha opinião é mais fluida do que outros.
Você tem um orçamento. Seu trabalho é obter o melhor produto possível dentro desse orçamento, seja qual for a definição de "melhor" que você possa juntar (não é uma palavra fácil de definir). Fim da história.
O teste é uma ferramenta em seu inventário. Você deve usá-lo, porque é uma boa ferramenta , com um longo histórico de economia de milhões, ou talvez bilhões de dólares. Se tiver uma chance, você deve adicionar testes a essas funções simples. Pode salvar sua pele algum dia.
Mas no mundo real, com restrições de orçamento e cronograma, isso pode não acontecer. Não se torne escravo do procedimento. As funções de teste são boas, mas, em algum momento, pode ser melhor gastar suas horas de trabalho escrevendo a documentação do desenvolvedor em palavras, em vez de código, para que o próximo desenvolvedor não precise tanto de testes. Ou pode ser melhor gasto refatorando a base de código, para que você não precise se manter tão difícil quanto um animal. Ou talvez seja melhor gastar esse tempo conversando com seu chefe sobre o orçamento e o cronograma, para que ele entenda melhor o que está oferecendo quando a próxima rodada de financiamento chegar ao fim.
Desenvolvimento de software é um equilíbrio. Sempre conte o custo de oportunidade de qualquer coisa que esteja fazendo para garantir que não haja uma maneira melhor de gastar seu tempo.
fonte
Sim, mantenha os testes, mantenha-os em execução e mantenha-os aprovados.
Os testes de unidade estão lá para proteger você (e outros) de si mesmo (e deles mesmos).
Por que manter os testes é uma boa idéia;
fonte
Documentação do desenvolvedor
Documentação do Usuário
fonte