Como cito um trabalho no PHPUnit?

9

Faço programação de sites há 15 anos e PHP nos últimos 5 anos. Eu sempre escrevi um código sólido. No entanto, eu tenho um cliente que insiste em 80% do código sendo testado em unidade. Como o cliente SEMPRE ESTÁ CERTO, estou planejando usar o PHP_CodeSniffer para garantir que meu código pareça correto e o PHPUnit para realizar meus testes de unidade. Espero aprender algo com essa experiência.

Essas são as ferramentas certas para usar? Quanto tempo está envolvido na configuração do PHPUnit e na gravação do código adicional? Levarei cerca de 8 semanas para escrever as páginas da web e fazer o autoteste, como fiz no passado. Se eu adicionar 4 dias adicionais (10%) para teste de unidade (PHPUnit), isso é suficiente? Pensamentos? Sugestões? Obrigado.

Comunidade
fonte
2
o teste de unidade pode dobrar o tempo de desenvolvimento.
Você trabalhou com PHP 2.0? Agradável! Minha opinião não se qualifica para uma resposta, em suma: para a escolha das ferramentas que você precisa, imho. Veja minha opinião sobre os frameworks de teste php e, para phpcs, eu nem conheço nenhuma alternativa. Quanto ao tempo a acrescentar: Depois de fazer o TDD por algum tempo, geralmente sou mais lento sem ele, mas como comecei algumas coisas muito mais (+ 50%). Se você usar uma estrutura que dificulta o teste (muitas coisas estáticas), adicione ainda mais.
21411 Edorian
11
Isso aumentará o desenvolvimento inicial, mas em um projeto de 8 semanas, você descobrirá que faz menos diferença, pois os testes de unidade o ajudarão a descobrir bugs mais cedo e mais fácil.
Fenton
11
@Dragon, tipo de, mas a unidade está testando também acelera o desenvolvimento [há muito menos do deploy / test / encontrar \ ciclos de correção
monksy

Respostas:

7

Em uma linha: depende de como você trabalha. Eu sinceramente acho que 10% é muito pouco. Deve ser pelo menos 25%, se não 40%, se não 60%, se não mais.

Primeiro, eu concordo muito com o seu cliente lá. Os testes de unidade são uma parte essencial de um produto robusto, fácil de manter e fácil de depurar.

Eu vou falar do que eu sei. Eu uso TDD (Test-Driven Development) para a maioria dos projetos. O TDD basicamente faz você escrever os testes antes do código real. Eles estabelecem um conjunto de critérios de aceitação que o produto final precisa atender. Geralmente, você gasta de 50% a 70% do seu tempo escrevendo testes e o restante para implementar código para fazê-los passar.

Embora possa parecer absurdo e / ou enorme, posso garantir que não é. Aqui está o porquê:

  • Você será capaz de descobrir quais são os melhores padrões de arquitetura a serem usados ​​ao escrever os testes. Dessa forma, quando você começar a codificar, a arquitetura do aplicativo mudará minimamente (porque todos sabemos como é confortável refazer uma arquitetura do aplicativo).
  • Você codifica apenas para fazer os testes passarem (tornando o produto final aceitável). Você não perderá tempo programando recursos inúteis / fora do escopo.
  • Por ter menos código (ou seja, apenas o código que você realmente precisa), é menos propenso a erros. (Menos código = menos erros).
  • Se você cometer um erro, e cometerá, levará muito menos tempo para descobrir por que há um problema e onde está o problema. Se os testes forem escritos corretamente, significa que um único erro causará uma única falha, não uma reação em cadeia. Dessa forma, você pode identificar facilmente a origem do problema em questão de minutos, se não segundos.
  • Levará muito menos tempo para implementar o código real com testes de unidade. Assim que um teste falha, você sabe que algo está errado. Você não precisa ir e voltar com o cliente para corrigir bugs.
  • Eventualmente, você terá que alternar com o cliente para corrigir erros, porque nada pode capturar 100% dos erros. No entanto, você pode facilmente capturar 95%, se não mais.

O PHPUnit é praticamente a ferramenta de fato para testes de unidade do PHP, e é muito bom nisso. Eu não usei muito o PHP_CodeSniffer. No entanto, acho que se você está trabalhando sozinho, provavelmente não precisa. É mais útil em uma equipe garantir que o código tenha a mesma aparência, independentemente de quem o codificou.

codificador de rede
fonte
5

Adereços para você por ter a atitude de que você aprenderá algo com essa experiência. Tenho certeza que você vai.

A primeira coisa que você deve aprender é que a necessidade de teste de unidade não tem nada a ver com a sua experiência . O melhor desenvolvedor também será um dos melhores testadores de unidades:

Bill Venners: Você diz em seu livro Refatoração: "Se você deseja refatorar, a pré-condição essencial é ter testes sólidos". Isso significa que, se você não tem testes, não deve refatorar?

Martin Fowler: Você deve pensar nisso como andar na corda bamba sem rede. Se você é bom em andar na corda bamba e não é tão alto assim, então pode tentar. Mas se você nunca andou na corda bamba antes, e está nas Cataratas do Niágara, provavelmente quer uma boa rede.

Em http://www.artima.com/intv/refactorP.html

Eu costumava escrever PHP sem teste de unidade. Depois de anos praticando testes de unidade em Java, descobri que não podia trabalhar em nada muito mais complicado do que páginas únicas em PHP sem testes de unidade. O motivo? Produtividade . Sem o teste de unidade, eu não poderia refatorar com confiança - isso significava que: A) eu precisaria desanimar muito mais e trabalhar com tudo desde o início novamente, ou B) , teria que lidar com códigos legados e feios.

