Site Map
js navbar
js navbar
Diese Wiki Seite sieht etwas verhagelt aus, da sie in erster Linie im Präsentationsmodus funktionieren muß.
Browser im Kiosk Modus: * Safari: keine Ahnung * Firefox recht gut per Plugin: https://addons.mozilla.org/de/firefox/addon/1568 * Opera von Haus aus
= Unit Testing Cocoa
Vortrag am 17. März 2010
The main thing that distinguishes legacy code from non-legacy code is tests, or rather a lack of tests. Michael Feathers
ungeordnete Stichpunkte * Michael Feathers http://www.objectmentor.com/omTeam/feathers_m.html * Martin Fowler
* Michael T. Nygard http://www.pragprog.com/titles/mnee/release-it * SQLite Testing http://www.sqlite.org/testing.html
== Was ist ein Unit Test?
* Testprogramm für einzelne Programmbausteine (Klassen, einzelne Methoden), * zustandslos, bereitet die Vorbedingungen selbst vor, * automatisierbar, prüft alle Nachbedingungen, Schritt im Build Prozeß, * normalerweise in der gleichen Sprache geschrieben wie der zu testende Code, * nicht Teil des ausgelieferten Programms.
== Quelltext Impression
#import <SenTestingKit/SenTestingKit.h> @interface MyClassTC : SenTestCase {} @end #import "MyClass.h" @implementation MyClassTC -(void)setUp { } -(void)tearDown { } -(void)testMethodXY { ... STAssertEqualObjects(@"expected", ..., @"fail"); } @end
== Was nützen mir Unit Tests?
* Klarheit der Abhängigkeiten in meinem Code (Stichwort Dependency Injection & Inversion of Control), * Refactoring ohne Nervenkitzel, * eindeutig definiertes Verhalten (Design by Contract), Förderung der Teamarbeit, * keine „vergessenen“ Tests, da jeder Build alle prüft, Bedingung für Continuous Integration.
== Wie geht's prinzipiell?
* Test Framework zur bequemen Entwicklung, Ausführung und für Berichte, * normalerweise pro Logikbaustein (Klasse) eine Testklasse, * pro Bug / gewünschtem Verhalten eine Testmethode:
-(void)testRFC1123 { NSString *s = @"Fri, 14 Aug 2009 14:45:31 GMT"; STAssertEqualObjects(s, [[NSDate dateFromRFC1123:s] rfc1123String], @"fail"); }
== Wie geht's mit Cocoa
* SenTestingKit / OCUnit kommt von Apple mit - gibt aber auch andere Implementierungen und Zusätze,
* neues XCode Target: „Cocoa > Unit Test Bundle“
* direkte Abhängigkeit vom bisherigen Target, fertig.
* …und jetzt der schwierige Teil:
== Step & Trace
dazu brauchen wir ein „Custom Executable“:
* Pfad
Developer/usr/bin/otest
relativ zu „Current SDK“
* einige Parameter und etliche Umgebungsvariablen
das können wir dann als Active Executable
starten und debuggen. Vorsicht:
* Parameter und Umgebungsvariablen gehen in die *.pbxuser
Datei ein und gehen drum leicht verloren.
* die Debugsitzung startet nur, wenn alle Tests erfolgreich sind (Build Abhängigkeit) - ich kommentiere die kritischen STAsserts
zeitweise aus (Holzhammer)
== NSLog
* Terminal: xcodebuild
auf das Test Target loslassen und die NSLogs kommen auf die Konsole
* XCode: Custom Executable
als Active Executable
und schon sehen wir die NSLogs auch.
== Exkurs: Entwicklungsprozesse
* Extreme Programming (XP), * Test Driven Development (TDD), * Documentation Driven Development (DDD), * Design by Contract (DbC).
* DDD mit Link zu "presentation on Documentation-Driven Development" (Slideshare)
== Was ich vermisse
* einfachere Projekteinrichtung,
* benutzerbezogene Einstellungen abschaffen,
* Testabdeckung messen und anzeigen. (CoverStory?)
== Locker bleiben
Don’t stress about unit tests. They are intended as a tool for ensuring good test coverage and memory management. Use them in that way to aid your development process. ADC
* Unit Tests verhindern natürlich nicht jeden Bug, * Testing-Taliban schrecken moderate Seelen oft ab, * ein laufendes Programm ist wichtiger als 100% Testabdeckung, * die ersten Tests für Spaghetti Code können allerdings frustrieren.
== Querverweise / Lesetips
* Michael Feathers: Working Effectively with Legacy Code
* Erica Sadun bei TUAW
XCode Anleitungen die ich schlußendlich verstanden habe: * Cocoa with Love: A sample iPhone App with unit tests * Cocoa with Love: A sample Mac Application with unit tests * meine Zusammenfassung zur XCode Projekteinrichtung
== Vielen Dank
Feedback willkommmen an Marcus Rohrmoser
Die Folien zum Nachlesen gibt's hier:
http://mro.name/go/cocoaheads_testing
aus Sicht eines iPhone Entwicklers.
ein Vortrag bei den CocoaHeads von