TDD'ing un'interfaccia esterna

1

Per creare una codebase controllabile , ho sottratto una certa dipendenza esterna. Per essere precisi, questa dipendenza viene effettivamente implementata da un SDK del fornitore e comunica direttamente con un hardware. In quanto tale, questa è l'interfaccia:

public interface IHardware
{
    void Send(IMessage message);

    event EventHandler<MessageEventArgs> OnMessage;
}

(La comunicazione con l'hardware è completamente assincreta)

Non appena inizializzato, gli eventi possono essere generati dall'hardware (tramite l'evento OnMessage). Il codice cliente può inviare messaggi in qualsiasi momento e le possibili risposte saranno ricevute sotto forma di eventi.

Ora, questa interfaccia molto semplice deve essere implementata; L'implementazione è solo una delega alla classe SDK attuale. Il problema è questo: come scrivo i test per provocare la corretta implementazione ?

    
posta Bruno Brant 18.04.2015 - 20:28
fonte

2 risposte

4

Come hai notato, il mantra TDD del solo codice di scrittura in risposta a un test (unità) in errore inizia a decomporsi quando ti avvicini a un confine di sistema in cui devi integrarti con hardware o codice di terze parti.

Hai iniziato proprio definendo un livello di astrazione sull'SDK (nella forma dell'interfaccia IHardware ) e scrivendo il tuo codice su quell'interfaccia.

Poiché è improbabile che l'implementazione di IHardware possa essere sottoposta a test di unità automatici in modo significativo, potrebbe essere necessario lasciare che l'ideale di TDD vada per quella parte del progetto. Tuttavia, non tutto è perduto:

  1. Con un po 'di fortuna, il livello di adattamento è abbastanza semplice da poter essere verificato esaminando il codice
  2. È probabile che l'SDK che stai confezionando sia già stato testato
  3. È ancora possibile testare la combinazione di SDK e livello di adattamento con test di livello superiore, come test di integrazione e test di accettazione. Questi test ti serviranno comunque per dimostrare che l'intero sistema funziona correttamente.
risposta data 19.04.2015 - 09:32
fonte
3

Estrarre la dipendenza di terze parti come hai fatto non solo avvantaggia i test, poiché rende anche il tuo codice più robusto rispetto alle modifiche della dipendenza (avvolgendolo / creando il tuo adattatore).

Verificare che il vero prodotto di terze parti faccia ciò che pensi che faccia quando ricevi i comandi dal tuo codice potrebbe non essere possibile nel contesto del test dell'unità. Tuttavia, ciò che puoi fare è verificare che l'adattatore funzioni come previsto. Invio di comandi quando ci si aspetta e agisce di conseguenza quando i messaggi vengono ricevuti.

Esempio:

    [TestMethod]
    public void shutdown_on_receiving_off_signal() {
        HardwareMock mock = new HardwareMock(); //implements IHardware, and replaces the 3PP in your tests.
        ThirdPartyAdapter adapter = new ThirdPartyAdapter(mock);
        adapter.shutdown(); //send shutdown command  to the IHardware impl.
        AssertMockReceived(OFF_SIGNAL);
    }
    
risposta data 19.04.2015 - 09:15
fonte

Leggi altre domande sui tag