{"id":246,"date":"2008-05-01T12:53:04","date_gmt":"2008-05-01T10:53:04","guid":{"rendered":"http:\/\/blog.m-ri.de\/index.php\/2008\/05\/01\/tipps-tricks-testcode-sollte-immer-in-ifdef-_debug-endif-bloecke-integriert-sein\/"},"modified":"2008-04-27T19:17:39","modified_gmt":"2008-04-27T17:17:39","slug":"tipps-tricks-testcode-sollte-immer-in-ifdef-_debug-endif-bloecke-integriert-sein","status":"publish","type":"post","link":"http:\/\/blog.m-ri.de\/index.php\/2008\/05\/01\/tipps-tricks-testcode-sollte-immer-in-ifdef-_debug-endif-bloecke-integriert-sein\/","title":{"rendered":"Tipps &#038; Tricks: Testcode sollte immer in #ifdef _DEBUG #endif Bl\u00f6cke integriert sein!"},"content":{"rendered":"<p>Dieser Tipp h\u00f6rt sich trivial an, aber wenn man sich nicht dran h\u00e4lt erlebt man \u00fcbelste \u00dcberraschungen.<br \/>\nNur zu oft muss man w\u00e4hrend der Entwicklung\u00a0oder bei der Fehlersuche Code einbauen, der Test, Ausgaben, Verz\u00f6gerungen oder sonstige Operationen ausf\u00fchrt, die mir als Entwickler helfen ein Problem zu finden, oder einer L\u00f6sung f\u00fcr eine verzwickte Frage zu l\u00f6sen. Um so gr\u00f6\u00dfer das Problem wird um so mehr Stellen werden oft ver\u00e4ndert.<br \/>\nEs bleibt die Frage ob sich jeder Entwickler noch erinnert wo er \u00fcberall etwas f\u00fcr Testzwecke eingebaut hat.<\/p>\n<p>Das \u00fcble Ergebnis ist, dass man manchmal toten nutzlosen, Performance fressenden Code ausliefert. Oder gar Code ausliefert, der evtl. zu neuen Fehlern f\u00fchrt. Da muss nur ein einfacher <em>DebugBreak<\/em> im Code zur\u00fcckbleiben und schon crashed die Anwendung sauber beim Kunden&#8230;<\/p>\n<p>Testcode sollte grunds\u00e4tzlich in einem <em>#ifdef <\/em>Block eingebaut werden. Und Code der wirklich nur f\u00fcr Tests vorhanden ist und er sogar sp\u00e4ter in der Debug Version des Programmes nichts zu suchen hat sollte mit einem <em>#else #error\u00a0<\/em>versehen werden. Ein <em>ASSERT<\/em> kann einen viel abnehmen um so etwas zu vermeiden, aber sogar mancher <em>ASSERT<\/em>\u00a0\u00a0ist sp\u00e4ter \u00fcberfl\u00fcssig und behindert auch Tests in der Debug Version.<\/p>\n<p>So habe ich in unserer Software einen <em>Sleep(100); <\/em>\ud83d\ude2e gefunden, der von einem Entwickler eingebaut wurde, um einen Crash in einem komplexen Kommunikationsproblem zwischen mehreren Threads zu finden.Er hat den Fehler gefunden, den <em>Sleep <\/em>aber nie wieder entfernt.<br \/>\nH\u00e4tte mein Kollege sich an meine Spezifikationen gehalten, h\u00e4tten wir nicht nachtr\u00e4glich auf die m\u00fchsame Suche gehen m\u00fcssen wo unsere Performanceverluste bei 5% Prozessorlast herkommen. So w\u00e4re das Ganze schon beim Release-Build aufgefallen:<\/p>\n<pre line=\"1\" lang=\"cpp\">#ifdef _DEBUG\r\n\/\/ Test Sleep to find cross thread problems for bug#234\r\nSleep(100);\r\n#else\r\n#error Remove test condition here. Just used to find bug#234 \r\n#endif<\/pre>\n<p>BTW: Ich verwende deshalb immer ein Code-Snippet \u00fcber mein <em><a href=\"http:\/\/www.wholetomato.com\">VisualAssist X<\/a><\/em>, der mir einen entsprechenden Codeblock einsetzt.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Dieser Tipp h\u00f6rt sich trivial an, aber wenn man sich nicht dran h\u00e4lt erlebt man \u00fcbelste \u00dcberraschungen. Nur zu oft muss man w\u00e4hrend der Entwicklung\u00a0oder bei der Fehlersuche Code einbauen, der Test, Ausgaben, Verz\u00f6gerungen oder sonstige Operationen ausf\u00fchrt, die mir als Entwickler helfen ein Problem zu finden, oder einer L\u00f6sung f\u00fcr eine verzwickte Frage zu &hellip; <a href=\"http:\/\/blog.m-ri.de\/index.php\/2008\/05\/01\/tipps-tricks-testcode-sollte-immer-in-ifdef-_debug-endif-bloecke-integriert-sein\/\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eTipps &#038; Tricks: Testcode sollte immer in #ifdef _DEBUG #endif Bl\u00f6cke integriert sein!\u201c <\/span>weiterlesen<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[30,11,4,31],"tags":[370,38,42,48],"class_list":["post-246","post","type-post","status-publish","format-standard","hentry","category-c","category-debugging","category-mfc","category-vs-tipps-tricks","tag-c","tag-debuggen","tag-tippstricks","tag-va-x"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/246","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/comments?post=246"}],"version-history":[{"count":0,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/246\/revisions"}],"wp:attachment":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/media?parent=246"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/categories?post=246"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/tags?post=246"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}