Edit: Ich bin natürlich dem TDD Pro / Contra-Haufen beigetreten und habe Frage 1 übersprungen:
1 - Implementieren von Komponententests in ASP.net-Webformularen:
Zuallererst, wenn Sie denken, dass Sie sie dazu bringen können, mit MVC zu arbeiten, kämpfen Sie dafür wie ein tollwütiger Höhlenbär. Als Front-End- / UI-Entwickler habe ich mit .net MVC aufgehört, .net zu hassen, damit ich mich besser darauf konzentrieren kann, jede Java-Weblösung zu hassen, auf die ich jemals gestoßen bin. Unit-Tests sind problematisch, da Webformulare die Grenzen zwischen Server und Client wirklich verwischen. Bei jedem Versuch, Unit-Tests durchzuführen, würde ich den Fokus auf Datenmanipulation legen und (hoffentlich) annehmen, dass Webforms die Normalisierung der Benutzereingaben für Sie unter der Haube erledigt.
2 - Zu der Frage, ob sich Unit-Tests überhaupt lohnen:
Okay, vollständige Offenlegung:
- Ich bin größtenteils Autodidakt. Meine formale Ausbildung besteht darin, ein JavaScript, ein PHP und eine C # -Klasse zu mögen und meine eigene persönliche Studie der OOP-Prinzipien und das Lesen von Dingen wie Design Patterns.
Jedoch,
- Ich schreibe hauptsächlich für das clientseitige Web und der eigentliche Programmierteil davon ist in einer der schnellsten und lockersten Sprachen, was dynamische Typisierung, erstklassige Funktionen und Objektveränderlichkeit angeht.
Das heißt, ich schreibe nicht für denselben Compiler oder dieselbe virtuelle Maschine. Ich schreibe für 4-20 verschiedene Interpretationen von drei Sprachen (ja, zwei von ihnen sind lediglich deklarativ, bestimmen aber auch den grundlegenden physischen Raum der Benutzeroberfläche, mit der ich manchmal auf unterschiedliche Weise arbeite) und tue dies, seit die Interpretationen a waren viel vielfältiger als heute. Und nein, ich bin nicht irgendein Kind, das JQuery für Einweg-Apps einsteckt. Ich helfe beim Aufbau und bei der Pflege von ziemlich anspruchsvollem Material mit viel Komplexität der Benutzeroberflächenelemente.
Also ja, hier und da gibt es viele Möglichkeiten für ein paar Optimierungen, um eine massive Kaskade von Fehlern zu erzeugen, wenn Ihre Designfähigkeiten vollkommen beschissen sind oder Sie mittelmäßige Entwickler in großen Mengen mit 1-2 Qualitätsproblemen bei Entwicklern bewerfen.
Ich verstehe, was TDD für Sie tun soll: Bei den Tests geht es wirklich eher darum, Sie dazu zu zwingen, das Design genauer in Betracht zu ziehen und sich auf die Anforderungen zu konzentrieren. Gerecht genug, aber das Problem dabei ist, dass es das, was Sie tun sollten, das Entwerfen für eine Schnittstelle, auf subtile, aber grundlegend andere Weise, das Entwerfen für Tests einer Schnittstelle, untergräbt. Der Unterschied für mich besteht darin, ein klares Bild zu zeichnen, das Mama nicht so schnell erraten und die ganze Seite mit Grün füllen muss, damit Sie das erste Kind sein können, das seine Buntstifte auf den Tisch schlägt und "Fertig!" Ruft. " Indem Sie die Priorität auf die Ergebnisse über Prozess und Design verlagern, fördern Sie im Grunde genommen die weitere Implementierung von Garbage Code, der in der Regel die Ursache Ihrer Probleme war.
Und dann gibt es natürlich noch den oft gepriesenen Nebeneffekt der Komponententests, mit dem Sie Regressionsfehler erkennen können. Die Befürworter von TDD neigen dazu, sich ein wenig darüber Gedanken zu machen, ob dies das eigentliche Ziel ist oder nur eine raffinierte Nebenwirkung, IMO Code, insbesondere in einer dynamischeren Sprache wie JavaScript, in der die Annahme, dass Sie sogar jedes mögliche Szenario in einer langen Kette von Abhängigkeiten vorhersagen können, töricht ist.
Es gibt einen Platz für automatisierte Tests in JS, aber eine viel bessere Nutzung Ihrer Zeit als das Anhängen eines Komponententests an jede einzelne "Einheit" Ihres Codes, die mit einer anderen in Kontakt kommt, stellt sicher, dass Sie nicht über eine Menge verfügen Müllobjekte, die Arbeit duplizieren oder deren beabsichtigte Verwendung dort in erster Linie semantisch mehrdeutig ist. Sie folgen dem DRY-Prinzip. Sie abstrahieren Dinge für die Wiederverwendung / Portabilität, wenn der Wert davon offensichtlich wird (und nicht eine Minute zuvor). Sie etablieren konsistente Prozesse und Methoden, um Dinge eher nach dem Prinzip der Zuckerbrot als nach dem Prinzip der Peitsche zu machen (dh es ist zu einfach, Ihre Sachen richtig zu verwenden, um sich die Mühe zu machen, sie falsch zu machen). Und aus Liebe zu allem, was Sie tun und lassen wollen, lassen Sie sich niemals auf massiv kaskadierende Vererbungsschemata mit Anti-Mustern als Mittel zur Wiederverwendung von Code ein.
All dies hat mir geholfen, schwer zu diagnostizierende Fehler in meinem Code auf eine ernsthafte Art und Weise zu reduzieren, und Sie können darauf vertrauen, dass dies eine große Priorität für jemanden ist, der als Entwickler mit einem Browsersatz aufkam, der Ihnen nichts Besseres mitteilte als " uh, es ist ein Problem mit einem Objekt vom Typ 'Objekt' bei dieser imaginären Zeilennummer in einer nicht angegebenen Datei aufgetreten. " (gee, danke IE6) TDD würde in meiner Arbeit diese Dinge nicht fördern. Es würde den Fokus auf 100% Ergebnisse während des Prozesses verlagern, bei dem es nicht wirklich darauf ankommt, was zwischen Punkt A und B liegt, solange es funktioniert. Es ist eine Zeitverschwendung, die besser darauf abzielt, sicherzustellen, dass Ihre Daten lesbar, tragbar und einfach zu ändern sind, ohne dass es zu großen Verwirrungen kommt.
Oder vielleicht bin ich nur zu nervös in Bezug auf das Paradigma, in dem ich verwurzelt bin, aber meiner Meinung nach ist es viel effektiver, die Zeit zu nutzen, als deinen Hintern zu bedecken, wenn du oder alle anderen auf deiner Seite sind Team macht es falsch. Und nichts sollte Sie dazu zwingen, über Design nachzudenken, nur um Dinge umzusetzen. Design sollte der verdammte Altar eines jeden Programmierers sein. Und alles, was Sie "zwingt", das Richtige zu tun oder Sie vor sich selbst zu schützen, sollte mit dem gleichen Misstrauen betrachtet werden, das Flaschen Schlangenöl vorbehalten ist, IMO. Schlangenöl in der modernen IT und allgemeinen Entwicklung wird, wenn Sie es noch nicht wissen, in flüssiger Form verkauft.