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