L'abilità più utile che abbia mai incontrato in uno sviluppatore / tester è la capacità di "dimenticare" tutte le ipotesi su come l'utente dovrebbe utilizzare il software. Non dirò "stupido", perché i tester devono essere molto intelligenti riguardo al loro lavoro, ma uno sviluppatore che testa il proprio lavoro deve abbandonare qualsiasi nozione preconcetta su come immagina l'utente interagire con esso.
Ad esempio, conosco un tester la cui prima azione quando si apre una sorta di schermata di "manutenzione dei record" è quella di colpire immediatamente "salva". Il tuo sviluppatore medio potrebbe pensare che il comportamento sia così ridicolo da non creare un controllo degli errori appropriato per un caso in cui NULLA è stato specificato dall'utente. Il test di navigazione è un altro punto debole, soprattutto nelle app Web; il tuo sito web reagisce correttamente al pulsante "Indietro"? Molti, infatti, non lo fanno, soprattutto se si basano molto su ViewState e sui postback.
Un buon tester si rende conto che nulla può essere assunto per il comportamento dell'utente finale. Questi sono i tester che gli sviluppatori odiano, perché torneranno con un caso limite che è un dolore e due terzi da coprire. Ma sono anche i tester che ti aiutano a produrre software affidabile e affidabile. Dopo un po 'di tempo, tu come sviluppatore, sottoponendo i candidati al rilascio a un tester come questo, inizierai ad adottare la stessa mentalità, scrivendo test automatici per casi limite e incorporando azioni utente "stupide" nell'interfaccia utente manuale e in end-to -end test.
Una cosa; TDD non è quasi mai "non applicabile"; l'unica volta in cui non devi fare qualcosa a TDD è quando non c'è un framework di test adatto per te da utilizzare, e questo sarebbe solo un valido motivo per un set molto ristretto di linguaggi "legacy" o "specialistici".