How to set up unit testing for Visual Studio C++
Asked Answered
I

12

94

I'm having trouble figuring out how to get the testing framework set up and usable in Visual Studio 2008 for C++ presumably with the built-in unit testing suite.

Any links or tutorials would be appreciated.

Iambus answered 6/8, 2008 at 7:57 Comment(3)
Google releases C++ Test Framework which is very similar with xUnit frameworks. http://code.google.com/p/googletest/Transfusion
What framework did you end up using?Lamdin
actually I still haven't used any of them. I decided for what I was working on unit tests weren't the most effective use of time.Iambus
F
57

This page may help, it reviews quite a few C++ unit test frameworks:

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

Check out CPPUnitLite or CPPUnitLite2.

CPPUnitLite was created by Michael Feathers, who originally ported Java's JUnit to C++ as CPPUnit (CPPUnit tries mimic the development model of JUnit - but C++ lacks Java's features [e.g. reflection] to make it easy to use).

CPPUnitLite attempts to make a true C++-style testing framework, not a Java one ported to C++. (I'm paraphrasing from Feather's Working Effectively with Legacy Code book). CPPUnitLite2 seems to be another rewrite, with more features and bug fixes.

I also just stumbled across UnitTest++ which includes stuff from CPPUnitLite2 and some other framework.

Microsoft has released WinUnit.

Also checkout Catch or Doctest

Futurity answered 30/8, 2008 at 13:51 Comment(3)
Googletest is very similar to boost::test but a little easier to integrate into VSRoxannroxanna
I'm surprised Catch isn't mentioned here. Also checkout doctest - my reimplementation of Catch with a huge focus on compilation speed - checkout the FAQ to see whats different between the twoColumnist
@Columnist don't be too surprised, this question/answer was from 2008! Added you suggested links.Futurity
T
25

There is a way to test unmanaged C++ using the built in testing framework within Visual Studio 2008. If you create a C++ Test Project, using C++/CLI, you can then make calls to an unmanaged DLL. You will have to switch the Common Language Runtime support to /clr from /clr:safe if you want to test code that was written in unmanaged C++.

I have step by step details on my blog here: http://msujaws.wordpress.com/2009/05/06/unit-testing-mfc-with-mstest/

Triangulate answered 5/5, 2009 at 13:54 Comment(1)
This does place certain restrictions on your C++ code, I've got at least one code base where trying to include its headers into C++/CLI code was more trouble than it was worth. The big benefit for me of using C++/CLI is you can use the funky parameterised testing with attributes like RowTest in mbUnit/NUnit/xUnit.NetSalon
P
9

Here is the approach I use to test the IIS URL Rewrite module at Microsoft (it is command-line based, but should work for VS too):

  1. Make sure your header files are consumable by moving source code to cpp files and using forward declaration if needed.
  2. Compile your code to test as library (.lib)
  3. Create your UnitTest project as C++ with CLR support.
  4. Include your header files.
  5. Include your .lib files.
  6. Add a reference to Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll
  7. Use a really small class for declaring your unit test and jump from managed to C++/Native code like this (may have typos):

Here is an example:

// 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();
  }
};

With this approach, people don't have to learn too much C++/CLI stuff, all the real test will be done in C++ native and the TestShim class will be used to 'publish' the test to MSTest.exe (or make it visible).

For adding new tests you just declare a new [TestMethod] void NewTest(){::NewTest();} method and a new void NewTest() native function. No macros, no tricks, straighforward.

Now, the heade file is optionally, but it can be used to expose the Assert class' methods with C++ native signatures (e.g. wchar_t* instead of Stirng^), so it can you can keep it close to C++ and far from C++/CLI:

Here is an example:

// 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

Ppm answered 1/12, 2009 at 21:56 Comment(0)
R
6

Personally, I prefer WinUnit since it doesn't require me to write anything except for my tests (I build a .dll as the test, not an exe). I just build a project, and point WinUnit.exe to my test output directory and it runs everything it finds. You can download the WinUnit project here. (MSDN now requires you to download the entire issue, not the article. WinUnit is included within.)

Roundup answered 15/9, 2008 at 16:33 Comment(0)
P
4

The framework included with VS9 is .NET, but you can write tests in C++/CLI, so as long as you're comfortable learning some .NET isms, you should be able to test most any C++ code.

boost.test and googletest look to be fairly similar, but adapted for slightly different uses. Both of these have a binary component, so you'll need an extra project in your solution to compile and run the tests.

The framework we use is CxxTest, which is much lighter; it's headers only, and uses a Perl (!) script to scrape test suite information from your headers (suites inherit from CxxTest::Base, all your test methods' names start with "test"). Obviously, this requires that you get Perl from one source or another, which adds overhead to your build environment setup.

Pinter answered 14/8, 2008 at 14:17 Comment(2)
CxxTest can use python instead of perlRoxannroxanna
You also need to be careful about any DLLs required by your code - I've had problems with NUnit and mbUnit testing C++/CLI code, trying to get DLLs loaded.Salon
B
2

I use UnitTest++.

In the years since I made this post the source has moved from SourceForge to github. Also the example tutorial is now more agnostic - doesn't go into any configuration or project set up at all.

I doubt it will still work for Visual Studio 6 as the project files are now created via CMake. If you still need the older version support you can get the last available version under the SourceForge branch.

Birdie answered 6/8, 2008 at 8:28 Comment(0)
U
2

The tools that have been mentioned here are all command-line tools. If you look for a more integrated solution, have a look at cfix studio, which is a Visual Studio AddIn for C/C++ unit testing. It is quite similar to TestDriven.Net, but for (unmanaged) C/C++ rather than .NET.

Urian answered 24/6, 2009 at 6:21 Comment(0)
H
1

I've used CppUnit with VS2005 and Eclipse. The wiki is very thorough (especially if you are familiar with JUnit).

Habsburg answered 11/8, 2008 at 23:13 Comment(0)
M
1

I'm not 100% sure about VS2008, but I know that the Unit Testing framework that microsoft shipped in VS2005 as part of their Team Suite was only for .NET, not C++

I've used CppUnit also and it was alright. Much the same as NUnit/JUnit/so on.

If you've used boost, they also have a unit testing library

The guys behind boost have some serious coding chops, so I'd say their framework should be pretty good, but it might not be the most user friendly :-)

Metastasize answered 11/8, 2008 at 23:45 Comment(0)
C
1

The unit tester for Visual Studio 2008 is only for .NET code as far as I know.

I used CppUnit on Visual Studio 2005 and found it to be pretty good.

As far as I remember, the setup was relatively painless. Just make sure that in your testing projects the linker (Linker → Input → Additional Dependencies) includes cppunitd.lib.

Then, #include <cppunit/extensions/HelperMacros.h> in your header.

You can then follow the steps in http://cppunit.sourceforge.net/doc/1.11.6/cppunit_cookbook.html to get your test class working.

Crossover answered 19/8, 2008 at 17:1 Comment(0)
V
1

I like the CxxTest as well for the same reasons. It's a header file only so no linking required. You aren't stuck with Perl as there is a Python runner as well. I will be reviewing the google library soon. The Boost stuff pulls in too much other baggage.

Vibes answered 27/8, 2008 at 18:15 Comment(0)
T
1

I was suffering to implement unit testing for an unmanaged C++ application in a Windows environment with Visual Studio. So I managed to overcome and wrote a post as a step-by-step guidance to unmanaged C++ application unit testing. I hope it may help you.

Unit test for unmanaged C++ in Visual Studio

Traumatism answered 7/12, 2012 at 8:32 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.