Come eseguire casi di test specifici in GoogleTest


125

Sto cercando di scrivere una funzione / metodo per il mio progetto, che chiederà all'utente quali sono tutti i casi di test che intendi eseguire? Sembra che sotto ...,

Test_Cases_1
         |_TestNo1
         |_TestNo2....so on
Test_Cases_2
         |_TestNo1
         |_TestNo2....so on
....
....so on
Test_Cases_N
         |_TestNo1
         |_TestNo2....so on

Quindi, ora la sfida è durante l'esecuzione del progetto, dovrebbe chiedermi quali casi di test vorresti eseguire? Se seleziono Test_Cases_1e Test_Cases_N. Quindi dovrebbe eseguire questi due casi di test e dovrebbe escludere tutti gli altri da Test_Cases_2 to ..... Nella finestra dei risultati vorrei anche vedere i risultati di Test_Cases_1e Test_Cases_N.

Quindi, se vedrò GoogleTest, c'è un metodo chiamato test_case_to_run_count(); Ma tutti test casessi stanno registrando con il metodo Test_F (). Quindi, ho fatto molte analisi, ma non ho ancora trovato alcuna soluzione. Mi aiuti per favore.

Risposte:


181

Puoi utilizzare le opzioni avanzate per eseguire i test di Google.

Per eseguire solo alcuni unit test è possibile utilizzare l' --gtest_filter=Test_Cases1*opzione della riga di comando con valore che accetta i caratteri jolly *e ?per la corrispondenza con più test. Penso che risolverà il tuo problema.

UPD:

Bene, la domanda era come eseguire casi di test specifici. L'integrazione di gtest con la tua GUI è un'altra cosa, che non posso davvero commentare, perché non hai fornito i dettagli del tuo approccio. Tuttavia, credo che il seguente approccio potrebbe essere un buon inizio:

  1. Ottieni tutti i casi di test eseguendo i test con --gtest_list_tests
  2. Analizza questi dati nella tua GUI
  3. Seleziona i casi di test che desideri eseguire
  4. Esegui il test eseguibile con l'opzione --gtest_filter

Lo consiglierei e, se hai bisogno di un sistema basato su prompt, suggerirei di creare uno script wrapper che ottenga l'input dell'utente ed esegua il programma di test di conseguenza.
boicottaggio

@nogard: Sì, hai ragione, ma il mio / nostro scopo è di avere una GUI, che avrà le funzioni Treedi TestCasese TestNo. Quindi, pensi --gtest_filter=..che aiuterà?
Rasmi Ranjan Nayak

@nogard: grazie mille per l'aiuto ... andrò avanti come mi hai indicato .. te lo farò sapere una volta che avrò finito.
Rasmi Ranjan Nayak

1
@nogard: sto facendo la stessa cosa che hai diretto; int main(int argc, char **argv) { //::testing::GTEST_FLAG(list_tests) = true; // For Testing InitGoogleTest(&argc, argv); ::testing::GTEST_FLAG(list_tests) = true; ........ RUN_ALL_TEST();...}Ma stampa solo Testcase e TestNo. e ma non esegue i test. Quindi, come posso eseguire i test ora?
Rasmi Ranjan Nayak

@RasmiRanjanNayak: ho proposto di non cambiare affatto il main. Propongo di eseguire i test due volte: la prima volta per eseguire con --gtest_list_tests, quindi la seconda esecuzione per i test selezionati con l'opzione --gtest_filter
nogard

91

Riassumendo le risposte di @Rasmi Ranjan Nayak e @nogard e aggiungendo un'altra opzione:

Sulla console

Dovresti usare la bandiera --gtest_filter, tipo

--gtest_filter=Test_Cases1*

(Puoi farlo anche in Proprietà | Proprietà di configurazione | Debug | Argomenti del comando)

Sull'ambiente

Dovresti impostare la variabile GTEST_FILTERcome

export GTEST_FILTER = "Test_Cases1*"

Sul codice

Dovresti impostare una bandiera filter, tipo

::testing::GTEST_FLAG(filter) = "Test_Cases1*";

in modo tale che la tua funzione principale diventi qualcosa di simile

int main(int argc, char **argv) {
    ::testing::InitGoogleTest(&argc, argv);
    ::testing::GTEST_FLAG(filter) = "Test_Cases1*";
    return RUN_ALL_TESTS();
}

Vedere la sezione Esecuzione di un sottoinsieme dei test per maggiori informazioni sulla sintassi della stringa che è possibile utilizzare.


6
molto utile la parte "Sul codice" !! Questo è quello che stavo cercando !!
Iero

28

Finalmente ho ricevuto una risposta, ::test::GTEST_FLAG(list_tests) = true;// Dal tuo programma, non dalla console.

Se desideri utilizzare --gtest_filter =*; /* =*, =xyz*... etc*/// È necessario utilizzarli in Console.

Quindi, il mio requisito è di usarli dal programma e non dalla console.

Updated:-

Finalmente ho ottenuto la risposta per l'aggiornamento dello stesso dal programma.

 ::testing::GTEST_FLAG(filter) = "*Counter*:*IsPrime*:*ListenersTest.DoesNotLeak*";//":-:*Counter*";
      InitGoogleTest(&argc, argv);
RUN_ALL_TEST();

Quindi, grazie per tutte le risposte.

Siete fantastici.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.