Share via


Entwickeln von Tests aus einem Modell

In Microsoft Visual Studio Ultimate können Sie mithilfe von Anforderungen und architektonischen Modellen Tests des Systems und seiner Komponenten organisieren. Durch diese Vorgehensweise können Sie sicherstellen, dass die Anforderungen, die für die Benutzer und andere Projektbeteiligte wichtig sind, getestet werden. Außerdem können Sie dadurch die Tests schneller aktualisieren, wenn sich die Anforderungen ändern. Wenn Sie Microsoft Test-Manager verwenden, können Sie auch Links zwischen den Modellen und den Tests verwalten.

System- und Subsystemtests

Systemtests, die auch als Akzeptanztests bezeichnet wurden, sind Tests, bei denen geprüft wird, ob die Anforderungen der Benutzer erfüllt werden. Bei diesen Tests geht es um das von außen sichtbare Verhalten des Systems und nicht um den innere Entwurf.

Systemtests sind für die Erweiterung oder den Neuentwurf eines Systems äußerst nützlich. Durch diese Tests können Sie vermeiden, dass bei einer Änderung des Codes Probleme eingeführt werden.

Wenn Sie eine Änderung oder Erweiterung eines Systems planen, ist es hilfreich, zunächst mit einer Reihe von Systemtests zu beginnen, die Sie für das bestehende System ausführen. Anschließend können Sie die Tests erweitern oder anpassen, um die neuen Anforderungen zu testen, die Änderungen am Code vornehmen und anschließend alle Tests erneut durchführen.

Wenn Sie ein neues System entwickeln, können Sie bereits bei Beginn der Entwicklung Tests erstellen. Indem Sie Tests definieren, bevor die einzelnen Funktionen entwickelt werden, können Sie die Anforderungsdiskussion auf sehr spezifische Weise festhalten.

Subsystemtests wenden die gleichen Prinzipien auf die Hauptkomponenten eines Systems an. Jede Komponente wird unabhängig von den anderen Komponenten getestet. Subsystemtests konzentrieren sich auf das Verhalten, das in den Benutzeroberflächen oder der API der Komponente sichtbar wird.

Weitere Informationen zum Ausführen von Tests finden Sie unter Testen der Anwendung.

Ableiten von Systemtests aus einem Anforderungsmodell

Sie können eine Beziehung zwischen Systemtests und einem Anforderungsmodell erstellen und aufrechterhalten. Zum Erstellen dieser Beziehung schreiben Sie Tests, die den Hauptelementen des Anforderungsmodells entsprechen. Visual Studio Ultimate ermöglicht das Erstellen von Links zwischen den Tests und Teilen des Modells, sodass diese Beziehung leicht aufrechterhalten werden kann. Weitere Informationen über Anforderungsmodelle finden Sie unter Modellieren von Benutzeranforderungen.

Schreiben von Tests für die einzelnen Anwendungsfälle

Wenn Sie Microsoft Test-Manager verwenden, können Sie eine Gruppe von Tests für jeden Anwendungsfall erstellen, den Sie im Anforderungsmodell definiert haben. Wenn Sie zum Beispiel über den Anwendungsfall verfügen, bei dem ein Gericht bestellt wird (Order a Meal) und der die Fälle zum Erstellen der Bestellung (Create Order) und Hinzufügen von Gerichten zur Bestellung (Add Item to Order) beinhaltet, können Sie sowohl Tests für den gesamten Anwendungsfall als auch für die spezielleren dieser Anwendungsfälle erstellen. Weitere Informationen über Anwendungsfälle finden Sie unter UML-Anwendungsfalldiagramme: Richtlinien.

