Comparação de estruturas de teste de unidade C ++ [fechadas]

300

Sei que já existem algumas perguntas sobre recomendações para estruturas de teste de unidade C ++, mas todas as respostas não ajudaram, pois apenas recomendam uma das estruturas, mas não fornecem nenhuma informação sobre uma comparação (recurso).

Eu acho que as estruturas mais interessantes são CppUnit, Boost e a nova estrutura de testes do Google. Alguém já fez alguma comparação?

empregada doméstica
fonte
2
possível duplicata de teste de unidade para o código C ++ - Ferramentas e metodologia
HaskellElephant
Eu tenho minha própria estrutura de teste baseada no COI, da qual gosto mais porque não é apenas um clone do que todos os outros fazem, mas aborda o que considero todos os problemas dos outros. Você escreve casos de teste derivando de uma classe, não usando macros. As macros são usadas apenas para afirmações, pois elas refletem. Saída personalizada de estatísticas de teste. Execute a partir do script do COI para escolher o que testar, com que frequência e com quais parâmetros.
Cashcow
e é brilhante do ponto de vista do desenvolvimento, pois quando adiciono meu próprio teste, posso executá-lo sem ter que executar todos os outros ao mesmo tempo. Então eu sei que meu código está funcionando.
Cashcow

Respostas:

99

Veja esta pergunta para alguma discussão.

Eles recomendam os artigos: Explorando a selva da estrutura de testes de unidade C ++ , por Noel Llopis. E o mais recente: estruturas de unidades de teste C ++

Ainda não encontrei um artigo que compare o googletest com outros quadros ainda.

Sam Saffron
fonte
Como escrevi: todas as respostas apenas recomendam um dos frameworks, mas não o comparam a outro.
Housemaister
Você também não está feliz com o artigo?
Gishu 28/10/08
7
Uma crítica: o artigo, embora bom, é de 2004 e não inclui o Google Test.
richq
2
No primeiro link, você verá duas comparações. Exceto a nova estrutura do google, a maioria das informações ainda é relevante. (E o CppUnit não é o mais interessante, é muito desajeitado para usar) #
597 Luc Hermitte 28/10/08
1
fixa-se ligações e expandiu a resposta com uma comparação mais recente
Sam Saffron
120

Um novo player é o Google Test (também conhecido como Google C ++ Testing Framework ), o que é bastante interessante.

#include <gtest/gtest.h>

TEST(MyTestSuitName, MyTestCaseName) {
    int actual = 1;
    EXPECT_GT(actual, 0);
    EXPECT_EQ(1, actual) << "Should be equal to one";
}

Principais características:

  • Portátil
  • Afirmações fatais e não fatais
  • Mensagens informativas de afirmações fáceis :ASSERT_EQ(5, Foo(i)) << " where i = " << i;
  • O Google Test detecta automaticamente seus testes e não exige que você os enumere para executá-los
  • Facilite a extensão do seu vocabulário de asserção
  • Testes de morte (consulte o guia avançado)
  • SCOPED_TRACE para loops de rotina
  • Você pode decidir quais testes executar
  • Geração de relatório de teste XML
  • Acessórios / Mock / Templates ...
Wernight
fonte
3
Eu realmente gosto de usar o teste do google em alguns dos outros frameworks, especialmente com seus recursos de simulação que podem ser encontrados no framework googlemock.
Mike
8
Eu forneço todos esses recursos (embora alguns ainda não sejam públicos) e muito mais em minha nova estrutura de teste, o CATCH. Veja minha resposta para o link.
Phsquared
2
combiná-lo com a estrutura do Google C ++ Mocking torna a estrutura de teste xUnit realmente poderosa para o código C ++ de teste de unidade.
ratkok
5
@CashCow Correr com a compilação é algo diferente da detecção de teste. A execução com build depende do seu sistema de build. A detecção de teste significa que você não precisa listar todos os testes em outra classe, basta criar os métodos de teste e pronto.
Wernight
Mas não gosto do uso excessivo de macros e do fato de usar palavras comuns como TEST que podem colidir com algo. O GTEST seria melhor, menos propenso a entrar em conflito.
precisa saber é o seguinte
112