Ao fazer um lance, você precisa levar em consideração a hora de testar? Sim . Parece intuitivo que isso levará mais tempo? Sim de novo . Você provavelmente, como algumas outras respostas estimaram aproximadamente, precisará estimar 50-100% maior do que sem testes de unidade.

Contudo!...

  • Você capturará e resolverá os buracos de especificação mais cedo
  • O que significa que você estará desenvolvendo uma especificação mais limpa e sólida
  • Você será capaz de responder com rapidez e confiança às alterações nas especificações
  • Você terá menos bugs
  • Seus erros serão detectados mais cedo e mais fácil de corrigir

E, como resultado, suas estimativas serão mais precisas . Se você cobrar a cada hora, impressionará mais seus clientes e poderá aumentar suas taxas. Se você cobrar uma taxa fixa, você ganhará mais dinheiro por hora.

Sem o teste, suas estimativas provavelmente são um crapshoot. Erros, pedidos de alteração e redefinições são terríveis para se estimar com precisão. Testar é a chave para minimizar o impacto de todos os três!

Nicole
fonte
3

Não há uma resposta fácil quanto tempo vai demorar.

Mas, como regra básica, se for um projeto curto: eu diria que o desenvolvimento juntamente com um bom teste de unidade levará 1,75 a 2 vezes o tempo do desenvolvimento sem o teste de unidade. Para projetos mais longos, talvez 25-30%?

Sugiro fazer testes de unidade antes de escrever seu código. Desta forma, a construção do andaime de teste de unidade na verdade se torna parte do seu processo de design e, portanto, você não deve considerar que está perdendo tempo para o teste de unidade, mas a construção do teste de unidade está ajudando você a projetar um um ótimo produto e a existência desse teste após a sua criação tornam mais fácil garantir que ele continue assim. Ter que escrever os primeiros testes de unidade é maravilhoso para ajudar a focar em requisitos reais, nos fornece uma maneira clara de testar se estamos prontos (passando nos testes de unidade) e nos ajuda a "testar cedo e testar frequentemente".

Quanto ao PHPUnit .... Já faz um tempo desde que eu o usei, minha impressão é de que ele é poderoso, mas talvez precise de mais trabalho antes de ser realmente polido.

Porém, se há uma coisa que quero comunicar aqui: Por favor, não veja o Teste de Unidade como uma mera formalidade no final do seu projeto. Se isso é tudo, na minha opinião, é inútil.


fonte
3

As respostas até agora são bastante completas, então adicionarei um ponto não coberto: o tempo extra devido ao uso do PHPUnit será

  1. mais alto desde o começo, e você está aprendendo
  2. diminua o tempo de desenvolvimento que não é de teste à medida que ganha confiança.

As classes de modelo de teste de unidade que não lidam com apresentação são bastante diretas. Você escreve um teste para cada classe e, nesses casos, pode instanciar e configurar diretamente um objeto para testar um método / recurso específico. Depois de configurar e executar o PHPUnit, você poderá fazer com que esses testes funcionem rapidamente.

As páginas da Web de teste de unidade podem ser mais complicadas. Se você usa o Zend Framework, Symfony, Smarty ou qualquer outro mecanismo MVC, conseguir que o PHPUnit funcione bem com eles pode levar mais tempo. Usamos o Zend Framework e gastei um tempo considerável construindo classes base para testar controladores e exibir scripts isoladamente. Dado o tamanho deste projeto, você provavelmente está melhor começando ControllerTestCase.

David Harkness
fonte