Die folgenden Richtlinien können hilfreich sein:

  • Jeder Anwendungsfall sollte über mehrere Tests verfügen, für Hauptzweige und Ausnahmeergebnisse.

  • Wenn Sie einen Anwendungsfall im Anforderungsmodell beschreiben, ist es wichtiger, seine Nachbedingung zu definieren (d. h. das Ziel, das erreicht wird), als detailliert die Prozeduren zu beschreiben, die vom Benutzer ausgeführt werden, um das Ziel zu erreichen. So kann zum Beispiel die Nachbedingung für die Bestellung eines Gerichts (Order a Meal) sein, dass das Restaurant ein Gericht für einen Kunden (Customer) zubereitet und dass der Kunde bezahlt hat. Die Nachbedingung ist das Kriterium, das durch die Tests überprüft werden sollte.

  • Basieren Sie verschiedene Tests auf den unterschiedlichen Klauseln der Nachbedingung. Erstellen Sie zum Beispiel verschiedene Tests für die Benachrichtigung des Restaurants über die Bestellung oder das Entgegennehmen der Zahlung vom Kunden. Diese Trennung bietet die folgenden Vorteile:

    • Änderungen in verschiedenen Aspekten der Anforderungen treten häufig unabhängig voneinander auf. Indem Sie die Tests auf diese Weise in verschiedene Aspekte unterteilen, können die Tests einfacher aktualisiert werden, wenn sich die Anforderungen ändern.

    • Wenn der Entwicklungsplan einen Aspekt des Anwendungsfalls vor einem anderen implementiert, können Sie die Tests bei Fortschreiten der Entwicklung getrennt aktivieren.

  • Wenn Sie die Tests entwerfen, trennen Sie die Auswahl der Testdaten vom Code oder Skript, mit dem ermittelt wird, ob die Nachbedingung erreicht wurde. Ein Test einer einfachen arithmetischen Funktion kann z. B. wie folgt lauten: Eingabe ist 4; überprüfe, ob die Ausgabe 2 ist. Entwerfen Sie das Skript stattdessen wie folgt: Wähle Eingabe aus; multipliziere die Ausgabe mit sich selbst, und überprüfe, ob das Ergebnis die ursprüngliche Eingabe ist. Anhand dieses Formats können Sie die Testeingaben variieren, ohne den Haupttext des Tests ändern zu müssen.

Verknüpfen von Tests mit Anwendungsfällen

Wenn Sie Test Manager zum Entwerfen und Ausführen von Tests verwenden, können Sie die Tests unter den Arbeitsaufgaben "Anforderung", "Anwendungsfall" oder "User Story" organisieren. Sie können diese Arbeitsaufgaben mit Anwendungsfällen im Modell verknüpfen. Dies ermöglicht Ihnen, Änderungen der Anforderungen schnell für die Tests zu übernehmen, und unterstützt Sie dabei, den Status der einzelnen Anwendungsfälle zu verfolgen.

So verknüpfen Sie Tests mit einem Anwendungsfall

  1. Erstellen Sie in Test Manager eine Anforderung, und basieren Sie eine Testsammlung darauf. Informationen hierzu finden Sie unter [veraltet] Erstellen eines Tests für Product Backlog Items, User Stories oder Anforderungen.

    Die von Ihnen erstellte Anforderung ist eine Arbeitsaufgabe in Team Foundation Server. Dabei kann es sich um einen Benutzertextabschnitt, eine Anforderung oder einen Anwendungsfall handeln, abhängig von der Prozessvorlage, die das Projekt mit Team Foundation verwendet. Weitere Informationen finden Sie unter Nachverfolgen der Arbeit mit Visual Studio ALM und TFS.

  2. Verknüpfen Sie die Anforderungsarbeitsaufgabe zu einem oder mehreren Anwendungsfällen im Modell.

    Klicken Sie in einem Anwendungsfalldiagramm mit der rechten Maustaste auf einen Anwendungsfall, und klicken Sie dann auf Mit Arbeitsaufgabe verknüpfen. Weitere Informationen finden Sie unter Verknüpfen von Modellelementen und Arbeitsaufgaben.

  3. Fügen Sie der Testsammlung Testsituationen hinzu, mit denen die Anwendungsfälle überprüft werden.

Normalerweise ist jede Benutzertextabschnitt- oder Anforderungsarbeitsaufgabe im Modell mit mehreren Anwendungsfällen verknüpft, und jeder Anwendungsfall ist mit mehreren Benutzertextabschnitten oder Anforderungen verknüpft. Dies liegt daran, dass jeder Benutzertextabschnitt oder jede Anforderung eine Reihe von Aufgaben abdeckt, die zu verschiedenen Anwendungsfällen führen. In einer frühen Iteration des Projekts können Sie z. B. den grundlegenden Benutzertextabschnitt entwickeln, in dem ein Kunde Elemente aus einem Katalog auswählen und bestellen kann. In einer späteren Iteration könnte der Textabschnitt lauten, dass der Benutzer beim Abschließen der Bestellung bezahlt und dass der Lieferant das Geld empfängt, nachdem er die Ware gesendet hat. Jeder Textabschnitt fügt der Nachbedingung des Anwendungsfalls Warenbestellung (Order Goods) eine Klausel hinzu.

