„Publishing-Status“ im Content-Editor anzeigen

Anzeige der Warnung im Content-Editor

Standardmässig ist im Sitecore-Content-Editor nicht ersichtlich, welche Items bereits publiziert wurden und welche nicht. Mit ein wenig Programmieraufwand kann man jedoch übersichtliche Anzeigen erstellen, welche den „Publizierungs-Status“ für jedes Item direkt darstellen. Weiterlesen

Sitecore-Tasks automatisieren mit Sitecore PowerShell Console

Einleitung/Motivation

Sitecore PowerShell Console ist ein Sitecore-Modul aus dem Sitecore-Marketplace (Link zum Modul), welches eine PowerShell-Umgebung im Sitecore-Backend zur Verfügung stellt. Sitecore-Administratoren wird mit dem Modul ein mächtiges Werkzeug in die Hand gelegt, um beispielsweise Aufgaben zu automatisieren, die „von Hand“ mühsam durchzuführen wären. (mehr …)

„Unit-Testing“ mit Sitecore

Viele Software-Entwickler dürften mittlerweile um die Wichtigkeit und Nützlichkeit von Unit-Tests Bescheid wissen. So erleichtert der Einsatz von Unit-Tests beispielsweise das Schreiben robuster und flexibler Software. Ausserdem dienen die Tests beim Refactoring als „Sicherheitsnetz“, um das „äussere Verhalten“ der Software nicht unbeabsichtigt abzuändern.

Allerdings bringt das Schreiben von Unit-Tests auch einiges an Mehraufwand mit sich und in gewissen Umgebungen scheint das Schreiben von Unit-Tests
sehr schwierig oder gar unmöglich zu sein. Gerade auch bei Web-Applikationen mit Sitecore scheint das Schreiben von Unit-Tests ein schwieriges Unterfangen zu sein, da die Sitecore-API „im Hintergrund“ auf Datenbanken zugreift und einen Web-Context voraussetzt.

In diesem Artikel wollen wir aufzeigen, wie man für Sitecore-Code mit einem pragmatischen Ansatz trotzdem relativ einfach automatisierte Tests schreiben kann.

Automatisierte Tests mit einem Web-Testrunner

Alistair Deneys hat eine sehr schöne Reihe von Posts zum Thema „Unit-Testing mit Sitecore“ veröffentlicht. Im Buch „Professional Sitecore Development“ wurde ausserdem ein ganzes Kapitel dem Thema „Testing“ gewidmet, welches ebenfalls von Deneys verfasst wurde. Deneys diskutiert in seinen Blogs und im Buch „Professional Sitecore Development“ verschiedene Möglichkeiten, um Code, der die Sitecore-API verwendet, testen zu können.

Ein sehr pragmatischer Ansatz, um Sitecore-Code zu testen, besteht darin, die Tests in einem Web-Testrunner im Sitecore-Context auszuführen. Mit dieser Technik bleibt das (teilweise mühsame und zeitaufwändige) Mocking von Datenbankzugriffen und dem Web-Context erspart. Wenn die Tests in einem Web-Testrunner ausgeführt werden, haben wir in den Tests vollen Zugriff auf die Sitecore-Datenbanken und den Web-Context.

Wenn wir Tests schreiben, die in einem Web-Testrunner ausgeführt werden, dürfen wir streng genommen allerdings nicht mehr von „Unit-Tests“ sprechen, sondern viel mehr von „automatisierten Tests“ (siehe Definition „Unit-Test“ von Roy Osherove).

Ein einfacher Web-Testrunner, welcher auf NUnit basiert, kann bei Deneys gratis heruntergeladen werden (Link Web-Testrunner). Bei dem Web-Testrunner handelt es sich im Wesentlichen um eine ASPX-Page, die in das Visual-Studio-Sitecore-Web-Projekt eingebunden werden kann. Im Code-Behind dieser ASPX-Page referenziert man dann die DLL des Testprojektes, in welchem sich die automatisierten Sitecore-Tests befinden.

Folgende Abbildung zeigt ein Beispiel des Web-Testrunners in Aktion (Quelle).

Ein einfaches Code-Beispiel

Deneys geht in seinen Posts auf verschiedene „Typen“ von Tests ein. Etwas vereinfacht können wir zwischen folgenden beiden Test-Typen unterscheiden:

  1. Testen von Präsentationskomponenten (Layouts, Sublayouts, Usercontrols, …)
  2. Testen von Code, der auf die Sitecore-API zugreift (beispielsweise Helper-Klassen, um Sitecore-Items zu bearbeiten/auszulesen/etc.)

Folgendes Listing zeigt ein einfaches Beispiel, wie ein Test für den Test-Typ 2 aussehen könnte.

[TestFixture]
[Category("Util Tests")]
public class TestClass
{
   private Item m_root, m_child1, m_child2, m_child3 = null;

   [SetUp]
   public void TestFixtureSetUp()
   {
      var home = Sitecore.Context.Database.GetItem("/sitecore/content/home");
      var template = Sitecore.Context.Database.Templates["User Defined/Page"];

      using (new SecurityDisabler())
      {
         m_root = home.Add("root", template);

         m_child1 = m_root.Add("Child 1", template);
         using(new EditContext(m_child1))
         {
            m_child1["title"] = "Child 1 Title";
         }

         m_child2 = m_root.Add("Child 2", template);
         m_child3 = m_root.Add("Child 3", template);
      }
   }

   [TearDown]
   public void TestFixtureTearDown()
   {
      using (new SecurityDisabler())
      {
         m_root.Delete();
      }
   }

   [Test]
   public void TitleNotEmptyTest()
   {
      string title = Util.GetTitle(m_child1);
      Assert.AreEqual("Child 1 Title", title);
   }

   [Test]
   public void TitleEmptyTest()
   {
      string title = Util.GetTitle(m_child2);
      Assert.AreEqual("", title);
   }
}

Der Code im obenstehenden Beispiel zeigt, wie wir in der Setup-Methode eine „Dummy-Item-Struktur“ für die Tests mit der Sitecore-API aufbauen. In der Teardown-Methode wird diese Dummy-Item-Struktur wieder gelöscht. In den Tests können wir diese Dummy-Items dann verwenden, um unseren Code (im obigen Beispiel die Methode GetTitle der (Helper-)Klasse Util) zu testen.

Fazit

In diesem Artikel haben wir gesehen, dass man mit einem pragmatischen Ansatz auch für Sitecore-Solutions relativ einfach automatisierte Tests schreiben kann. Die Tests werden dabei in einem Web-Testrunner im Sitecore-Context ausgeführt, wodurch wir in den Tests vollen Zugriff auf die Sitecore-Datenbanken und den Web-Context haben. Das zeitaufwändige Mocking von Datenbankzugriffen und dem Web-Context erübrigt sich durch das Ausführen der Tests in einem Web-Testrunner.