VSTS Code Coverage mit nativen C++ Projekt und C# Projekt im Mix
Die Frage bekomme ich recht häufig und habe daher mal ein Demo gebaut, um zu zeigen wie es geht. Meine Demo Solution besteht aus 3 Projekten:
CodeCoverageWithC (C# Lib, ruft die native C++ Lib via Interop)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
namespace CodeCoverageWithC
{
public class Class1
{
//Import der nativen Function Add(int n1, int n2)
[DllImport("CalcLib.dll", CharSet=CharSet.Unicode,EntryPoint="#1")]
public static extern int Add(int n1,int n2);
public int calcValues(int value1, int value2)
{
return Add(value1,value2);
}
}
}
CalcLib (native C++, implementiert die Add Function, welche exportiert werden muss)
// CalcLib.h :
class CalcLib
{
public:
CalcLib(void);
~CalcLib(void);
__declspec(dllexport) int Add(int n1, int n2);
};
// CalcLib.cpp : Defines the exported functions for the DLL application.
//
#include "StdAfx.h"
#include "CalcLib.h"
CalcLib::CalcLib(void){}
CalcLib::~CalcLib(void){}
int CalcLib::Add(int n1, int n2)
{
return n1 + n2;
}
CalcTest(C# Test Project, welches den Unittest implementiert, der calcValues() testet)
[TestMethod()]
public void calcValuesTest()
{
Class1 target = new Class1();
int n1 = 1;
int n2 = 2;
int expected = 3; // Sollte passen oder? :-)
int actual;
actual = target.calcValues(n1, n2);
Assert.AreEqual(expected, actual);
}
Einfacher geht’s wohl nicht…
Wenn ich jetzt den UnitTest ausführe möchte ich die CodeCoverage beider Dll’s haben. Also in der Testrunconfig die beiden Dlls für CodeCoverage konfigurieren:
Wichtig: Damit die native CalcLib instrumentiert werden kann, muss der Linker Switch /PROFILE gesetzt sein:
So jetzt den UnitTests ausführen und CodeCoverage anschauen. Die 100% Coverage kommen von der überagenden Komplexität des Codes :-)
Die Solution gibt’s hier:
Viel Spass
Chris