Sie können separate Links von den Anforderungen zu den Klauseln der Nachbedingung erstellen, indem Sie diese Klauseln in separate Kommentare im Anwendungsfalldiagramm schreiben. Sie können jeden Kommentar mit einer Anforderungsarbeitsaufgabe und den Kommentar mit dem Anwendungsfall im Diagramm verknüpfen.

Verwenden von Anforderungstypen als Testgrundlage

Die Typen eines Anforderungsmodells, d. h. die Klassen, Schnittstellen und Enumerationen, beschreiben die Konzepte und die Beziehungen im Hinblick darauf, wie Benutzer über ihr Geschäft denken und kommunizieren. Es schließt Typen aus, die nur den inneren Entwurf des Systems behandeln.

Entwerfen Sie die Tests im Hinblick auf diese Anforderungstypen. Auf diese Weise stellen Sie sicher, dass bei einer Diskussion über die Änderung der Anforderungen diese Änderungen auf einfache Weise mit den notwendigen Änderungen an den Tests verknüpft werden können. Hierdurch wird ermöglicht, die Tests und ihre beabsichtigten Ergebnisse direkt mit Endbenutzern und anderen Projektbeteiligten zu besprechen. Dies bedeutet, dass die Anforderungen der Benutzer außerhalb des Entwicklungsprozesses beibehalten werden können, und es wird vermieden, dass Tests versehentlich um mögliche Fehler im Entwurf entworfen werden.

Diese Vorgehensweise bedeutet für manuelle Tests, dass das Vokabular des Anforderungsmodells in den Testskripts beachtet wird. Für automatisierte Tests bedeutet diese Vorgehensweise, dass Anforderungsklassendiagramme als Grundlage für den Testcode verwendet werden und dass Accessor- und Aktualisierungsfunktionen erstellt werden, um das Anforderungsmodell mit dem Code zu verknüpfen.

Ein Anforderungsmodell kann z. B. die Typen Speisekarte (Menu), Gericht (Menu Item) und Bestellung (Order) sowie Zuordnungen zwischen ihnen umfassen. Dieses Modell stellt die Informationen dar, die vom Mahlzeiten-Bestellsystem gespeichert und verarbeitet werden, aber nicht die Komplexität seiner Implementierung. Im laufenden System kann jeder Typ über mehrere Umsetzungen verfügen, z. B. in Datenbanken, in Benutzeroberflächen und in APIs. In einem verteilten System können mehrere Varianten der einzelnen Instanzen gleichzeitig in verschiedenen Teilen des Systems gespeichert sein.

Um einen Anwendungsfall wie z. B. Add Item to Order zu testen, kann der Code einer Testmethode beispielsweise wie folgt aussehen:

Order order = … ; // set up an order
// Store prior state:
int countBefore = order.MenuItems.Count; 
// Perform use case:
MenuItem chosenItem = …; // choose an item
AddItemToOrder (chosenItem, order); 
// Verify part of postcondition:
int countAfter = order.MenuItems.Count;
Assert (countAfter == countBefore = 1); 

Beachten Sie, dass diese Testmethode die Klassen des Anforderungsmodells verwendet. Zuordnungen und Attribute werden als .NET-Eigenschaften realisiert.

Damit dies funktioniert, müssen die Eigenschaften der Klassen als schreibgeschützte Funktionen oder Accessoren definiert werden, die auf das System zugreifen, um Informationen über seinen aktuellen Zustand abzurufen. Methoden, die Anwendungsfälle wie AddItemToOrder simulieren, müssen das System durch seine API oder durch eine Ebene unterhalb seiner Benutzeroberfläche leiten. Die Konstruktoren von Testobjekten wie Order und MenuItem müssen das System ebenfalls leiten, um entsprechende Elemente im System zu erstellen.

Viele der Accessoren und Aktualisierungen sind bereits durch die normale API der Anwendung verfügbar. Einige zusätzliche Funktionen müssen ggf. jedoch geschrieben werden, um die Tests zu aktivieren. Diese zusätzlichen Accessoren und Aktualisierungen werden manchmal als 'Testinstrumentation' bezeichnet. Da sie vom inneren Entwurf des Systems abhängen, müssen sie von den Systementwicklern zur Verfügung gestellt werden, wohingegen die Tester den Code für die Tests im Hinblick auf das Anforderungsmodell schreiben.

Wenn Sie automatisierte Tests schreiben, können Sie die Accessoren und Aktualisierungen mithilfe von generischen Tests einbinden. Weitere Informationen finden Sie unter Erstellen eines automatisierten Tests, der eine ausführbare Datei ausführt, mithilfe generischer Tests.

Tests für Geschäftsregeln

