Testng: Metode pengujian yang diwariskan tidak mendapatkan perilaku kelompok yang diharapkan

Dibuat pada 1 Mar 2012  ·  8Komentar  ·  Sumber: cbeust/testng

Pertimbangkan kelas tes berikut:

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

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

Saat menjalankan tes ini (ChildTest), saya berharap kedua metode pengujian (childTestMethod dan parentTestMethod) milik grup 'myGroup'. Rupanya ini bukan perilaku yang sebenarnya (diuji dengan versi 6.4).

Saya mengumpulkan beberapa kode untuk menyelidiki masalah ini:

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));
}

Output dari menjalankan kode ini:

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

Saya melihat kode sumber TestNG, dan tampaknya perilaku ini berasal dari metode org.testng.internal.BaseTestMethod#initGroups(Class>). Tepatnya, saya pikir pernyataan berikut adalah penyebab perilaku yang agak aneh ini:

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

Untuk memperbaiki masalah ini, pernyataan ini dapat dimodifikasi menjadi:

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

tetapi saya tidak yakin apakah ini cara yang benar untuk menyelesaikan masalah. Juga implikasi akhirnya ....

groups inheritance

Semua 8 komentar

Saya melihat masalahnya, dan sayangnya saran Anda tidak berhasil. Agak sulit untuk dipecahkan karena anotasi diselesaikan pada fase init, yang berarti bahwa ketika anotasi @Test induk diuraikan, itu jelas tidak tahu apa-apa tentang fakta bahwa anotasi anak akan menambahkan lebih banyak grup ke dalamnya...

Cedric, terima kasih atas umpan balik Anda yang cepat tentang masalah ini. Anda mengatakan "agak sulit untuk diselesaikan", apakah itu berarti Anda tidak berpikir bahwa masalah ini akan memiliki peluang untuk diselesaikan dalam waktu dekat? Bisakah Anda memikirkan solusi yang mungkin?

Yang saya maksud adalah: ketika resolusi grup dilakukan, belum ada kelas pengujian yang dibuat, jadi ketika saya melihat parentTestMethod(), saya tidak memiliki instance ChildTest yang memungkinkan saya untuk menempatkan metode itu di grup ini.

Resolusi grup murni statis, sedangkan contoh di atas hanya dapat diselesaikan secara dinamis.

Apakah ini masuk akal?

Saya juga melihat perilaku ini. Ketika saya menjalankan tes saya tanpa filter grup, semuanya berlalu, tetapi ketika berjalan dengan grup, semuanya gagal. Dalam beberapa kasus ini karena kelas pengujian saya mewarisi dari beberapa kelas pengujian lain, tetapi dalam kasus lain saya memiliki kelas pengujian POJO dan sepertinya metode @BeforeMethod dan @AfterMethod tidak dipanggil dengan benar.

BTW, solusi saya adalah menggunakan grup yang dikecualikan yang tentu saja tidak akan berfungsi di semua situasi. @cbeust , apakah ada pekerjaan pada solusi yang tepat untuk ini?

Lebih dari setahun kemudian dan ini masih tidak berhasil.
@cbeust IMHO ini tidak masuk akal: karena kelas induknya abstrak, resolusi grupnya harus didasarkan pada contoh konkret dari kelas uji.

FWIW saya baru saja mengalami ini juga.

Saya membuat pemilih metode khusus, yang menggunakan grup dari subclass Test annoation

/* *****************************************************************************
 * 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) {
    }
}
Apakah halaman ini membantu?
0 / 5 - 0 peringkat