Acabei de lançar minha própria estrutura, CATCH , por aí. Ainda está em desenvolvimento, mas acredito que já supera a maioria dos outros frameworks. Pessoas diferentes têm critérios diferentes, mas tentei cobrir a maior parte do terreno sem muitas trocas. Dê uma olhada na minha entrada de blog vinculada para uma degustação. Meus cinco principais recursos são:

  • Apenas cabeçalho
  • Registro automático de testes de função e método
  • Decompõe expressões C ++ padrão em LHS e RHS (para que você não precise de uma família inteira de macros de afirmação).
  • Suporte para seções aninhadas em um dispositivo baseado em função
  • Testes de nome usando linguagem natural - nomes de função / método são gerados

Ele também possui ligações Objective-C. O projeto está hospedado no Github

philsquared
fonte
Por favor, considere adicionar CHECK_FLASEe REQUIRE_FLASEmacros.
Emile Cormier
6
Melhor estrutura na minha opinião.
CoffeDeveloper 27/08/2015
3
doctest é o meu reimplementação de captura com um enorme foco na velocidade de compilação - check-out o FAQ para ver como eles diferem
onqtam
@einpoklum A captura não é abandonada - o criador está trabalhando na versão 2 da biblioteca. doctest é espécie de uma reimplementação de Captura 1 com algumas decisões de design de bônus
onqtam
2
Estou realmente perplexo ao comparar todas as estruturas de teste (uma das quais agora tenho que escolher). Você escreveria sua própria resposta comparando e contrastando o doctest com Catch e outras ofertas?
einpoklum
53

A Biblioteca de Teste do Boost é uma escolha muito boa, especialmente se você já estiver usando o Boost.

// TODO: Include your class to test here.
#define BOOST_TEST_MODULE MyTest
#include <boost/test/unit_test.hpp>

BOOST_AUTO_TEST_CASE(MyTestCase)
{
    // To simplify this example test, let's suppose we'll test 'float'.
    // Some test are stupid, but all should pass.
    float x = 9.5f;

    BOOST_CHECK(x != 0.0f);
    BOOST_CHECK_EQUAL((int)x, 9);
    BOOST_CHECK_CLOSE(x, 9.5f, 0.0001f); // Checks differ no more then 0.0001%
}

Suporta:

  • Registro de testes automáticos ou manuais
  • Muitas afirmações
  • Comparação automática de coleções
  • Vários formatos de saída (incluindo XML )
  • Acessórios / Modelos ...

PS: Eu escrevi um artigo sobre isso que pode ajudá-lo a começar: Estrutura de teste de unidade C ++: um tutorial de teste de reforço

Wernight
fonte
Eu costumava usar o teste Boost e gostava, exceto que parecia mudar significativamente entre os lançamentos. Foi bastante difícil vender testes de unidade para meu cliente sem ter que gastar mais do meu tempo (e o dinheiro deles) consertando os testes quando a API mudou, do que consertar o código que deveria estar testando. No final, larguei e escrevi o meu próprio - isso foi há cerca de 5 anos atrás.
Componente
5
O link do tutorial está quebrado
mloskot
2
@mloskot Funciona novamente.
Chris Jester-Young
@mloskot Desculpe por isso, envie-me diretamente um e-mail, se você vê que está quebrado. É fácil encontrar um comentário. :)
Wernight 17/11/2015
@Wernight Yup, funciona novamente. Thx
mloskot
16

Lançamos recentemente o xUnit ++ , especificamente como uma alternativa ao Google Test e à Boost Test Library (veja as comparações ). Se você conhece o xUnit.Net, está pronto para o xUnit ++.

#include "xUnit++/xUnit++.h"

FACT("Foo and Blah should always return the same value")
{
    Check.Equal("0", Foo()) << "Calling Foo() with no parameters should always return \"0\".";
    Assert.Equal(Foo(), Blah());
}

