2016-07-20 21 views
0

Mir ist bewusst, dass Komponententests vollständig unabhängig voneinander sein sollten, was bedeutet, dass die Reihenfolge der Operationen nie wichtig sein sollte.Unit Testing und Isolation

Wie gehen Sie mit einem Szenario um, bei dem Sie einen Test durchführen, der ein großes Dokument über das Netzwerk lädt, aber andere Tests benötigt, um Informationen zu diesem Dokument zu verifizieren?

Ich möchte nicht, dass das Dokument für jeden Test angefordert wird, der dies oder das überprüfen muss.

Es funktioniert einwandfrei, wenn das Dokument als ein statisches Mitglied der Testklasse und der erste Test gespeichert wird, der es zuerst abruft. Dann können die nachfolgenden Tests ihre eigene Sache mit der zwischengespeicherten Kopie machen.

Aber wieder ist Reihenfolge der Operationen mit Komponententests falsch, da sie unabhängig sein sollten.

Was ist die beste Vorgehensweise in diesem Fall? Ich würde es vorziehen, sie alle als separate Tests zu haben und nicht zu einem einzigen, großen Test zusammenzufassen, der alle möglichen Dinge über das Dokument, nachdem es abgerufen wurde, behaupten kann.

Mein aktuelles Szenario ist Visual Studio 2015 Update 3 und C#, aber ich denke, es kann auf jedes ähnliche Setup angewendet werden.

In Visual Studio Test Runner können Sie "Wiedergabelisten" einrichten, mit denen Sie sie in einer Reihenfolge ausführen können, aber es fühlt sich immer noch falsch an.

Bearbeiten: Ich bin auf den statischen Ansatz gelehnt, in diesem Fall muss jeder Test das Dokument über eine einzige Methode erhalten. Ich denke, ein Singleton-Ansatz (wenn Null, geh und hol es, sonst gib es zurück).

Aber jede Rückmeldung ist gut.

+0

Sie können einmalige Einrichtungslogik in einem Verfahren mit 'markiert put [TestInitialize]' 'von Microsoft.VisualStudio.TestTools.UnitTesting' – Brian

+1

@ Brian TestInitialize pro Test-Methode aufgerufen wird –

+0

Warum brauchen Sie diese Ressource erhalten aus der entfernte Standort? Das macht die Tests abhängig von dem, was dort läuft. – Sign

Antwort

3

Die beste Option ist das Dokument nicht über das Netzwerk holen, bundle it as part of the test payload.

aber sagen, dass, wenn Sie eine Zeitlogik benötigen, die beim Start passiert man einen [AssemblyInitialize] zu einem Test hinzufügen können, die einmal ausgeführt werden soll, wenn Die Testbaugruppe ist geladen. Sie können dort Ihre Testkonfiguration durchführen.

[TestClass] 
public class GlobalTestData 
{ 
    private static byte[] _document; 

    public static byte[] Document 
    { 
     get 
     { 
      return (byte[])_document.Clone(); 
     } 
    } 

    [AssemblyInitialize()] 
    public static void DownloadDocument(TestContext context) 
    { 
     _document = DownloadDocument(); 
    } 

    private static byte[] DownloadDocument() 
    { 
     //... 
    } 
} 

werfen einfach, dass oben Klasse in Ihrem Projekt dann kann jeder Test GlobalTestData.Document verwenden und eine frische unveränderte Kopie des byte [] erhalten.

1

Unit Tests testen Dinge isoliert. Wenn Sie Ihr Dokument über eine Netzwerkverbindung abrufen, ist es nicht isoliert. Versuchen Sie, das Bereitstellen des Dokuments zu verspotten.

Sie das Dokument auch einmal in einer [TestInitialize] Methode von Brian in den Kommentaren oder in einer [ClassInitialize] statischen Methode und speichern sie in einer lokalen Variablen, wobei der Unterschied darin, dass TestInitialize läuft vor jedem Test und ClassInitialize nur wie vorgeschlagen holen konnte, bevor die Der erste Test wird ausgeführt.

UPDATE:

Wenn Sie das richtige Dokument für Ihre Tests benötigen, sind Sie bei Integrationstests suchen. Integrationstests sind meines Erachtens völlig in Ordnung, um voneinander abhängig zu sein, wenn sie das richtige Verhalten prüfen, wenn mehrere Systeme zusammenarbeiten müssen. Stellen Sie nur sicher, dass sie nicht in der gleichen Klasse wie Ihre Komponententests sind, da diese schnell und unabhängig ausgeführt werden sollten.

+0

Danke, ich schaue mir sowohl 'ClassInitialize' als auch' AssemblyInitialize' an, um zu sehen, was hier die beste Idee ist. Das Problem ist, dass dieses Dokument von einem Drittanbieter erstellt wird, und ich Dinge wie Struktur, Größe, erwartete Daten usw. überprüfen muss. Die Struktur ist nicht unter meiner Kontrolle, so dass die Mocks passieren können, aber der Code wird fehlschlagen. – Patrick