Einige Anforderungen beziehen sich nicht direkt auf einen bestimmten Anwendungsfall. Das DinnerNow-Geschäft ermöglicht seinen Kunden zum Beispiel, aus vielen Speisekarten (Menus) auszuwählen, wobei die für jede Bestellung (Order) ausgewählten Gerichte (Items) jedoch von einer einzigen Speisekarte (Menus) stammen müssen. Diese Geschäftsregel kann als unveränderlich hinsichtlich der Zuordnungen zwischen Bestellungen (Orders), Speisekarten (Menus) und Gerichten (Items) im Anforderungsklassenmodell ausgedrückt werden.

Eine unveränderliche Regel dieser Art regelt nicht nur alle aktuell definierten Anwendungsfälle, sondern auch alle anderen, später definierten Anwendungsfälle. Daher ist es nützlich, sie unabhängig von einem Anwendungsfall zu schreiben und unabhängig von den Anwendungsfällen zu testen.

Sie können eine unveränderliche Geschäftsregel als Kommentar in einem Klassendiagramm schreiben. Weitere Informationen finden Sie unter UML-Klassendiagramme: Richtlinien.

Sie können Tests mit einer Geschäftsregel verknüpfen, indem Sie den Kommentar mit einer Anforderungs- oder einer Benutzertextabschnitts-Arbeitsaufgabe verknüpfen, die Sie in Test Manager mit einer Testsammlung verknüpfen können. Weitere Informationen finden Sie unter Anfügen von Testsituationen an Modellelemente.

Leistung und andere Servicequalitätsanforderungen können in Kommentare in Anwendungsfall-, Aktivitäts- oder Sequenzdiagrammen eingefügt werden. Sie können diese auch mit Anforderungsarbeitsaufgaben und ihren Testsammlungen verknüpfen.

Sequenz- und Aktivitätsdiagramme für Tests

Wenn die Anforderungen oder Architekturmodelle Sequenz- oder Aktivitätsdiagramme einschließen, können Sie Tests schreiben, die den Diagrammen direkt folgen.

In einigen Fällen ist es nützlich, Tests zu entwerfen, die dynamisch verschiedene Pfade durch die Verzweigungen und die Schleifen des Diagramms wählen.

Versuchen Sie, nach jeder Meldung oder Aktion den Zustand des Systems zu überprüfen. Dies kann zusätzliche Instrumentation erfordern.

Ableiten von Subsystemtests aus Modellen

Beim allgemeinen Entwurf eines großen Systems können Sie Komponenten oder Subsysteme unterscheiden. Hierbei handelt es sich um Teile, die getrennt entworfen werden können, die sich auf verschiedenen Computern befinden oder die wiederverwendbare Module sind, die auf verschiedene Weise kombiniert werden können. Weitere Informationen finden Sie unter UML-Komponentendiagramme: Richtlinien.

Sie können die gleichen Prinzipien, die Sie auf das gesamte System anwenden, auch auf jede Hauptkomponente anwenden. In einem großen Projekt kann jede Komponente über ein eigenes Anforderungsmodell verfügen. In kleineren Projekten kann ein Architekturmodell oder allgemeiner Entwurf erstellt werden, um die Hauptkomponenten und ihre Interaktion zu zeigen. Weitere Informationen finden Sie unter Modellieren der Architektur eines Softwaresystems.

In beiden Fällen können Sie eine Beziehung zwischen den Modellelementen und den Subsystemtests auf die gleiche Weise erstellen wie zwischen dem Anforderungsmodell und den Systemtests.

Isolieren von Komponenten mit bereitgestellten und erforderlichen Schnittstellen

Es ist nützlich, alle Abhängigkeiten zu identifizieren, über die eine Komponente in Bezug auf andere Teile des Systems oder externe Dienste verfügt, und diese als erforderliche Schnittstellen darzustellen. Dieses Vorgehen führt in der Regel zu einer Entwurfsüberarbeitung, wodurch die Komponente mehr vom übrigen Entwurf abgekoppelt und einfacher davon zu trennen ist.

Ein Vorteil dieser Entkopplung liegt darin, dass die Komponente zum Testen ausgeführt werden kann, indem die normalerweise von der Komponente verwendeten Dienste durch Pseudoobjekte ersetzt werden. Dies sind Komponenten, die zu Testzwecken eingerichtet werden. Eine Pseudokomponente stellt die von der Komponente geforderte Schnittstelle bereit und reagiert mit simulierten Daten auf Abfragen. Die Pseudokomponenten sind Teil einer vollständigen Testumgebung, die Sie mit allen Schnittstellen der Komponente verbinden können.

