2010-03-25 8 views
8

Io lavoro in una società in cui OOP è ... beh, non fobidden, ma almeno malvista come "troppo complesso". I miei colleghi scrivono molte funzioni oltre 100 linee e di solito sono tutte in un "funcs.inc.php" o "something.inc.php", se usano qualsiasi funzione, spesso non lo fanno poiché copia-incolla è Più veloce.Come utilizzare TDD in un ambiente non molto "Testy"

Mi piacerebbe iniziare a utilizzare TDD almeno per il codice che scrivo, ma come ho di interfacciarsi con il loro codice non riesco a vedere da dove cominciare.

Non è il codice legacy come sono attivamente sviluppando e io non vogliono modificare il proprio codice come io non voglio provocare conflitti.

Quale approccio suggeriresti, ad eccezione del cambio dell'azienda?

+4

IMO, se non si desidera modificare il codice, è un codice legacy. –

+0

Puoi modulare il tuo codice abbastanza bene per TDD e comunque in qualche modo adattarsi al resto del codice? Inoltre, tratterei "OOP è troppo complesso" come una bandiera di avvertimento rossa molto grande. Programmare in generale è un'attività complessa e sfuggire a una tecnica potente ben conosciuta e ben compresa (che non è così complessa se fatta bene) non è un buon segno. –

+0

Purtroppo ho imparato che "l'OOP è troppo complesso", dopo aver firmato il contratto e trasferito in questa città, altrimenti avrei cercato un altro datore di lavoro. Sono d'accordo sul fatto che l'OOP non sia molto complesso se fatto bene e l'ho nascosto a volte, sperando che gli altri non si lamentino abbastanza forte perché il mio superiore lo senta. – dbemerlin

risposta

11

Sono stato in quella posizione, sia in un vero TDD. Quello che faccio normalmente è scrivere test per le interfacce di altre persone, quando possibile. Ho poi sapere prima ho eseguito il mio codice se hanno fatto una delle tante cose comuni che la gente fa:

  1. Broke un'API da ri-denominazione o completamente facendo via con qualcosa di
  2. Broke un'API con i cambiamenti di tipo sottili che non farsi notare
  3. spinto un revisione tossica senza prove
  4. perdite di memoria Sprung (la mia suite di test è Valgrind a conoscenza)
  5. Block, dove non hanno mai bloccati prima

Uno di questi fallimenti di solito si tradurrebbe in me dicendo "Ehi, puoi controllare (modulo), penso che si sia rotto nell'ultima revisione"

Questo è diventato brutto solo una volta.Qualcun altro si è davvero arrabbiato perché stavo scrivendo dei test per il loro codice e ha insistito sul fatto che ero fuori per il loro lavoro. Non riuscivo a far capire alla persona che ero appena uscito per rendere più facile il mio lavoro.

Non è mai una buona idea venire fuori e dire "Guarda, sto spendendo più tempo a eseguire il debug del tuo codice piuttosto che lavorare per conto mio", a meno che tu non sia assolutamente obbligato (il tuo capo ti chiede delle tue prestazioni). Il più delle volte, se mandi i test alle persone, sono felici di averli. Se stai già incontrando resistenza con l'idea, cerca semplicemente di non offendere nessuno o sembrare condiscendente.

Le funzioni di mock/stub sono ok, ma ciò che rimane è che il programma nel suo insieme è ancora suscettibile di interruzione se i test reali non vengono eseguiti. Almeno, quando ciò accade, puoi escludere rapidamente le tue cose e (probabilmente) puntare direttamente al problema.

+0

Buon suggerimento, ma il mio problema è: come posso testare funzioni che svolgono 6 compiti diversi a seconda dei parametri o, a volte (meno spesso di recente), variabili globali o globali e che consistono nell'80% delle query mysql? – dbemerlin

+0

@dbemerlin: la tua situazione sembra un po 'più icky di quanto pensassi :) Tutto quello che puoi fare è testare con _your_ casi d'uso, che lo restringono un po'. È possibile impostare le globali da soli, se necessario, ma ottengo il vostro punto con loro, si finisce sempre a chiedersi perché un test fallisce quando una classe viene usata come pubblicizzata/diretta e non fa pubblicità alla sua dipendenza da un globale. Non c'è davvero un modo "fantastico" per implementare i test quando nessun altro sta facendo lo stesso. Per quanto riguarda i dati della query, le funzioni non rendono evidente l'input previsto? –

+2

+1 per la diplomazia, in particolare "Penso che sia scaduto ** nell'ultima revisione". Incolpare non aiuta mai il morale. –

4

Usa TDD per tutti i tuoi moduli e scrivi test quando usi i loro moduli per qualcosa. Alla fine, tutti gli altri noteranno che produci codice di alta qualità molto più velocemente di chiunque altro e saranno curiosi di sapere perché. Questa sarà l'occasione perfetta per educarli.

Se non chiedono mai, bene, almeno hai fatto la vostra vita un po 'più facile.

3

Io suggerirei di cominciare con qualunque prossima cosa che dovete scrivere e cercando di ottenere alcuni test effettuati prima e poi scrivere il codice per quella cosa. Potrebbe risolvere un bug, implementare un miglioramento o una nuova funzionalità, ma l'idea è di cercare un modo per fare i test prima del cambiamento.

In alternativa, è possibile prendere parte del codice del proprio collaboratore e avvolgere alcuni test su alcuni di essi e provare a rifattorizzarlo, ma non sono sicuro di quanto andrà bene.

2

Probabilmente si desidera testare il codice in isolamento del proprio codice. Questo cambierà il modo in cui disegni il tuo codice, ma probabilmente è questo il motivo per cui vuoi fare TDD.

Crea funzioni di simulazione per le librerie da cui vuoi isolarti.

2

È possibile scrivere prima test di unità sul proprio codice? Non essere disturbato da altre persone; assicurati che il tuo codice sia completamente Tdded e testato sull'unità.

per simulare l'interazione con altre biblioteche, è possibile provare le tecniche di vero e provato, come schernisce e mozziconi.