Unit Testing mit C / C ++: Lektionen, was zu merken?

8

Komponententest mit C / C ++: Was unterrichteten Sie Leute, die entweder vorher keine Einheitentests durchgeführt hatten oder von Java / Junit kamen?

Was ist die wichtigste Lektion / Sache, die Sie aus Ihrer Sicht merken / üben sollten, die viel Zeit oder Stress spart (besonders in Bezug auf C / C ++)?

    
Ansgar 21.10.2008, 11:14
quelle

7 Antworten

8
  1. Unit-Tests müssen bei jedem Check-in automatisch ausgeführt werden (oder Unit-Tests, die geschrieben und dann vergessen werden, sind keine Unit-Tests).
  2. Bevor Sie einen Fehler beheben, schreiben Sie einen Komponententest, um ihn anzuzeigen (er sollte fehlschlagen). Dann behebe den Fehler und freue dich, wenn der Test grün wird.
  3. Es ist in Ordnung, ein bisschen "Schönheit" einer Klasse für leichtere Tests zu opfern (z. B. öffentliche Methoden zur Verfügung zu stellen, die eigentlich nicht öffentlich sein sollten, aber beim Testen / Mocking helfen).
ripper234 21.10.2008, 11:41
quelle
7
Gishu 21.10.2008 11:47
quelle
3

Ich bin gegen all diese Empfehlungen, weil ich Testklassen automatisch Freundschaft schenke ...

Persönlich bevorzuge ich es, mich auf das Folgende zu konzentrieren, um mir Zugang zu den Innenseiten einer Klasse zu ermöglichen, die ich testen muss:

  1. Verlass dich auf die öffentliche Schnittstelle der Klasse wo möglich; manchmal bedeutet dies, dass die öffentliche Schnittstelle leicht erweitert wird, um ein einfacheres Testen zu ermöglichen. Bekämpfe diese Erweiterungen nicht zu sehr, aber lass sie auch nicht zu viel von deinem Design treiben ...
  2. Erwägen Sie das Hinzufügen einer Überwachungsschnittstelle, die kann auch mit "echtem" Code verwendet werden als Testcode zur Überwachung von der zu testende Code. (Ich wundere mich immer noch, wie oft das ein wirklich guter Teil des Designprozesses ist).
  3. Berücksichtigen Sie den Zugriff auf einige Teile der Klasse für abgeleitete Klassen über eine 'geschützte Schnittstelle' und leiten Sie eine 'testbare' Version der fraglichen Klasse ab, die dann instrumentiert und getestet werden kann.

Zusammenfassend sehe ich es viel lieber, in Testpunkten entworfen zu sein als in einer Freundschaft mit einer Testklasse. Natürlich ist ersteres schwieriger als letzteres, aber, IMHO, führt zu besseren Code UND besseren Tests.

    
Len Holgate 21.10.2008 16:57
quelle
2

Ich möchte ripper234 umformulieren und einige Regeln hinzufügen:

  1. Jedes Modul (normalerweise ein DLL-Projekt) sollte ein eigenes UT-Projekt haben. Alle UT-Klassen sollten für alle DLL-Klassen, die für den Zugriff auf private Methoden / Members erforderlich sind, Freunde sein.
  2. Wenn Sie das Modul ändern möchten, ändern Sie zuerst das UT. Stellen Sie sicher, dass sowohl die DLL als auch ihr UT kompiliert, verlinkt und der UT vor dem Einchecken ohne Abstürze und Fehler ausgeführt wird. Es ist nicht notwendig, alle UT für alle Module vor jedem Einchecken auszuführen - das ist Zeitverschwendung.
  3. Alle UTs sollten zusammen mit allen DLLs automatisch im nächtlichen Build neu erstellt werden. Alle UT und Module sollten während des Builds kompiliert und verlinkt werden.
  4. Alle UTs sollten automatisch ausgeführt werden, nachdem der Nachtaufbau erfolgreich war und die Ergebnisse zusammengefasst werden sollten.
  5. Die Zusammenfassung mit allen UT-Ergebnissen sollte an die Entwickler gesendet werden, und wenn es Fehler oder Abstürze gibt, sollten sie so schnell wie möglich korrigiert werden.
m_pGladiator 21.10.2008 12:04
quelle
2

Wenn Sie mit einer Legacy-Code-Basis ohne Tests arbeiten, werden Sie höchstwahrscheinlich mit funktionalen Tests beginnen, die ein Unit-Test-Framework für die Implementierung verwenden. Seien Sie nicht alarmiert - Ihr Code ist so miteinander verbunden, dass es wahrscheinlich unmöglich ist, richtige Komponententests zu schreiben. Seien Sie auch nicht selbstgefällig - sobald Funktionstests durchgeführt werden, müssen Sie eine Umgestaltung vornehmen, damit echte Komponententests möglich sind. Dein Code wird dafür besser sein!

    
Arkadiy 21.10.2008 13:44
quelle
1

Einzige wichtigste Lektion: Ein Test ist besser als kein Test.

    
graham.reeds 21.10.2008 13:23
quelle
1

Ein Unit-Testfall sollte nur eine Sache testen.

Ich sehe es viel häufiger in C / C ++ im Vergleich zu C # und Java, dass Unit-Testfälle ganze Workflows testen.

Vielleicht liegt es daran, dass die meisten C / C ++ - xUnit-Frameworks mehrere Schritte erfordern, um einen Testfall zu registrieren. Daher ist die Versuchung, nur ein paar Zeilen zu einem vorhandenen Testfall hinzuzufügen, höher.

    
Rasmus Faber 21.10.2008 13:37
quelle

Tags und Links