Pergunta

Estou tendo problemas para descobrir como configurar e usar a estrutura de teste no Visual Studio 2008 para C++, presumivelmente com o conjunto de testes de unidade integrado.

Quaisquer links ou tutoriais serão apreciados.

Foi útil?

Solução

Esta página pode ajudar, ele analisa algumas estruturas de teste de unidade C++:

  • Unidade Cpp
  • Impulsionar.Teste
  • CppUnit Lite
  • Unidade NanoCpp
  • Unidade++
  • CxxTeste

Confira CPPUnitLite ou CPPUnitLite2.

CPPUnitLite foi criado por Michael Feathers, que originalmente portou o JUnit do Java para C++ como CPPUnit (o CPPUnit tenta imitar o modelo de desenvolvimento do JUnit - mas o C++ não possui os recursos do Java [por exemploreflexão] para facilitar o uso).

CPPUnitLite tenta criar uma estrutura de teste no estilo C++, não uma estrutura Java portada para C++.(estou parafraseando o livro de Feather Trabalhando de forma eficaz com código legado livro). CPPUnitLite2 parece ser outra reescrita, com mais recursos e correções de bugs.

Eu também acabei de tropeçar TesteUnitário++ que inclui material do CPPUnitLite2 e alguma outra estrutura.

A Microsoft lançou WinUnit.

Finalizar também a compra Pegar ou Doctest

Outras dicas

Existe uma maneira de testar C++ não gerenciado usando a estrutura de teste integrada no Visual Studio 2008.Se você criar um projeto de teste C++ usando C++/CLI, poderá fazer chamadas para uma DLL não gerenciada.Você terá que mudar o suporte do Common Language Runtime para /clr de /clr:safe se quiser testar o código que foi escrito em C++ não gerenciado.

Tenho detalhes passo a passo no meu blog aqui: http://msujaws.wordpress.com/2009/05/06/unit-testing-mfc-with-mstest/

Aqui está a abordagem que uso para testar o módulo IIS URL Rewrite na Microsoft (é baseado em linha de comando, mas também deve funcionar para VS):

  1. Certifique-se de que seus arquivos de cabeçalho sejam consumíveis, movendo o código-fonte para arquivos cpp e usando a declaração direta, se necessário.
  2. Compile seu código para testar como biblioteca (.lib)
  3. Crie seu projeto UnitTest como C++ com suporte CLR.
  4. Inclua seus arquivos de cabeçalho.
  5. Inclua seus arquivos .lib.
  6. Adicione uma referência a Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll
  7. Use uma classe bem pequena para declarar seu teste de unidade e pule do código gerenciado para o código C++/Nativo como este (pode conter erros de digitação):

Aqui está um exemplo:

// Example
#include "stdafx.h"
#include "mstest.h"

// Following code is native code.
#pragma unmanaged
void AddTwoNumbersTest() {
  // Arrange
  Adder yourNativeObject;
  int expected = 3;
  int actual;
  // Act
  actual = yourNativeObject.Add(1, 2);
  // Assert
  Assert::AreEqual(expected, actual, L"1 + 2 != 3");
}

// Following code is C++/CLI (Managed)
#pragma managed
using namespace Microsoft::VisualStudio::TestTools::UnitTesting;
[TestClass]
public ref class TestShim {
public:
  [TestMethod]
  void AddTwoNumbersTest() {
     // Just jump to C++ native code (above)
     ::AddTwoNumbersTest();
  }
};

Com essa abordagem, as pessoas não precisam aprender muito sobre C++/CLI, todo o teste real será feito em C++ nativo e a classe TestShim será usada para 'publicar' o teste em MSTest.exe (ou torná-lo visível ).

Para adicionar novos testes basta declarar um novo método [TestMethod] void NewTest(){::NewTest();} e uma nova função nativa void NewTest().Sem macros, sem truques, simples.

Agora, o arquivo heade é opcional, mas pode ser usado para expor os métodos da classe Assert com assinaturas nativas C++ (por exemplo,wchar_t* em vez de Stirng^), então você pode mantê-lo próximo ao C++ e longe do C++/CLI:

Aqui está um exemplo:

// Example
#pragma once
#pragma managed(push, on)
using namespace System;
class Assert {
public:
    static void AreEqual(int expected, int actual) {
        Microsoft::VisualStudio::TestTools::UnitTesting::Assert::AreEqual(expected, actual);
    }

