Was ist ein normales Verhältnis von funktionalen Codezeilen zu Testzeilen?

27

Ich bin ziemlich neu im TDD-Ansatz und meine ersten Experimente besagen, dass das Schreiben von 1 Zeile Funktionscode etwa 2-3 Zeilen Testcode bedeutet. Für den Fall, dass ich 1000 LOC schreiben werde, wird die gesamte Codebasis einschließlich der Tests ungefähr 3500 LOC sein.

Wird das als normal angesehen? Wie ist das Verhältnis in Code, den Sie schreiben?

Andrey Agibalov
quelle
8
Ja, TDD kommt mit einem teuren Etikett!
EL Yusubov
6
Ihre 2-3X-Zahl ist bestenfalls konservativ , sie liegt bei C # / Java eher bei 4-5X, bei Python / Ruby eher bei 2-3X und bei Erlang eher bei 1: 1. Hängt davon ab, wie dogmatisch Sie in Bezug auf TDD sind. Je dogmatischer Sie sind, desto größer werden diese Verhältnisse!
6
@tomwrong: In Kents Buch zitiert er Ward, dass Sie Tests schreiben sollten, bis sich Ihre Angst in Langeweile verwandelt.
Herby
4
@ElYusubov: Ich stimme nicht zu, dass es überhaupt "teuer" ist. Es scheint so für diejenigen, die noch viel Arbeit in LOCs zählen. Aber der Preis ist nicht in LOC, sondern in Geld und Time-to-Market. Und dort ist TDD nicht teurer als jeder andere vernünftige Entwicklungsprozess.
Herby
5
Leute, warum kommentierst du, anstatt Antworten zu posten? Was Sie schreiben, macht Sinn.
Andrey Agibalov

Antworten:

18

1: 3 ist bei TDD normal.

Aus meiner Erfahrung und auch aus anderen Zitaten erinnere ich mich.

herby
quelle
12
... welche Zitate?
TehShrike
... erinnere mich vage ... Ich erinnere mich bereits nicht, wo es war (vielleicht in der TDD By Example von Kent Beck, vielleicht irgendwo auf c2.com). Ich erinnere mich jedoch an die Bedeutung, dass dreimal mehr Testcode als Produktionscode in Ordnung ist.
Herby
Wow, genau so erlebe ich es auch. (Ich starre gerade auf die Ergebnisse von cloc und habe bei Google nach Beiträgen zu diesem Verhältnis gesucht.)
Nikolay Tsenkov
9

Es gibt Variationen, die auf unterschiedlichen Codierungsstilen und Sprachen basieren. Unabhängig von der von Ihnen verwendeten Sprache sind Sie jedoch die größte Variation.

Robert Martin hat einmal gesagt:

"Je spezifischer die Tests werden, desto allgemeiner wird der Code."

Das hat mich zum Nachdenken gebracht. Spezifischere Tests bedeuten mehr Testcode. Mehr generischer Produktionscode bedeutet weniger Code, daher sollten die Test / Code-Verhältnisse steigen, wenn sich der Code weiterentwickelt.

Aber warte, das ist auch nicht gut. In bestimmten Fällen, z. B. wenn Sie einen bestimmten Algorithmus definieren, stehen möglicherweise nur 6-10 Codezeilen mit ein paar "if" -Zeilen, einer Weile und möglicherweise 2-3 Rekursionen zur Verfügung. Ich kann Ihnen sagen, dass der Code wahrscheinlich mehr als 100 Zeilen Testcode enthalten wird.

In einem realen Projekt, das etwas größer als nur ein paar Algorithmen ist, sollte das Test / Code-Verhältnis irgendwo zwischen 1: 1 und 2: 1 liegen. Wenn es über 2: 1 geht, ist es ein Geruch, dass Sie Tests haben, die überarbeitet oder gelöscht werden sollten (oder vielleicht Code, der schwer zu testen ist). Sie sollten in Ihre Tests immer den gleichen Aufwand an Sorgfalt und Umgestaltung investieren wie in Ihrem Produktionscode.

Die beste Antwort auf Ihre Frage ist vielleicht "Cyclomatic Complexity" . Je höher die zyklomatische Komplexität Ihrer Methode ist, desto exponentiell mehr Tests müssen Sie schreiben, um alle Fälle abzudecken.

Patkos Csaba
quelle
3

Das Verhältnis wird abhängig von der Größe Ihrer Methoden variieren. Die Größe Ihrer Methoden hängt vom Programmierstil, der Sprache und der Problemdomäne ab.

Wenn Ihre Methoden kurz sind, ist 3: 1 angemessen. Wenn Ihre Methoden lang sind, ist 3: 1 auf der hohen Seite.

Um Ihre Frage zu beantworten, kommt es darauf an. :-)

Jon Strayer
quelle
Es kommt darauf an, was Sie unter "Methoden sind lang" verstehen. Das Bild, das es in meinem Kopf hinterlassen hat, ist, dass Methoden unnötig lang sind, zu viel Arbeit leisten und zu viel Verantwortung tragen (oft mit zu vielen Parametern). In diesem Fall benötigt eine solche Methode proportional mehr Kombinationen, um durch Tests abgedeckt zu werden, sodass sich das Verhältnis
meines Erachtens
Angenommen, Sie können für einen Moment einen Test einrichten, die zu testende Methode aufrufen und das Ergebnis in drei Codezeilen überprüfen. Wenn die zu testende Methode eine Zeile lang ist (wie in Scala), beträgt das Verhältnis von Test zu Produktionscode 3: 1. Wenn die Methode sechs Zeilen lang ist, ist sie 1: 2. Sechs Zeilen sind gar nicht so lang.
Jon Strayer
2

Für softwarekritische Anwendungen beträgt das übliche Verhältnis einen Testtag für jeweils 10 funktionale LoC.

Dabei geht es bei TDD nicht um Tests, sondern um Spezifikationen.

mouviciel
quelle
1

Die Größe meines Testcodes ist ungefähr halb so groß wie der "tatsächliche" Code insgesamt. Andernfalls ist dies ein Hinweis darauf, dass Ihre Tests zu komplex sind und / oder Ihr Code zu schwer zu testen ist und / oder Ihr Code zu dicht / komplex ist.

Oder Sie testen einfach zu viel und verschwenden Ihre Zeit damit, die Rendite zu verringern.

Siehe auch "Wann ist ein Unit-Test ungeeignet oder unnötig?"

Telastyn
quelle
-1

Mein Verhältnis liegt bei 2-1 bis 10-1 (Code zum Testen). Stellen Sie sicher, dass es beim Testen um Wert / Verhalten und nicht um die Implementierung geht.

Erez A. Korn
quelle