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.