    static void AreEqual(int expected, int actual, PCWSTR pszMessage) {
        Microsoft::VisualStudio::TestTools::UnitTesting::Assert::AreEqual(expected, actual, gcnew String(pszMe
ssage));
    }

    template<typename T>
    static void AreEqual(T expected, T actual) {
        Microsoft::VisualStudio::TestTools::UnitTesting::Assert::AreEqual(expected, actual);
    }

    // Etcetera, other overloads...
}
#pragma managed(pop)

HTH

Pessoalmente, prefiro WinUnit já que não exige que eu escreva qualquer coisa, exceto meus testes (Eu construo um .dll como teste, não um exe).Acabei de construir um projeto e aponto WinUnit.exe para meu diretório de saída de teste e ele executa tudo o que encontra.Você pode baixe o projeto WinUnit aqui.(O MSDN agora exige que você baixe a edição inteira, não o artigo.WinUnit está incluído.)

A estrutura incluída no VS9 é .NET, mas você pode escrever testes em C++/CLI, portanto, desde que se sinta confortável em aprender alguns ismos do .NET, você poderá testar quase qualquer código C++.

impulsionar.testee googletesteparecem ser bastante semelhantes, mas adaptados para usos ligeiramente diferentes.Ambos possuem um componente binário, então você precisará de um projeto extra em sua solução para compilar e executar os testes.

A estrutura que usamos é CxxTeste, que é muito mais leve;são apenas cabeçalhos e usam um script Perl (!) para extrair informações do conjunto de testes de seus cabeçalhos (os conjuntos herdam de CxxTest::Base, todos os nomes de seus métodos de teste começam com "teste").Obviamente, isso requer que você obtenha Perl de Uma fonte ou outro, o que adiciona sobrecarga à configuração do ambiente de compilação.

eu uso TesteUnitário++.

Nos anos desde que fiz esta postagem, a fonte mudou do SourceForge para o github.Também o tutorial de exemplo agora é mais agnóstico - não entra em nenhuma configuração ou projeto definido.

Duvido que ainda funcione no Visual Studio 6, pois os arquivos do projeto agora são criados via CMake.Se você ainda precisar do suporte à versão mais antiga, poderá obter a última versão disponível no FonteForge filial.

As ferramentas mencionadas aqui são todas ferramentas de linha de comando.Se você procura uma solução mais integrada, dê uma olhada em estúdio cfix, que é um complemento do Visual Studio para testes de unidade C/C++.É bastante semelhante ao TestDriven.Net, mas para C/C++ (não gerenciado) em vez de .NET.

eu usei Unidade Cpp com VS2005 e Eclipse.O wiki é muito completo (especialmente se você estiver familiarizado com JUnit).

Não tenho 100% de certeza sobre o VS2008, mas sei que a estrutura de teste de unidade que a Microsoft lançou no VS2005 como parte de seu Team Suite era apenas para .NET, não para C++

Eu usei o CppUnit também e deu certo.Quase o mesmo que NUnit/JUnit/assim por diante.

Se você usou boost, eles também tem uma biblioteca de testes unitários

Os caras por trás do boost têm alguns sério técnicas de codificação, então eu diria que a estrutura deles deve ser muito boa, mas pode não ser a mais amigável :-)

Também gosto do CxxTest pelos mesmos motivos.É apenas um arquivo de cabeçalho, portanto não é necessário vincular.Você não está preso ao Perl, pois também existe um executor Python.Estarei revisando a biblioteca do Google em breve.O material Boost traz muitas outras bagagens.

O testador de unidade do Visual Studio 2008 é apenas para código .NET, até onde eu sei.

Usei o CppUnit no Visual Studio 2005 e achei muito bom.

Pelo que me lembro, a configuração foi relativamente indolor.Apenas certifique-se de que em seus projetos de teste o vinculador (Linker → Entrada → Dependências Adicionais) inclua cppunitd.lib.

Então, #include <cppunit/extensions/HelperMacros.h> no seu cabeçalho.

Você pode então seguir as etapas em http://cppunit.sourceforge.net/doc/1.11.6/cppunit_cookbook.html para fazer sua classe de teste funcionar.

Eu estava sofrendo para implementar testes unitários para uma aplicação C++ não gerenciada em um ambiente Windows com Visual Studio.Então consegui superar e escrevi um post com uma orientação passo a passo para testes unitários de aplicativos C++ não gerenciados.Espero que possa ajudá-lo.

Teste de unidade para C++ não gerenciado no Visual Studio

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top