[Updated] Unit Tests mit .NET Core

Update 25.10.2016: NUnit Tests laufen nun auch unter .NET Core (s.u.).

Wie schreibe ich Unit Tests mit .NET Core? Diese simple Frage sollte eigentlich überflüssig sein. Microsoft hat mit .NET Core Version 1.0 gerade eine plattformübergreifende Version des .NET Frameworks herausgebracht. Man sollte meinen, dass Unit Tests dabei von Anfang an mit berücksichtigt wurden. Das automatisierte Testen ist schließlich Stand der Technik und absolut unverzichtbar. Ich habe erwartet, dass nach der Installation der .NET Core Unterstützung für Visual Studio 2015 ein neuer Projekttyp für .NET Core Unit Tests angeboten wird. Doch Fehlanzeige.

Unit Tests mit .NET Core

Zwar heißt es auf der Downloadseite von Microsoft, VS 2015 Tooling Preview 2, doch wenn Microsoft es mit den Tests ernst nehmen würde, wär ein passender Projekttyp dabei und Tests würden out-of-the-box unterstützt.

Unit Tests mit .NET Core

Zur Zeit stehen die Unit Test Frameworks xUnit und MSTest zur Auswahl. NUnit habe ich nicht zum Laufen gekriegt. NUnit Tests laufen nun auch! Siehe weiter unten.

Die Unit Test Runner von ReSharper und NCrunch unterstützen Tests unter .NET Core bislang noch nicht.

Update 25.10.2016: ReSharper 2016.3 EAP 5 unterstützt NUnit und xUnit Tests 😉

xUnit Testprojekt unter Visual Studio 2015

Als Voraussetzung, um unter Visual Studio 2015 Unit Tests mit .NET Core zu schreiben, sind Visual Studio 2015 Update 3 sowie VS 2015 Tooling Preview 2 zu installieren.

.NET Core Testprojekte müssen mit dem Projekttyp Console Application (.NET Core) erstellt werden. Ferner muss das Testprojekt das Implementationsprojekt referenzieren. Dazu öffnen Sie wie gewohnt im Solution Explorer beim Testprojekt auf dem Eintrag References das Kontextmenü und wählen den Punkt Add Reference. Dann wählen Sie unter Projects / Solution das gewünschte Projekt aus, zu dem Sie Tests schreiben möchten.

Als nächstes fügen Sie die mit Sternchen markierten Einträge in die Datei project.json des Testprojekts hinzu:

{
   "version": "1.0.0-*",
   "buildOptions": {
      "emitEntryPoint": true
   },

   "dependencies": {
      "Microsoft.NETCore.App": {
         "type": "platform",
         "version": "1.0.1"
      },
*      "NETStandard.Library": "1.6.0",
*      "xunit": "2.2.0-beta2-build3300",
*      "dotnet-test-xunit": "2.2.0-preview2-build1029"
   },

   "frameworks": {
      "netcoreapp1.0": {
      "imports": "dnxcore50"
      }
   },

*   "testRunner": "xunit"
}

Nachdem Sie dann die Solution neu übersetzt haben, werden Unit Tests im integrierten Testrunner angezeigt und können dort ausgeführt werden. Folgendes Listing zeigt einen (sinnfreien) Unit Test in xUnit Syntax.

using Xunit;

namespace myimpl.tests
{
   public class MyTests
   {
      [Fact]
      public void MyTest() {
         Assert.True(true);
      }
   }
}

MSTest Unit Test mit .NET Core

Ähnlich sieht das ganze mit MSTest als Testframework aus. Auch bei MSTest fügen Sie Ihrer Solution ein Console Application (.NET Core) Projekt hinzu. Die Ergänzungen an der Datei project.json zeigt folgendes Listing. Die Zeilen mit Sternchen müssen hinzugefügt werden.

{
   "version": "1.0.0-*",
   "buildOptions": {
      "emitEntryPoint": true
   },

   "dependencies": {
      "Microsoft.NETCore.App": {
         "type": "platform",
         "version": "1.0.1"
      },
*      "dotnet-test-mstest": "1.1.1-preview",
*      "MSTest.TestFramework": "1.0.3-preview"
   },

   "frameworks": {
      "netcoreapp1.0": {
         "imports": "dnxcore50"
      }
   },

*   "testRunner": "mstest"
}

Tests sehen dann wie gewohnt aus:

using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace myimpl.mstests
{
   [TestClass]
   public class MyTests
   {
      [TestMethod]
      public void MyTest() {
         Assert.AreEqual(42, 42);
      }
   }
}

NUnit Tests mit .NET Core

Inzwischen hat das NUnit Team nachgelegt, so dass jetzt auch Tests mit NUnit unter .NET Core laufen. Vorgehensweise:

  • Ein Projekt vom Typ Console Application (.NET Core) ergänzen.
  • Referenzen auf NUnit und dotnet-test-nunit ergänzen.

Folgendes Listing zeigt die project.json. Mit Sternchen habe ich die Zeilen markiert, die ergänzt werden müssen.

{
  "version": "1.0.0-*",
  "buildOptions": {
    "emitEntryPoint": true
  },

*  "testRunner": "nunit",

  "dependencies": {
    "Microsoft.NETCore.App": {
      "type": "platform",
      "version": "1.0.1"
    },
*    "NUnit": "3.5.0",
*    "dotnet-test-nunit": "3.4.0-beta-2",
  },

  "frameworks": {
    "netcoreapp1.0": {
      "imports": "dnxcore50"
    }
  }
}

Ein beispielhafter NUnit Test:

using NUnit.Framework;

namespace netcore.nunit
{
    [TestFixture]
    public class BeispielTests
    {
        [Test]
        public void Adding_2_and_3_yields_5() {
            Assert.That(new Beispiel().Add(2, 3), Is.EqualTo(5));
        }
    }
}

Die NUnit Tests werden innerhalb von Visual Studio mit dem integrierten Testrunner ausgeführt. Ferner können sie auf der Konsole ausgeführt werden mit folgendem Befehl:

dotnet test

Fazit

Unit Tests mit .NET Core sind möglich, erfordern aber zur Zeit noch etwas Handarbeit. Bitte lassen Sie sich dadurch weder von .NET Core noch von automatisierten Tests abhalten. Tests sind Stand der Technik und gehören unverbrüchlich zur Softwareentwicklung!

Diesen Beitrag werde ich aktualisieren, sobald es Neues zum Thema Testen mit .NET Core gibt. Gerne können Sie Ihre Erfahrung sowie Tipps unten in den Kommentaren teilen.

 

 

Schreibe einen Kommentar