O que é uma proporção normal de "linhas de código funcionais" para "linhas de código de teste"?


27

Eu sou muito novo na abordagem TDD e meus primeiros experimentos dizem que escrever 1 linha de código funcional significa escrever cerca de 2-3 linhas de código de teste. Portanto, no caso de escrever 1000 LOC, toda a base de código, incluindo testes, será algo como ~ 3500 LOC.

Isso é considerado normal? Qual é a proporção no código que você escreve?


8
Sim, o TDD vem com uma etiqueta cara!
EL Yusubov 15/07/2012

6
seu número 2-3X é conservador, na melhor das hipóteses, é realmente mais próximo de 4-5X para coisas como C # / Java, Python / Ruby pode estar mais próximo de 2-3X, com algo conciso como Erlang mais próximo de 1: 1. Depende de quão dogmático você é sobre TDD, quanto mais dogmático, maiores essas proporções!

6
@tomwrong: No livro de Kent, ele cita Ward que você deve escrever testes até que seu medo se transforme em tédio.
Herby

4
@ElYusubov: Não concordo que seja "caro". Parece que sim para aqueles que ainda contam com quantidade de trabalho em LOCs. Mas o preço não está no LOC, está no dinheiro e no tempo de colocação no mercado. E lá, o TDD não é mais caro do que qualquer outro processo de desenvolvimento razoável.
Herby

5
Gente, por que vocês comentam em vez de postar respostas? O que você escreve faz sentido.
Andrey Agibalov

Respostas:


18

1: 3 é normal com TDD.

Da minha experiência, e também de outras citações, lembro.


12
... que citações?
TehShrike

... lembro vagamente ... Eu já não lembro onde estava (talvez no TDD de Kent Beck, por exemplo, talvez em algum lugar do c2.com). Lembro-me do significado, porém, de que três vezes mais código de teste do que código de produção é bom.
Herby

Uau, exatamente o mesmo na minha experiência também. (Estou olhando para os resultados de cloc agora e eu procurei no Google para encontrar posts sobre esta relação)
Nikolay Tsenkov

9

Existem variações baseadas em diferentes estilos e idiomas de codificação. No entanto, independentemente do idioma usado, a maior variação é você.

Robert Martin disse uma vez:

"À medida que os testes ficam mais específicos, o código fica mais genérico".

Isso me fez pensar. Testes mais específicos significam mais código de teste. Um código de produção mais genérico significa menos código; portanto, as taxas de teste / código devem aumentar à medida que o código evolui.

Mas espere, isso também não é bom. Em alguns casos específicos, por exemplo, quando você define um determinado algoritmo, você pode ter apenas 6 a 10 linhas de código contendo alguns "se" s, um tempo e talvez 2-3 recursões. Posso dizer que esse código provavelmente terá mais 100 linhas de código de teste.

Em um projeto real, algo maior que apenas alguns algoritmos, a relação teste / código deve estar entre 1: 1 e 2: 1. Se ficar acima de 2: 1, é um cheiro que você tem testes que devem ser refatorados ou excluídos (ou talvez código difícil de testar). Você sempre deve investir a mesma quantidade de cuidado e refatoração em seus testes e em seu código de produção.

De qualquer forma, a melhor resposta para sua pergunta talvez seja "Complexidade Ciclomática" . Quanto maior a complexidade ciclomática do seu método, mais exponencialmente mais testes você precisa escrever para cobrir todos os casos.


3

A proporção varia de acordo com o tamanho dos seus métodos. O tamanho dos seus métodos varia de acordo com o estilo de programação, idioma e domínio do problema.

Se seus métodos são curtos, 3: 1 é razoável. Se seus métodos são longos, 3: 1 está no lado alto.

Então, para responder sua pergunta, isso depende. :-)


Depende do que você quer dizer com "métodos longos". Que imagem ele criou na minha cabeça é que os métodos são desnecessários por muito tempo, fazendo muito trabalho e tendo muitas responsabilidades (geralmente com muitos parâmetros). Nesse caso, esse método precisa proporcionalmente mais combinações de cobertura por meio de testes, então eu não acho que a relação mudaria muito ...
Herby

Suponha que, por um momento, você possa configurar um teste, chame o método a ser testado e verifique o resultado em três linhas de código. Se o método que você está testando tiver uma linha (como acontece no Scala), seu rácio de código de produção será 3: 1. Se o método tiver seis linhas, será 1: 2. Seis linhas não são tão longas.
9788 Jon Strayer

2

Para aplicações críticas de software, a proporção usual é de um dia de teste para cada 10 LoC funcional.

E isso não está contando TDD, que não é sobre teste, mas sobre especificação.


1

O tamanho do meu código de teste é aproximadamente metade do que o código 'real' é global. Fazer o contrário é indicativo de que seus testes são muito complexos e / ou seu código é muito difícil de testar e / ou seu código é muito denso / complexo.

Ou você está simplesmente testando demais e desperdiçando seu tempo com retornos decrescentes.

Veja também "quando o teste de unidade é inadequado ou desnecessário?"


-1

Minha proporção é de 2-1 a 10-1 (código a ser testado). Verifique se o teste é sobre valor / comportamento e não sobre implementação.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.