Is het niet voornamelijk zo dat je moet doen waar je jezelf prettig bij voelt en waar je de tijd voor hebt/krijgt.
Bij simpele dingen zal ik niet snel de behoefte hebben om unit tests te schrijven. Een functie "save" die bv puur een specifieke entity omzet naar een INSERT/UPDATE query vind ik niet interessant en zal ik niet snel gaan testen. Code waar meer logica inzit (bv voorgaande voorbeeld met een generieke opzet, zeg een custom ORM lib) en meer een algoritme is vind ik testen weer juist wel heel belangrijk. Dat omdat het dus vaker gebruikt wordt, en wat complexer in elkaar zit en waarschijnlijk ook vaker onderhoud aan plaats vind. Dan is het wel belangrijk dat je op basis van een simpele test run weet dat de boel nog werkt.
Hoe weet je dat je alle mogelijke scenario's gehad hebt? Het lijkt me vrij makkelijk, vooral in een omgeving met veel functies.
Door de specs erbij te pakken en rand gevallen te testen "indien X lager dan 10 dan doe Y en anders Z", dan ga je dus testen met X = 9, X = 10 en X = 11. Iets wat voor een bestaand systeem natuurlijk onbegonnen werk is om allemaal na te lopen, maar bij een nieuw systeem/stuk functionaliteit kun je dit natuurlijk wel meteen zo testen. Daarnaast heb je natuurlijk nooit garanties, maar als er een bug is moet je daarvoor natuurlijk wel meteen een test schrijven. Makkelijkst is het daarbij dan ook om eerst de test te schrijven. Want dan kun je de test debuggen in plaats van dat je elke keer door de applicatie moet klikken. Daarnaast weet je dan ook meteen dat de bug is opgelost, de test slaagt immers.
Niet helemaal waar natuurlijk. Zelfs met een volledige code coverage test je alsnog alleen de units an sich en slechts in beperkte mate de samenwerking met andere delen van het systeem. Het zorgt er in elk geval wel voor dat je geen echt obvious fouten overhoudt.
Daarvoor kun je dan toch integratie tests schrijven die meedraaien? Mij lijkt het dan ideaal om ook een aantal tests te schrijven die units onderling testen, of evt. automatische functionele tests waarbij automatisch door de applicatie wordt geklikt. De randgevallen kun je dan testen met de unit tests, en het samenwerkende geheel op basis van de integratie/functionele tests. Beide/alle soorten tests zou je dan kunnen opnemen binnen de continuous intergration (daarmee dek je natuurlijk nog steeds niet de bugs af die toch optreden op basis van bepaalde data (uit bv database), of race conditions).