THEORY("Foo should return the same value it was given, converted to string", (int input, std::string expected),
    std::make_tuple(0, "0"),
    std::make_tuple(1, "1"),
    std::make_tuple(2, "2"))
{
    Assert.Equal(expected, Foo(input));
}

Principais características:

  • Incrivelmente rápido: os testes são executados simultaneamente .
  • Portátil
  • Registro de teste automático
  • Muitos tipos de asserção (o Boost não possui nada no xUnit ++)
  • Compara coleções nativamente.
  • As afirmações vêm em três níveis:
    • erros fatais
    • erros não fatais
    • avisos
  • Registro de afirmação fácil :Assert.Equal(-1, foo(i)) << "Failed with i = " << i;
  • Registro de teste :Log.Debug << "Starting test"; Log.Warn << "Here's a warning";
  • Luminárias
  • Testes orientados a dados (teorias)
  • Selecione em quais testes executar com base em:
    • Correspondência de atributos
    • Nome da substring correspondente
    • Suítes de teste
Moswald
fonte
2
A questão está pedindo comparação. Na IMO, é vital apresentar quais são as diferenças entre sua estrutura e, pelo menos, as duas populares: googletest e Boost. Especialmente, se você anunciar o xUnit ++ como alternativa aos dois. Será +1 se atualizado :)
mloskot
Justo. :) Eu já tenho uma tabela de comparação no wiki , mas tentarei resumir algumas das diferenças diretamente na minha resposta.
moswald
1
Decidi apenas vincular a tabela wiki diretamente, estava bagunçando o resumo para listar tudo.
moswald
o link funciona para mim, obrigado! 1
mloskot
1
seu projeto foi descontinuado? A última confirmação remonta a 09/2015 ... Enfim, ótima resposta. Obrigado.
Zertyz 03/10/19
5

CppUTest - muito bom, estrutura leve com bibliotecas simuladas. Vale a pena dar uma olhada.

Ratkok
fonte
4

CPUnit ( http://cpunit.sourceforge.net ) é uma estrutura semelhante ao Google Test, mas que conta com menos macos (assertivas são funções) e onde as macros são prefixadas para evitar a armadilha comum de macro. Os testes são parecidos com:

#include <cpunit>

namespace MyAssetTest {
    using namespace cpunit;

    CPUNIT_FUNC(MyAssetTest, test_stuff) {
        int some_value = 42;
        assert_equals("Wrong value!", 666, some_value);
    }

    // Fixtures go as follows:
    CPUNIT_SET_UP(MyAssetTest) {
        // Setting up suite here...
        // And the same goes for tear-down.
    }

}

Eles se registram automaticamente, então você não precisa mais do que isso. Depois é só compilar e executar. Acho que usar essa estrutura é muito parecido com o uso do JUnit, para aqueles que tiveram que gastar algum tempo programando Java. Muito agradável!

Roger
fonte
2

Verificador de integridade da API - estrutura de teste para bibliotecas C / C ++:

Um gerador automático de testes de unidade básicos para uma biblioteca C / C ++ compartilhada. É capaz de gerar dados de entrada razoáveis ​​(na maioria, mas infelizmente não todos) casos para parâmetros e compor casos de teste simples ("sanidade" ou "qualidade rasa") para todas as funções da API através da análise de declarações no cabeçalho arquivos.

A qualidade dos testes gerados permite verificar a ausência de erros críticos em casos de uso simples. A ferramenta é capaz de criar e executar testes gerados e detectar falhas (segfaults), interrupções, todos os tipos de sinais emitidos, código de retorno de programa diferente de zero e interrupção do programa.

Recursos exclusivos em comparação com CppUnit, Boost e Google Test:

  • Geração automática de dados de teste e argumentos de entrada (mesmo para tipos de dados complexos)
  • Tipos especializados modernos e altamente reutilizáveis, em vez de acessórios e modelos
linuxbuild
fonte