Como executar casos de teste específicos no GoogleTest

125

Estou tentando escrever uma função / método para o meu projeto, que perguntará ao usuário quais todos os casos de teste você executará? Parece abaixo ...,

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

Portanto, agora, o desafio é executar o projeto, que deve me perguntar o que todos os casos de teste você gostaria de executar? Se eu selecionar Test_Cases_1e Test_Cases_N. Em seguida, ele deve executar esses dois casos de teste e excluir todos os outros de Test_Cases_2 to ..... Na janela de resultados também gostaria de ver os resultados de Test_Cases_1e Test_Cases_N.

Então, se eu vou ver o GoogleTest, existe um método chamado test_case_to_run_count(); Mas todos test casesestão sendo registrados com o método Test_F (). Então, fiz muitas análises, mas ainda não encontrei nenhuma solução. Por favor me ajude.

Rasmi Ranjan Nayak
fonte

Respostas:

181

Você pode usar opções avançadas para executar testes do Google.

Para executar apenas alguns testes de unidade, você pode usar a --gtest_filter=Test_Cases1*opção de linha de comando com valor que aceita os curingas *e os ?caracteres para combinar com vários testes. Eu acho que vai resolver o seu problema.

UPD:

Bem, a questão era como executar casos de teste específicos. A integração do gtest à sua GUI é outra coisa, que não posso comentar, porque você não forneceu detalhes da sua abordagem. No entanto, acredito que a seguinte abordagem pode ser um bom começo:

  1. Obtenha todos os casos de teste executando testes com --gtest_list_tests
  2. Analise esses dados em sua GUI
  3. Selecione os casos de teste que você deseja executar
  4. Executar teste executável com a opção --gtest_filter
nogard
fonte
Eu recomendaria isso e, se você precisar de um sistema baseado em prompt, sugiro criar um script de wrapper que obtenha a entrada do usuário e execute o programa de teste de acordo.
boycy
@ogard: Sim, você está certo, mas meu / nosso objetivo é ter uma GUI, que terá o Treede TestCasese TestNo. Então, você acha que --gtest_filter=..vai ajudar?
Rasmi Ranjan Nayak
@ogard: Muito obrigado pela ajuda ... Vou seguir em frente, como você indicou .. Vou informá-lo assim que terminar.
Rasmi Ranjan Nayak /
1
@ogard: Eu estou fazendo o mesmo que você indicou; 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();...}Mas imprime apenas o Testcase e o TestNo. e mas não executa os testes. Então, como posso executar os testes agora?
Rasmi Ranjan Nayak /
@RasmiRanjanNayak: Eu propus não mudar o principal. Proponho para executar testes duas vezes: 1º tempo para executar com --gtest_list_tests, então 2ª corrida para os testes selecionados com a opção --gtest_filter
nogard
91

Resumindo as respostas @Rasmi Ranjan Nayak e @nogard e adicionando outra opção:

No console

Você deve usar a bandeira --gtest_filter, como

--gtest_filter=Test_Cases1*

(Você também pode fazer isso em Propriedades | Propriedades de configuração | Depuração | Argumentos de comando)

No ambiente

Você deve definir a variável GTEST_FILTERcomo

export GTEST_FILTER = "Test_Cases1*"

No código

Você deve definir uma bandeira filter, como

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

de modo que sua função principal se torne algo como

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

Consulte a seção Executando um subconjunto dos testes para obter mais informações sobre a sintaxe da string que você pode usar.

Jorge Leitão
fonte
6
muito útil a parte "On the code" !! Era isso que eu estava procurando !!
Iero
28

Finalmente, recebi uma resposta: ::test::GTEST_FLAG(list_tests) = true;// Do seu programa, não do console errado.

Se você gostaria de usar --gtest_filter =*; /* =*, =xyz*... etc*///, você precisa usá-los no console.

Portanto, minha exigência é usá-los no programa e não no console.

Updated:-

Finalmente, recebi a resposta para atualizar o mesmo no programa.

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

Então, obrigado por todas as respostas.

Vocês são ótimos.

Rasmi Ranjan Nayak
fonte