Come scrivere il mio test di unità?

6

Attualmente sto provando a scrivere un mio test unitario. Il test unitario che sto scrivendo è principalmente per l'algebra lineare (so che ci sono grandi pacchetti là fuori, ma voglio usare il mio per il mio progetto). La mia algebra lineare attuale è composta da my_vector.hpp/cpp (3d) e my_matrix.h/cpp .

Quindi sto attualmente scrivendo un test_vector.cpp e test_matrix.cpp che testeranno le caratteristiche di my_vector e my_matrix.

Per quanto riguarda il test della classe vector , all'interno di test_vector.cpp eseguo il test delle funzioni aggiungi, sottrazione, divisione, dotprodotto, ecc. di my_vector.

Come faccio:

// test_vector.cpp
void test_add(){

    my_vector a(2.0, 1.1, 2.1);
    my_vector b(2.1, 2.0, 1.1);

    // manually computed by adding a and b by hand
    // 
    my_vector expected(4.1, 3.1, 3.2);


    my_vector c = a + b;

    assert(c.x == expected.x);
    assert(c.y == expected.y);
    assert(c.z == expected.z);
}

void test_sub(){

    .....
}

int main(){
    test_add();
    test_sub();
    ....
return 0;
}  

Anch'io sono simile a test_matrix.cpp.

In my_vector expected(4.1, 3.1, 3.2); ho prima aggiunto manualmente 2.0, 1.1, 2.1 di a e 2.1, 2.0, 1.1 di b e poi confrontato con il valore calcolato dopo aver utilizzato c = a + b . Pensi che questo sia un modo corretto per fare test unitari. Lo trovo poco ingombrante dal momento che devo fare il calcolo a mano per altri test complessi come la rotazione, il cross product ecc. Questo tipo di sensazione che sto facendo qualcosa di sbagliato.

Sto facendo qualcosa di sbagliato? Per favore fatemi sapere, sono aperto per eventuali suggerimenti.

    
posta solti 20.10.2016 - 05:49
fonte

4 risposte

4

Questo è un modo abbastanza comune di farlo, e non lo descriverei come sbagliato . Ci sono alternative, però - per esempio, potresti trovare un altro calcolo che puoi applicare ai risultati che dovrebbero essere più semplici da calcolare e mostrare che sono corretti. Inoltre, probabilmente non è fattibile, ma per una rotazione di circa 90 gradi, potresti considerare di applicare un prodotto punto e verificarne lo zero, e controllare che la grandezza sia corretta, e questo ti darebbe una buona idea che l'implementazione sia corretta ( supponendo che l'implementazione di queste altre operazioni più semplici sia già nota per essere corretta).

Puoi fare un ulteriore passo avanti ed eseguire tali calcoli su dati casuali . Fare questo su un gran numero di elementi può darti la sicurezza di aver catturato tutti i casi limite in un algoritmo.

Un altro consiglio: noto che non stai usando un framework di test unitario. Sebbene ciò sia possibile, suggerirei caldamente di utilizzare un framework in quanto forniscono un feedback molto migliore quando le cose vanno male. Per C ++, tendo ad usare Catch ma ci sono anche molte altre alternative.

    
risposta data 20.10.2016 - 07:11
fonte
2

L'utilizzo di un framework per il test delle unità è un vero (molto) buon consiglio, come ha sottolineato Pariata Breatta. Rende il test molto più semplice ed è supportato da molti IDE.

Considera di mettere il test di uguaglianza nella tua stessa classe vettoriale, rendendo molto più facile riutilizzarlo nei test unitari più tardi - e molto probabilmente sarà molto utile prima o poi comunque. Oh, scrivi anche un test unitario non ricorsivo, ovviamente. Il controllo di tutti i componenti è di solito la strada da percorrere, e usando il tuo nuovo metodo avrà solo bisogno di asserzione per quello. Il semplice confronto di somme introduce nuovi possibili punti di errore (si pensi alle permutazioni o agli errori numerici).

Potresti voler fornire un "circa uguale" -check che supporta alcuni epsilon attorno ai tuoi valori per consentire effetti di imprecisione numerici, poiché lavorare con numeri in virgola mobile potrebbe non finire nel modo in cui ti aspetti che siano.

    
risposta data 20.10.2016 - 09:07
fonte
1

Lo stai facendo bene. L'unica alternativa che posso vedere all'approccio manuale sarebbe utilizzare una libreria di terze parti attendibile per eseguire i calcoli, quindi fare in modo che la suite di test confronti i calcoli con quelli della libreria.

Ovviamente, sarebbe ridondante implementare la funzionalità di una libreria a cui hai già accesso. Immagino che lo faresti solo se la biblioteca non può, per qualsiasi motivo, essere utilizzata quando vai in diretta e sei costretta a implementare la tua.

A proposito, il risultato atteso non dovrebbe essere (4.1, 3.1, 3.2)?

    
risposta data 20.10.2016 - 18:42
fonte
0

Utilizza il framework Google Test . Per il mocking c'è anche il framework Mock di Google. Entrambi sono pensati per essere usati con C ++.

    
risposta data 21.10.2016 - 13:53
fonte

Leggi altre domande sui tag