Como configurar o teste de unidade para Visual Studio C ++

93

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

Quaisquer links ou tutoriais seriam apreciados.

DShook
fonte
O Google lança o C ++ Test Framework que é muito semelhante aos frameworks xUnit. http://code.google.com/p/googletest/
popopome
Qual framework você acabou usando?
Joakim Karlsson
na verdade, ainda não usei nenhum deles. Decidi que os testes de unidade em que estava trabalhando não eram o uso mais eficaz do tempo.
DShook

Respostas:

56

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

  • CppUnit
  • Boost.Test
  • CppUnitLite
  • NanoCppUnit
  • Unidade ++
  • CxxTest

Confira CPPUnitLite ou CPPUnitLite2 .

CPPUnitLite foi criado por Michael Feathers, que originalmente portou JUnit de Java para C ++ como CPPUnit (CPPUnit tenta imitar o modelo de desenvolvimento de JUnit - mas C ++ carece de recursos de Java [por exemplo, reflexão] para torná-lo fácil de usar).

CPPUnitLite tenta fazer uma verdadeira estrutura de teste no estilo C ++, não Java portada para C ++. (Estou parafraseando do livro Working Effectively with Legacy Code de Feather ). CPPUnitLite2 parece ser outra reescrita, com mais recursos e correções de bugs.

Eu também tropecei no UnitTest ++ que inclui coisas do CPPUnitLite2 e alguns outros frameworks.

A Microsoft lançou o WinUnit .

Verifique também o Catch ou Doctest

Aardvark
fonte
2
Googletest é muito semelhante a boost :: test, mas um pouco mais fácil de integrar ao VS
Martin Beckett
3
Estou surpreso que Catch não seja mencionado aqui. Verifique também doctest - minha reimplementação do Catch com um grande foco na velocidade de compilação - verifique o FAQ para ver o que é diferente entre os dois
onqtam
1
@onqtam não se surpreenda, essa pergunta / resposta é de 2008! Adicionou seus links sugeridos.
Aardvark
24

Há uma maneira de testar C ++ não gerenciado usando a estrutura de teste integrada do 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/

Jared
fonte
1
Isso coloca certas restrições em seu código C ++, eu tenho pelo menos uma base de código onde tentar incluir seus cabeçalhos no código C ++ / CLI foi mais problemático do que valeu a pena. O grande benefício para mim de usar C ++ / CLI é que você pode usar o teste parametrizado funky com atributos como RowTest em mbUnit / NUnit / xUnit.Net
Andy Dent
9

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

  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 de encaminhamento, 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 muito pequena para declarar seu teste de unidade e pule do código gerenciado para o C ++ / nativo como este (pode ter 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 esta abordagem, as pessoas não precisam aprender muito 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, você apenas declara um novo método [TestMethod] void NewTest () {:: NewTest ();} e uma nova função nativa void NewTest (). Sem macros, sem truques, direto.

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 ^), para que você possa mantê-lo próximo a C ++ e longe de 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

aracntido
fonte
6

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

Moswald
fonte
4

A estrutura incluída com o VS9 é .NET, mas você pode escrever testes em C ++ / CLI, então, desde que você se sinta confortável em aprender alguns .NET ismos, poderá testar quase todos os códigos C ++.

boost.test e googletest parecem ser bastante semelhantes, mas adaptados para usos ligeiramente diferentes. Ambos têm um componente binário, portanto, você precisará de um projeto extra em sua solução para compilar e executar os testes.

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

Ben Straub
fonte
CxxTest pode usar python em vez de perl
Martin Beckett
Você também precisa ter cuidado com quaisquer DLLs exigidas pelo seu código - tive problemas com NUnit e mbUnit testando o código C ++ / CLI, tentando carregar DLLs.
Andy Dent
2

Eu uso o UnitTest ++ .

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

Duvido que ainda funcione para o Visual Studio 6, pois os arquivos do projeto agora são criados por meio do CMake. Se você ainda precisa do suporte à versão mais antiga, pode obter a última versão disponível no branch SourceForge .

graham.reeds
fonte
2

As ferramentas que foram mencionadas aqui são todas ferramentas de linha de comando. Se você procura uma solução mais integrada, dê uma olhada no cfix studio , que é um suplemento 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.

Peter Mortensen
fonte
1

Eu usei CppUnit com VS2005 e Eclipse. O wiki é muito completo (especialmente se você estiver familiarizado com o JUnit).

Colgur
fonte
1

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 do Team Suite era apenas para .NET, não C ++

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

Se você usou boost, eles também têm uma biblioteca de teste de unidade

Os caras por trás do boost têm sérios problemas de codificação, então eu diria que seu framework deve ser muito bom, mas pode não ser o mais amigável :-)

Orion Edwards
fonte
1

Também gosto do CxxTest pelas mesmas razões. É apenas um arquivo de cabeçalho, portanto, nenhum link é necessário. 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 muita outra bagagem.

ZebZiggle
fonte
1

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

Usei 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>em 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 aula de teste funcionar.

Lehane
fonte
1

Eu estava sofrendo para implementar o teste de unidade para um aplicativo C ++ não gerenciado em um ambiente Windows com Visual Studio. Então, consegui superar e escrever um post como uma orientação passo a passo para o teste de unidade de aplicativo C ++ não gerenciado. Espero que possa ajudá-lo.

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

Nayana Adassuriya
fonte