Ein Vorteil von Pseudotests liegt darin, dass die Komponente entwickelt werden kann, während andere Komponenten, deren Dienste diese Komponente verwendet, sich ebenfalls noch in der Entwicklung befinden.

Beibehalten der Beziehungen zwischen Tests und Modell

Bei einem typischen Projekt, das alle paar Wochen eine Iteration erfordert, wird kurz vor Beginn jeder Iteration eine Anforderungsüberprüfung durchgeführt. Bei dieser Besprechung werden die Funktionen diskutiert, die in der nächsten Iteration bereitgestellt werden sollen. Ein Anforderungsmodell kann hierbei hilfreich sein, um die Konzepte, Szenarios und Aktionsfolgen zu erläutern, die entwickelt werden. Die Geschäftsprojektbeteiligten legen Prioritäten fest, die Entwickler geben Schätzungen ab, und die Tester stellen sicher, dass das erwartete Verhalten jeder Funktion ordnungsgemäß festgehalten wird.

Tests zu schreiben ist die effektivste Möglichkeit, eine Anforderung zu definieren, und ist ebenfalls eine effektive Möglichkeit, um sicherzustellen, dass eine Person genau versteht, was erforderlich ist. Das Schreiben von Tests nimmt während eines Spezifizierungsworkshops jedoch zu viel Zeit in Anspruch, und das Erstellen von Modellen geht viel schneller vonstatten.

Vom Standpunkt eines Testers aus ist ein Anforderungsmodell wie ein Stenogramm für die Tests. Daher ist es wichtig, die Beziehung zwischen Tests und Modell innerhalb des Projekts beizubehalten.

Anfügen von Testsituationen an Modellelemente

Wenn das Projekt Test Manager verwendet, können Sie Tests mit den Elementen im Modell verknüpfen. Auf diese Weise können Sie schnell die Tests ermitteln, die von einer Änderung der Anforderungen betroffen sind, und Sie können das Ausmaß, in dem eine Anforderung erfüllt wurde, einfacher nachverfolgen.

Sie können Tests mit allen Arten von Elementen verknüpfen. Hier einige Beispiele:

  • Verknüpfen Sie einen Anwendungsfall mit den Tests, die ihn prüfen.

  • Schreiben Sie die Klauseln einer Anwendungsfall-Nachbedingung, oder des Ziels, in Kommentare, die mit dem Anwendungsfall verknüpft sind, und verknüpfen Sie dann Tests mit den einzelnen Kommentaren.

  • Schreiben Sie unveränderliche Regeln in Kommentare in Klassendiagrammen oder Aktivitätsdiagrammen, und verknüpfen Sie sie mit Tests.

  • Verknüpfen Sie Tests mit einem Aktivitätsdiagramm oder mit einzelnen Aktivitäten.

  • Verknüpfen Sie eine Testsammlung mit der Komponente oder dem Subsystem, das sie testet.

So verknüpfen Sie Tests mit einem Modellelement oder einer Beziehung

  1. Erstellen Sie in Test Manager eine Anforderung, und basieren Sie eine Testsammlung darauf. Informationen hierzu finden Sie unter [veraltet] Erstellen eines Tests für Product Backlog Items, User Stories oder Anforderungen.

    Die von Ihnen erstellte Anforderung ist eine Arbeitsaufgabe in Team Foundation Server. Dabei kann es sich um einen Benutzertextabschnitt, eine Anforderung oder einen Anwendungsfall handeln, abhängig von der Prozessvorlage, die das Projekt mit Team Foundation verwendet. Weitere Informationen finden Sie unter Nachverfolgen der Arbeit mit Visual Studio ALM und TFS.

  2. Verknüpfen Sie die Anforderungsarbeitsaufgabe mit einem oder mehreren Elementen im Modell.

    Klicken Sie in einem Modellierungsdiagramm mit der rechten Maustaste auf ein Element, einen Kommentar oder eine Beziehung, und klicken Sie dann auf Mit Arbeitsaufgabe verknüpfen. Weitere Informationen finden Sie unter Verknüpfen von Modellelementen und Arbeitsaufgaben.

  3. Fügen Sie der Testsammlung Testsituationen hinzu, die die im Modellelement ausgedrückte Anforderung überprüfen.

Siehe auch

Konzepte

Entwickeln von Modellen für den Softwareentwurf

Modellieren von Benutzeranforderungen

Modellieren der Architektur eines Softwaresystems

Modellieren der Anwendung