Come inizializzare il driver del dispositivo di test dell'unità?

0

Sto scrivendo un driver di periferica IMU in C utilizzando la metodologia di sviluppo basata sui test. Come parte del driver, passo una struttura con le impostazioni di configurazione selezionate dall'utente a una funzione di inizializzazione che configura il dispositivo scrivendo nei suoi singoli registri.

Usando la mia interpretazione dell'approccio descritto nel libro di James Grenning "Test Driven Development for Embedded C", ho finito per scrivere una serie di test che fondamentalmente prendevano in giro ogni chiamata di funzione (dato che ogni chiamata di funzione è una funzione SPI_Write ()), risultante in prove fragili che imitano l'implementazione del codice. Aggiungere o modificare l'inizializzazione è diventato un problema poiché la maggior parte dei test deve essere riscritta.

C'è un modo migliore per inizializzare i dispositivi usando TDD?

    
posta hbrezak 12.11.2018 - 17:40
fonte

2 risposte

1

Quando stai scrivendo un driver di periferica che sta inserendo i valori magici nei registri di un dispositivo, a mio avviso è impossibile scrivere un unrestest affidabile per questo driver. E non importa molto se quei registri sono resi disponibili direttamente nello spazio degli indirizzi del processore o se il dispositivo si trova all'altra estremità di un bus.

Quando si comunica con dispositivi esterni a livello di driver, l'ordine e i tempi dell'interazione con il dispositivo possono essere critici e non possono essere verificati in modo affidabile con le unittests, specialmente se non vengono eseguite tali unittest su un'architettura di processore differente ( ad esempio non è possibile rimuovere un progetto per una scheda ARM sul PC di sviluppo).
Per questo motivo, consiglio spesso di rinunciare a unittesting dei driver di livello inferiore e di testarli principalmente nell'integrazione con l'hardware reale. Un'eccezione potrebbe essere un driver per un dispositivo su un sistema bus che comunica con un protocollo ben definito. Quindi le unittests possono verificare che i messaggi corretti siano inviati sul bus.

    
risposta data 13.11.2018 - 12:49
fonte
0

Disclaimer: le mie esperienze con le realtà di embedded sono limitate. Potresti scoprire che questa guida non corrisponde ai vincoli che stai utilizzando sotto

TDD ama le funzioni . Strano, dato il suo lignaggio, ma così via. Spesso il tuo punto di partenza è pensare, e così facendo scopri una funzione che incapsula la maggior parte della complessità logica del tuo problema, quindi concentrati sui tuoi sforzi iniziali per generare test che inducano l'implementazione di quella logica.

In questo caso, potrebbe essere una funzione che accetta le impostazioni di configurazione come argomento e restituisce un elenco collegato di descrizioni delle chiamate per impostare i registri (ovvero, un identificatore per ciascuna funzione e gli argomenti da passare ad esso - il tipo di cosa che potresti passare a una dichiarazione di interruttore stupida).

Quindi applicheresti l'implementazione di questa funzione specificando le varianti delle configurazioni e quale vincolo deve essere soddisfatto dal risultato restituito.

Il primo test verrebbe scelto per selezionare l'elenco di chiamate più semplice, quindi verranno ordinati test aggiuntivi in base all'esempio che introduce la quantità minima di nuova complessità nel codice di produzione.

Se i valori di ritorno delle chiamate di funzione precedenti fanno parte della logica per il calcolo delle chiamate successive, allora potresti cercare qualcosa di più simile a una libreria di protocolli (vedi questo discorso di Cory Benfield )

Add or modifying initialization has become a pain as most tests need to be rewritten.

Estendere l'implementazione per soddisfare i nuovi requisiti dovrebbe essere relativamente indolore, dato che i comportamenti precedenti non cambiano.

Modifica - significa che il requisito effettivo è cambiato; si, può essere doloroso.

Qualche volta questo indica che i test completano l'implementazione. Questo sintomo è comune nei test dell'interfaccia utente, in cui le modifiche estetiche rendono il risultato molto diverso dall'imbracatura di test e pertanto è possibile che si stia imbattendo in qualcosa di simile.

    
risposta data 13.11.2018 - 03:57
fonte

Leggi altre domande sui tag