Come esempio , diciamo che sto lavorando alla creazione di una soluzione di e-commerce. Parte della funzionalità di questa soluzione sarà garantire che il prezzo finale di un ordine sia corretto. Diciamo che il prezzo finale includerà il totale complessivo di tutti i prodotti, i costi di spedizione e qualsiasi tassa.
Diciamo che ho due metodi pubblici:
/**
* @return array
*/
public function viewAllOrders(){};
/**
* @return array
*/
public function viewOrder($guid){};
Ogni metodo restituisce (tra le altre cose) il totale complessivo di un ordine.
Il problema che ho incontrato è che poiché ciascuno di questi metodi è testato in test separati, i test potrebbero avere definizioni diverse su quale dovrebbe essere il totale complessivo.
Ad esempio, diciamo per un ordine "A" il prezzo del prodotto è $ 100, spedizione $ 10, tasse $ 20 che danno un totale di $ 130.
Uno sviluppatore sta scrivendo il test per viewAllOrders
. Scrive correttamente il test e afferma che per l'ordine 'A' il totale complessivo è $ 130.
Un altro sviluppatore scrive il test per viewOrder
. Pensa che il totale generale è solo il prezzo per i prodotti e dimentica le tasse e le spese di spedizione. Ora afferma che per l'ordine "A" il totale complessivo è di $ 100.
Entrambi gli sviluppatori scrivono un codice di produzione che garantisce il superamento di tutti i test, ma ora abbiamo una situazione in cui l'ordine "A" ha un totale diverso a seconda del metodo pubblico che chiami! Gli errori si sono insinuati nel nostro sistema (anche se tutti i test stanno passando) perché due test non concordano sulla definizione del totale generale.
Quali sono alcuni buoni modi per assicurarci di non utilizzare definizioni diverse di funzionalità tra i nostri test?
Sto adottando il test "Classico / Statistico" per deridere. La ragione è che sto usando un linguaggio dinamico. Vedi I mock in lingue dinamiche sono pericolosi? . Ciò significa che non posso semplicemente avere un metodo grandTotal () che le altre classi chiamano e possono essere deriso nei test.
Ho anche considerato di testare ciascun metodo nello stesso test (garantendo così la definizione di un totale complessivo in un test). Il problema è che ti apri a Assertion Roulette .
Nota anche che ho banalizzato questo esempio. La maggior parte delle persone sa che cos'è il totale generale, ma il mio problema è generale, essendo spiegato con un esempio semplificato. Quando leggi "totale generale" questo può essere ugualmente letto come "un valore con un significato definito"