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?
- Platform onafhankelijk
- Snelheid
- Geen gezeik met Managed C++, compatibel met "eender wat" (enige vereiste:
cc
compiler variant) - Wordt veel gebruikt (Chromium, Stack overflow)
Waarom niet?
- slechte of geen integratie met VStudio (zie onder)
- wéér een andere syntax dan MS .NET testen
- 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:
- General > Configuration type = Application (.EXE)
- C/C++ > General > Additional Include dirs naar gtest/include verwijzen
- C/C++ > Preprocessor > definitions toevoegen
_VARIADIC_MAX=10
- Code generation > Runtime library op
/MDd
of/MTd
juist zetten (zie boven) - Linker > Additional Library directories > gtest/Debug (staan reeds binaries indien compiled)
- Linker > Input > Additional dependencies = gtestd.lib;gtest_maind.lib;(rest)
- Linker > System > SubSystem Console
/SYBSYSTEM:CONSOLE
- 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?)