Testng: Vererbte Testmethoden erhalten kein erwartetes Gruppenverhalten

Erstellt am 1. März 2012  ·  8Kommentare  ·  Quelle: cbeust/testng

Betrachten Sie die folgenden Testklassen:

<strong i="6">@Test</strong>
public abstract class ParentTest {
    public void parentTestMethod() {
    }
}

@Test(groups = "myGroup")
public class ChildTest extends ParentTest {
    public void childTestMethod() {
    }
}

Beim Ausführen dieses Tests (ChildTest) würde ich erwarten, dass beide Testmethoden (childTestMethod und parentTestMethod) zur Gruppe 'myGroup' gehören. Anscheinend ist dies nicht das tatsächliche Verhalten (getestet mit Version 6.4).

Ich habe etwas Code zusammengestellt, um dieses Problem zu untersuchen:

TestNGMethodFinder testNGMethodFinder = new TestNGMethodFinder(new RunInfo(), new JDK15AnnotationFinder(new DefaultAnnotationTransformer()));
ITestNGMethod[] testMethods = testNGMethodFinder.getTestMethods(ChildTest.class, new XmlTest());
for (ITestNGMethod testMethod : testMethods) {
    String[] groups = testMethod.getGroups();
    System.out.println(testMethod + " groups:" + Arrays.toString(groups));
}

Ausgabe beim Ausführen dieses Codes:

ChildTest.childTestMethod()[pri:0, instance:null] groups:[myGroup]
ParentTest.parentTestMethod()[pri:0, instance:null] groups:[]

Ich habe mir den TestNG-Quellcode angesehen und es scheint, dass dieses Verhalten von der Methode org.testng.internal.BaseTestMethod#initGroups(Class>) stammt. Um genau zu sein, denke ich, dass die folgende Aussage die Ursache für dieses ziemlich seltsame Verhalten ist:

ITestOrConfiguration classAnnotation = (ITestOrConfiguration) getAnnotationFinder().findAnnotation(getMethod().getDeclaringClass(), annotationClass);

Um dieses Problem zu beheben, könnte diese Anweisung wie folgt geändert werden:

ITestOrConfiguration classAnnotation = (ITestOrConfiguration) getAnnotationFinder().findAnnotation(getInstance().getClass(), annotationClass);

aber ich bin mir nicht sicher, ob dies der richtige Weg wäre, um das Problem zu lösen. Auch keine eventuellen Auswirkungen....

groups inheritance

Alle 8 Kommentare

Ich sehe das Problem und dein Vorschlag funktioniert leider nicht ganz. Es ist etwas schwierig zu lösen, da Annotationen in der Init-Phase aufgelöst werden, was bedeutet, dass beim Parsen der Elements offensichtlich nichts darüber weiß, dass die

Cedric, vielen Dank für Ihr schnelles Feedback zu diesem Problem. Sie sagen "es ist ein bisschen schwierig zu lösen", heißt das, dass Sie nicht glauben, dass dieses Problem in naher Zukunft eine Chance hat, gelöst zu werden? Können Sie über mögliche Problemumgehungen nachdenken?

Was ich meinte war: Wenn die Gruppenauflösung durchgeführt wird, wurde noch keine Testklasse instanziiert. Wenn ich mir also parentTestMethod() ansehe, habe ich keine Instanz von ChildTest, mit der ich diese Methode in diese Gruppe einfügen könnte.

Die Gruppenauflösung ist rein statisch, während das obige Beispiel nur dynamisch aufgelöst werden kann.

Macht das Sinn?

Dieses Verhalten habe ich auch schon gesehen. Wenn ich meine Tests ohne Gruppenfilter ausführe, wird alles erfolgreich durchgeführt, aber wenn ich mit Gruppen laufe, schlagen die Dinge fehl. In einigen Fällen liegt es daran, dass meine Testklasse von einer anderen Testklasse erbt, aber in anderen Fällen habe ich POJO-Testklassen und es scheint, als würden meine Methoden @BeforeMethod und @AfterMethod nicht richtig aufgerufen.

Übrigens, meine Lösung besteht darin, ausgeschlossene Gruppen zu verwenden, was natürlich nicht in allen Situationen funktioniert. @cbeust , wurde an einer geeigneten Lösung dafür gearbeitet?

Mehr als ein Jahr später und das funktioniert immer noch nicht.
@cbeust IMHO macht das keinen Sinn: Da die Testklasse basieren.

FWIW Ich bin gerade auch darauf gestoßen.

Ich habe einen benutzerdefinierten Methodenselektor erstellt, der die Gruppen aus der Unterklasse Testannoation verwendet

/* *****************************************************************************
 * Copyright 2017 VMware, Inc.  All rights reserved. VMware Confidential
 * ****************************************************************************/
package com.vmware.cloud.systemtests.util;

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

import org.apache.commons.lang3.ArrayUtils;
import org.testng.IMethodSelector;
import org.testng.IMethodSelectorContext;
import org.testng.ITestNGMethod;
import org.testng.annotations.Test;
import org.testng.xml.XmlTest;

/**
 * Selector that uses groups in subclass <strong i="6">@Test</strong> annotations to determine if methods should be included
 */
public class SubclassAwareXmlMethodsSelector implements IMethodSelector {
    <strong i="7">@Override</strong>
    public boolean includeMethod(IMethodSelectorContext context, ITestNGMethod method, boolean isTestMethod) {
        XmlTest xmlTest = method.getXmlTest();
        if (xmlTest == null) {
            return method.isAlwaysRun();
        }
        Class realTestClass = isTestMethod ? method.getTestClass().getRealClass() : method.getRealClass();
        Test testClassAnnotation = (Test) realTestClass.getAnnotation(Test.class);
        String[] classAnnotationGroups = testClassAnnotation != null ? testClassAnnotation.groups() : new String[0];
        List<String> groups = Arrays.asList(ArrayUtils.addAll(classAnnotationGroups, method.getGroups()));

        context.setStopped(true);
        if (groups.size() == 0 && xmlTest.getIncludedGroups().isEmpty()) {
            return true;
        } else if (groups.size() > 0 && xmlTest.getExcludedGroups().stream().anyMatch(groups::contains)) {
            return false;
        } else if (groups.size() > 0 && xmlTest.getIncludedGroups().stream().anyMatch(groups::contains)) {
            return true;
        } else {
            return method.isAlwaysRun();
        }
    }

    <strong i="8">@Override</strong>
    public void setTestMethods(List<ITestNGMethod> list) {
    }
}
War diese Seite hilfreich?
0 / 5 - 0 Bewertungen