brainbaking/content/post/cplusplus-testing.md

3.6 KiB

+++ title = "C++ Basics: unit testing" subtitle = "C++ Basics: Unit Testing with GTest" archived = true draft = false tags = [ "c++", "Unit Testing", "gtest" ] date = "2013-10-01" +++

Using Google Test

Downloaden op https://code.google.com/p/googletest/downloads/list

Waarom?

  1. Platform onafhankelijk
  2. Snelheid
  3. Geen gezeik met Managed C++, compatibel met "eender wat" (enige vereiste: cc compiler variant)
  4. Wordt veel gebruikt (Chromium, Stack overflow)

Waarom niet?

  1. slechte of geen integratie met VStudio (zie onder)
  2. wéér een andere syntax dan MS .NET testen
  3. beetje awkward assertions

Assertions schrijven

#include "../BaseCode/BaseCode.h"

#include "gtest/gtest.h"

TEST(MyTestCase, MyTest_Success)
{
    EXPECT_EQ(2, MySum(1, 1));
}

TEST(MyTestCase, MyTest_Failure)
{
    EXPECT_EQ(3, MySum(1, 2));
}

Waarbij dan BaseCode uw system under test zaken bevat (waar MySum defined is)

Builden met scons en g++

Tested in Cygwin Win7 & OSX 10.9

Import('env')
env ###### env.Clone(CPPPATH  './:./include')

env.Append(CXXFLAGS = ['-g', '-Wall', '-Wextra', '-pthread'])
gtest ###### env.Library(target  'gtest', source = ['src/gtest-all.cc', 'src/gtest_main.cc'])

Return('gtest')

Zie [Builden met SCons]({{< relref "post/scons-building" >}})

Builden met Visual Studio

Zie http://leefrancis.org/2010/11/17/google-test-gtest-setup-with-microsoft-visual-studio-2008-c/

Er zijn 2 .sln files voorzien in de msvc subdir bij de zipfile, één voor statische links en één voor dynamische. Afhankelijk van uw project (.DLL of .LIB gegenereerde uitkomst), ga je één van beiden moeten compileren. Als je van plan bent om /MDd te gebruiken (dll + debugging), gebruik dan gtest-md.sln.

Daarna kan je een nieuwe solution maken, package naar executable om de test zelf te runnen (om gtest testen te draaien). Verander deze dingen in het project:

  1. General > Configuration type = Application (.EXE)
  2. C/C++ > General > Additional Include dirs naar gtest/include verwijzen
  3. C/C++ > Preprocessor > definitions toevoegen _VARIADIC_MAX=10
  4. Code generation > Runtime library op /MDd of /MTd juist zetten (zie boven)
  5. Linker > Additional Library directories > gtest/Debug (staan reeds binaries indien compiled)
  6. Linker > Input > Additional dependencies = gtestd.lib;gtest_maind.lib;(rest)
  7. Linker > System > SubSystem Console /SYBSYSTEM:CONSOLE
  8. Linker > Input > Module Definition file leeg (indien van DLL naar EXE veranderd kan hier wat brol in zitten)

Visual Studio 2012 en STD problemen

Fouten als

1>a:<br/>gtest<br/>include<br/>gtest<br/>gtest-printers.h(550): error C2977: 'std::tuple' : too many template arguments
1>          b:<br/>program files (x86)<br/>microsoft visual studio 2012<br/>vc<br/>include<br/>utility(73) : see declaration of 'std::tuple'

Op te lossen met een preprocessor macro _VARIADIC_MAX=10, zie http://stackoverflow.com/questions/12558327/google-test-in-visual-studio-2012

Integratie met Visual Studio 2008/2010

GoogleTestAddin (kopieer 2 files naar C:\Users\bkwog\Documents\Visual Studio 2008\Addins, map misschien nog aanmaken)

Niet super nuttig, een knopje om testen snel te herdraaien (of één die geselecteerd is), beter dan post-build actie zie boven...

Integratie met Visual Studio 2012

Google Test Adapter plugin (1.1 - geen actieve development?)