2017-11-23 5 views
0

Ich habe eine Klasse mit mehreren @ Test-Methoden mit jeweils unterschiedlicher Funktionalität.So führen Sie bedingte TestNG-Tests mit Daten aus Excel aus

Ich folge dem datengesteuerten Ansatz, wo ich die Daten in Excel habe. Jede Zeile in Excel-Tabelle entspricht einem anderen Testfall, der die Testmethoden in der obigen Klasse ausführen sollte.

Unten sind die Beispieldaten aus Excel-Tabelle, die den Methodennamen als einen der Parameter enthält (zB: test1, test2) und auch ein Flag, das bestimmt, ob der Fall zur Laufzeit oder nicht zur Laufzeit abgeholt werden soll : y, n)

case1 data1 data2 data3........test1 y 
case2 data4 data5 data6........test1 y 
case3 data7 data8 data9........test2 y 
case4 data10 data11 data12........test1 n 

Im Folgenden sind die Fragen, die ich habe:

  1. Wie die Fälle mit entsprechenden Prüfverfahren zur Karte
  2. Wie man laufen die spezifischen Fälle basiert auf der Flagge

Mein Verständnis ist, dass DataProvider- Anmerkung verwenden, ein Testverfahren mit unterschiedlichen Eingangsdaten ausgeführt werden können. Ich bin mir jedoch nicht sicher, wie man die Testmethoden mit entsprechenden Testdaten abbildet, wenn mehrere Testmethoden in einer einzelnen Klasse existieren.

Ich habe auch versucht, IAnnotationTransformer zu suchen, der verwendet werden kann, um das Laufzeitverhalten der Testmethode zu ändern, aber konnte keine Möglichkeit finden, die Flagdaten von Excel an die Transformatorklasse zu senden.

Vielen Dank im Voraus ..

Antwort

0

Es gibt Stücke, wie dies getan werden kann, was Sie tun können, aber es ist von Ihrer Seite gehen zu vieler Anpassung erfordern. Es gibt nichts in TestNG, das Ihnen diese Art von Funktionen sofort zur Verfügung stellt.

IAnnotationTransformer wird Ihnen nicht helfen, weil dieser Listener nur Methoden berücksichtigt und die Instanzen nicht kennt. Es läuft auch bevor irgendwas läuft und es gibt keine Möglichkeit, wie man es iterieren lassen kann. Das kann also ausgeschlossen werden.

Ihre beste Wette wäre ein @Factory und ein @DataProvider zu verwenden, wobei die @FactoryNUR eine Instanz Ihrer Testklasse produzieren und alle Ihre Testmethoden müssen zwingend Teil der gleichen Testklasse sein.

Hier ist die Idee:

  • eine zusätzliche Spalte in der Datenquelle erstellen, die die Klasse darstellt, die im Grunde die Datenquelle verbrauchen sollte.
  • Erstellen Sie einen Datenanbieter, der die obige Datenquelle liest und alle Zeilen filtert, deren vollständig qualifizierte Klassennamen mit der umschließenden Klasse des aktuellen Datenproviders übereinstimmen.
  • Der Datenprovider sollte auch so erstellt werden, dass er eine Zuordnung erstellt (Schlüssel ist Name und Wert der Testmethode ist eine Liste von Werten, die für verschiedene Iterationen verwendet werden sollen).
  • Sobald alle gefilterten Zeilen vorhanden sind, wird nur eine Zeile mit Testdaten erstellt, sodass TestNG nur eine Testklasseninstanz erstellt.
  • Lassen Sie Ihre Testklasse auch die Schnittstelle IHookable implementieren, damit Sie entscheiden können, welche Testmethode ausgeführt werden soll und welche übersprungen werden kann.
  • Jetzt, wenn eine Methode die Prüfung der Ausführung erfüllt, haben Sie im Grunde die Testmethode Schleife durch alle Testdaten hat es (also immer 1 Testmethode wird in einer Schleife für alle seine Daten im Gegensatz zu einem Datenanbieter Setup ausgeführt wobei TestNG dies automatisch für Sie tut), und Sie verwenden weiche Anweisungen, um alle Validierungen zu bestätigen. Auf diese Weise wird Ihr Test bestanden/nicht bestanden, nachdem alle Iterationen durchgeführt wurden.

Hier ist ein Beispiel, das einige davon in Aktion zeigt.

import org.testng.IHookCallBack; 
import org.testng.IHookable; 
import org.testng.ITestResult; 
import org.testng.annotations.DataProvider; 
import org.testng.annotations.Factory; 
import org.testng.annotations.Test; 

import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.List; 

public class TestclassSample implements IHookable { 

    private List<String> methodsToRun = new ArrayList<>(); 

    @Factory(dataProvider = "dp") 
    public TestclassSample(List<String> methodsToRun) { 
     this.methodsToRun = methodsToRun; 
    } 

    @Override 
    public void run(IHookCallBack callBack, ITestResult testResult) { 
     String testMethodName = testResult.getMethod().getMethodName(); 
     if (methodsToRun.contains(testMethodName)) { 
      System.err.println("About to run " + testResult.getMethod().getMethodName()); 
      callBack.runTestMethod(testResult); 
     } else { 
      testResult.setStatus(ITestResult.SKIP); 
     } 
    } 

    @Test 
    public void testMethod() { 
     System.err.println("testMethod()"); 
    } 

    @Test 
    public void anotherTestMethod() { 
     System.err.println("anotherTestMethod()"); 
    } 

    @Test 
    public void thirdTestMethod() { 
     System.err.println("thirdTestMethod()"); 
    } 

    @DataProvider(name = "dp") 
    public static Object[][] getData() { 
     return new Object[][]{ 
       {Arrays.asList("testMethod", "thirdTestMethod")} 
     }; 
    } 
} 

Hier ist der Ausgang:

About to run testMethod 
testMethod() 
About to run thirdTestMethod 
thirdTestMethod() 

Test ignored. 

=============================================== 
Default Suite 
Total tests run: 3, Failures: 0, Skips: 1 
=============================================== 
+0

Vielen Dank für die Zeit nehmen und die Beantwortung. :) Ich arbeitete an einer anderen Aufgabe, weshalb ich keine Chance hatte, den Ansatz zu versuchen. Allerdings habe ich dies kürzlich für ein Beispielszenario überprüft und die Tests werden ausgeführt. Es gibt noch eine Sache, die ich möchte geklärt werden .. Wenn ich die gleiche Testmethode mit anderen Datensätzen verifiziert, wird Bericht für die Methode nur für 1 Instanz generiert. Ich würde gerne wissen, ob es einen Weg gibt, so dass die Details für jede der Iterationen in dem generierten Standardbericht reflektiert werden. Wenn nicht, gibt es einen anderen besseren Ansatz? – user0450