4.6 KiB
+++ title = "teamtest" draft = false tags = [ "", "Users", "jefklak", "Downloads", "pages", "code", "c", "testing", "teamtest" ] date = "2013-07-17" +++
Visual Studio 2005 TeamTest Framework
Hoofdartikel (2005, C# voorbeelden): http://msdn.microsoft.com/en-us/library/ms379625(v=vs.80).aspx
Waarom?
- Zelfde syntax als built-in C# unit tests voor Visual Studio
- Makkelijker te lezen dan bvb [code/c/testing/gtest]({{< relref "wiki/code/c/testing/gtest.md" >}})
- Garbage collector van Managed C++, joepie (?)
- Toch mogelijk om unmanaged native C++ te testen (zie onder), integratie VStudio.
Waarom niet?
- Dropped support voor VS2012? zie [code/c/testing/testexplorer]({{< relref "wiki/code/c/testing/testexplorer.md" >}}) in de plaats (native C++)
/cli
flag miserie (zie onder)- Onduidelijke syntax voor hardcore C++ users die niet aan C# gewend zijn
Visual Studio 2008
Hiervoor moeten we een apart test project aanmaken dat met /CLR flag compileert om de .NET test suites te gebruiken (using namespace Microsoft::VisualStudio::TestTools::UnitTesting;
):
Project > configuration properties > General > Common Language Runtime support
Dit staat op /clr:safe
indien je met VStudio 2008 een nieuwe test aan maakt via menu Test > New Test > Unit Test
Een voorbeeld header file om te testen:
class MyClass {
public:
MyClass() {};
int addUp(int one, int two);
};
#include "myclass.h"
#include <iostream>
using namespace std;
int MyClass::addUp(int one, int two)
{
return one + two;
}
Managed test code schrijven
Gebruik dezelfde manier als .NET Unit Testing framework met attributes - dit vereist dus de CLR flag. Voorbeeld:
#include "stdafx.h"
#include "../libtest/myclass.h"
using namespace System;
using namespace System::Text;
using namespace System::Collections::Generic;
using namespace Microsoft::VisualStudio::TestTools::UnitTesting;
namespace unittests
{
[TestClass]
public ref class MyClassTest
{
public:
[TestMethod]
void AddOne()
{
Assert::AreEqual(3, MyClass().addUp(1, 2));
};
};
}
Assert heeft een hoop static methods
een externe klasse testen die van een lib komt
Als je vanuit je test project wil refereren naar productie code/projecten, kan dit een probleem zijn:
MyClassTest.obj : error LNK2028: unresolved token (0A00000A) "public: __thiscall MyClass::MyClass(void)" (??0MyClass@@$$FQAE@XZ) referenced in function "public: void __clrcall unittests::MyClassTest::AddOne(void)" (?AddOne@MyClassTest@unittests@@$$FQ$AAMXXZ)
MyClassTest.obj : error LNK2028: unresolved token (0A00000B) "public: int __thiscall MyClass::addUp(int,int)" (?addUp@MyClass@@$$FQAEHHH@Z) referenced in function "public: void __clrcall unittests::MyClassTest::AddOne(void)" (?AddOne@MyClassTest@unittests@@$$FQ$AAMXXZ)
MyClassTest.obj : error LNK2019: unresolved external symbol "public: int __thiscall MyClass::addUp(int,int)" (?addUp@MyClass@@$$FQAEHHH@Z) referenced in function "public: void __clrcall unittests::MyClassTest::AddOne(void)" (?AddOne@MyClassTest@unittests@@$$FQ$AAMXXZ)
Dat wil zeggen, het compileert, maat het linkt niet. Oplossing: Voeg dit toe aan uw stdafx.cpp
:
#pragma comment(lib, "../Debug/libtest.lib")
gegeven dat "libtest" uw project under test is. Vanaf dan kan je normaal header files includen in uw test cpp file, zie boven.
een externe klasse testen die van een DLL komt
Er wordt pas een .lib
file gegenereerd wanneer je declspec(dllexport)
definiëert - wanneer niets exported is, kan er ook niets imported worden... Dus myClass
aanpassen:
#ifdef FRIENDCLASS_EXPORT
#define FRIENDCLASS __declspec(dllexport)
#else
#define FRIENDCLASS __declspec(dllimport)
#endif
class FRIENDCLASS MyClass {
public:
MyClass();
int addUp(int one, int two);
};
En dan het libtest project compileren met de extra preprocessor definitie FRIENDCLASS_EXPORT
zodat in commandline /D "FRIENDCLASS_EXPORT"
erbij komt. Zie ook MSDN Preprocessor definitions, nu kunnen we hierop checken in de code met #ifdef
. Bovenstaande code doet een export wanneer gedefiniëerd, en een import anders - dit gebeurt wanneer we de header file includen vanuit onze test cpp file.
Debugging
❗ Debug information format flags: /ZI
("Edit and Continue feature", retry drukken bij assertion failure) is niet ondersteund in combinatie met /cli
. Debuggen gaat wel op /Zi
niveau.