Comparação das estruturas de teste unidade C ++ [fechado]
-
04-07-2019 - |
Pergunta
Eu sei que existem já algumas perguntas sobre recomendações para estruturas de teste de unidade C ++, mas todas as respostas não ajudou, pois apenas recomendar um dos quadros, mas não fornecem qualquer informação sobre um (recurso) comparação.
Eu acho que a maioria dos enquadramentos interessantes são CppUnit, Boost e o novo framework de testes do Google. Alguém feito qualquer comparação ainda?
Solução
Veja esta questão para alguma discussão.
Eles recomendam os artigos: Explorando o C ++ Unit Testing Framework selva, por Noel Llopis. E o mais recente: C ++ unidade de teste Frameworks
Eu não encontrei um artigo que compara googletest aos outros quadros ainda.
Outras dicas
Um novo jogador é Google Teste (também conhecido como Google C ++ Testing Framework ), que é muito bom.
#include <gtest/gtest.h>
TEST(MyTestSuitName, MyTestCaseName) {
int actual = 1;
EXPECT_GT(actual, 0);
EXPECT_EQ(1, actual) << "Should be equal to one";
}
características principais:
- portátil
- Fatal e afirmações não fatais
- afirmações fáceis informativo mensagens :
ASSERT_EQ(5, Foo(i)) << " where i = " << i;
- Google Teste automaticamente detecta seus testes e não requer que você enumerá-los, a fim de executá-los
- Faça fácil estender a sua afirmação de vocabulário
- testes Morte (veja o guia avançado)
-
SCOPED_TRACE
para sub-rotina laços - Você pode decidir que os testes para executar
- XML geração de relatório de ensaio
- Luminárias / Mock / Modelos ...
Eu só empurrou meu próprio quadro, CATCH , lá fora. É ainda em desenvolvimento, mas acredito que já supera a maioria dos outros frameworks. Diferentes pessoas têm critérios diferentes, mas eu tentei cobrir mais terreno sem muitos trade-offs. Dê uma olhada no meu blog ligado para um provador. Meus top cinco características são:
- Apenas cabeçalho
- Registro Auto da função e testes baseados método
- Decompõe expressões C ++ padrão em LHS e RHS (assim você não precisa de uma família inteira de macros do assert).
- Suporte para seções aninhados dentro de um dispositivo elétrico baseado em função
- testa Nome usando linguagem natural - nomes função / método são gerados
Ele também tem ligações Objective-C. O projeto está hospedado em Github
impulsionar Biblioteca Teste é uma escolha muito boa, especialmente se você já está usando 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%
}
Ele suporta:
- automático ou manual de testes de registro
- Muitos afirmações
- Comparação automática da coleções
- Vários formatos de saída (incluindo XML )
- Luminárias / Modelos ...
PS: Eu escrevi um artigo sobre ele que pode ajudá-lo a começar: C ++ Unit Testing Framework : um impulso Teste Tutorial
Wikipedia tem um href="http://en.wikipedia.org/wiki/List_of_unit_testing_frameworks" abrangente da unidade de estruturas de teste , com mesas que identificam características suportadas ou não .
Eu lançou recentemente xUnit ++ , especificamente como uma alternativa ao Google Test and Boost Biblioteca Test (ver o comparações ). Se você estiver familiarizado com xUnit.Net, você está pronto para 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));
}
características principais:
- incrivelmente rápido:. Testes executados simultaneamente
- portátil
- automático Registro de teste
- Muitos tipos de declaração (boost não tem nada sobre xUnit ++)
- Compara coleções nativamente.
- As afirmações vêm em três níveis:
- erros fatais
- erros não fatais
- avisos
- Fácil assert login:
Assert.Equal(-1, foo(i)) << "Failed with i = " << i;
- Test logging:
Log.Debug << "Starting test"; Log.Warn << "Here's a warning";
- Luminárias
- <> fortes Data-driven > fortes provas (Teorias)
- Selecionar que testa para executar com base em:
- correspondência Atributo
- Nome substring matchin
- Test Suites
CppUTest - quadro peso muito agradável, leve, com bibliotecas simulados. Vale a pena tomar um olhar mais atento.
CPUnit ( http://cpunit.sourceforge.net ) é uma estrutura que é semelhante ao Google Teste, mas que se baseia em menos MacOS (afirma são funções), e onde as macros são prefixados para evitar o habitual armadilha macro. Testes parecido:
#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 auto-registo, para que não mais do que isso precisa. Em seguida, ele é apenas compilar e executar. Acho usando este quadro muito parecido com JUnit, para aqueles que tiveram que passar algum tempo de programação Java. Very nice!
Há alguns C ++ recursos de teste de unidade relevantes a http://www.progweap.com/resources.html
API Sanity Checker - estrutura de teste para bibliotecas C / C ++:
Um gerador automático de testes unitários básicos para uma biblioteca de C / C ++ compartilhada. Ele é capaz de gerar razoável (na maior parte, mas infelizmente não todos, os casos) dados de entrada para os parâmetros e simples de composição ( "sanidade" ou -qualidade "superficial") casos de teste para cada função na API através da análise das 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 construir e executar testes gerados e detectar colisões (segfaults), aborts, todos os tipos de sinais emitidos, diferente de zero programa de código de retorno e de suspensão do programa.
características únicas em comparação com CppUnit, Boost e Google teste:
- A geração automática de dados de teste e argumentos de entrada (mesmo para tipos de dados complexos)
- Modern e altamente reutilizável tipos especializados em vez de utensílios e templates