2017-03-03 4 views
0

Ich bin derzeit IAnnotationTransformer mit allen Tests in einer XML aufgeführt auszuschließen, die eine bestimmte Zeichenfolge im Namen enthält, zum Beispiel:Wie bekomme ich alle Methoden, die von einer testMethode aufgerufen werden? (Java, TestNG, IAnnotationTransformer)

@Override 
@SuppressWarnings("rawtypes") 
public void transform(ITestAnnotation annotation, Class testClass, Constructor testConstructor, Method testMethod) { 
    if(testMethod.getName().contains("StringGoesHere")){ 
      annotation.setEnabled(false); 
     } 

Diese sehr gut funktioniert, aber aufgrund Die Namenskonvention meiner Tests und die große Menge an Tests, die ich ausschließen muss, wäre die ideale Lösung, um den Test auszuschließen, wenn er eine bestimmte Methode anfordert. Zum Beispiel möchte ich alle Tests auszuschließen, die auf die Methode .clickUserSettings() aufrufen, unten gezeigt:

@Test 
public void editUserDetailsOnStackOverflow() { 
    final StackOverflow so = stackOverflow.loginAsMe() 
      .clickUserSettings() 
      .changeUserEmail() 
      .clickSave() 
      .assertChangeSuccessful(); 
} 

Wer weiß, wie ich vielleicht in der Lage sein, dies zu erreichen? Ich habe das Gefühl, dass ich alle anderen Möglichkeiten (Klassen, Pakete, Testmethoden, Gruppen, XML usw.) erforscht habe. Der Grund dafür ist, dass ich derzeit 40.000 Tests habe (15.000 davon werden wahrscheinlich ausgeschlossen sein) diese auf der browserMode Variable durch den Tester gesetzt) ​​ist die allgemeine Idee, die ich hatte gehofft, zu erreichen: Wenn

@Override 
@SuppressWarnings("rawtypes") 
public void transform(ITestAnnotation annotation, Class testClass, Constructor testConstructor, Method testMethod) { 
    if(testMethod.getAllCalledMethods.contains(".clickUserSettings()")){ 
      annotation.setEnabled(false); 
     } 

dies getan werden kann, es ist mein Problem zu lösen,

Prost

+1

Warum Gruppen nicht für den Zweck geeignet sind? –

+0

Nun - nichts aus der Box wird Ihnen das geben. Erwägen Sie, ein externes Skript zu schreiben, das als Pre-Test-Sache oder als Vorversion ausgeführt wird - generiert eine Liste dieser Methoden, die Sie in Ihrem Annotation-Transformer deaktivieren können. Einige Möglichkeiten: http: //stackoverflow.com/questions/930289/how-can-i-find-all-the-methods-that-call-a-given-method-in-java. Sie können ein Grep in den Dateien oder eine schnelle Schleife Ihrer eingeschlossenen Tests machen, um an einige Lösungen zu denken –

Antwort

0

Dies ist nicht möglich mit TestNG. TestNG hat nur Sichtbarkeit für die Methoden, die mit seinen Anmerkungen versehen sind, und erkennt nicht den Codepfad, den eine TestNG-Methode während des Ausführungsverlaufs durchläuft. [Hier gehe ich davon aus, dass das Verfahren clickUserSettings() ist ein Dienstprogramm-Methode, die Ihre @Test Methoden vielleicht in im Rahmen seiner Ausführung aufrufen,]

So haben Sie ein paar Optionen

  1. Resort zur Verwendung von Gruppen, in denen alle Methoden, die als Teil einer bestimmten Gruppe in clickUserSettings() aufrufen und dann diese Gruppe von der Ausführung ausschließen.
  2. Erstellen Sie Ihre eigene benutzerdefinierte Annotation, kommentieren Sie alle Methoden, die clickUserSettings() mit dieser Annotation aufrufen, und ändern Sie dann Ihre aktuelle AnnotationTransformer, um nach dieser Annotation entweder auf Methoden- oder Klassenebene zu suchen.
Verwandte Themen