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:

image 

Wichtig: Damit die native CalcLib instrumentiert werden kann, muss der Linker Switch /PROFILE gesetzt sein:

image 

So jetzt den UnitTests ausführen und CodeCoverage anschauen. Die 100% Coverage kommen von der überagenden Komplexität des Codes :-)

image

Die Solution gibt’s hier:

Viel Spass

Chris