Testng: لا تحصل طرق الاختبار الموروثة على السلوك الجماعي المتوقع

تم إنشاؤها على ١ مارس ٢٠١٢  ·  8تعليقات  ·  مصدر: cbeust/testng

ضع في اعتبارك فئات الاختبار التالية:

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

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

عند إجراء هذا الاختبار (ChildTest) ، أتوقع أن كلا طريقتي الاختبار (childTestMethod و parentTestMethod) تنتمي إلى المجموعة "myGroup". يبدو أن هذا ليس هو السلوك الفعلي (تم اختباره باستخدام الإصدار 6.4).

لقد قمت بتجميع بعض التعليمات البرمجية للتحقيق في هذه المشكلة:

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

الإخراج من تشغيل هذا الرمز:

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

لقد بحثت في الكود المصدري TestNG ، ويبدو أن هذا السلوك ينشأ من الطريقة org.testng.internal.BaseTestMethod # initGroups (Class>). على وجه الدقة ، أعتقد أن العبارة التالية هي سبب هذا السلوك الغريب نوعًا ما:

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

لإصلاح هذه المشكلة ، يمكن تعديل هذه العبارة إلى:

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

لكني لست متأكدًا مما إذا كانت هذه هي الطريقة الصحيحة لحل المشكلة. ولا الآثار المحتملة ....

groups inheritance

ال 8 كومينتر

أرى المشكلة ، ولا يعمل اقتراحك تمامًا ، للأسف. من الصعب بعض الشيء حلها لأن التعليقات التوضيحية يتم حلها في مرحلة البدء ، مما يعني أنه عند تحليل التعليق التوضيحي للاختبار @ للوالد ، فمن الواضح أنه لا يعرف شيئًا عن حقيقة أن التعليق التوضيحي

سيدريك ، شكرًا لك على ملاحظاتك السريعة حول هذه المسألة. تقول "إنه معقد بعض الشيء لحلها" ، فهل هذا يعني أنك لا تعتقد أن هذه المشكلة سيكون لها فرصة للحل في المستقبل القريب؟ هل يمكنك التفكير في أي حلول ممكنة؟

ما قصدته هو: عند تنفيذ قرار المجموعة ، لم يتم إنشاء أي فئة اختبار حتى الآن ، لذلك عندما أنظر إلى parentTestMethod () ، ليس لدي مثيل ChildTest الذي يسمح لي بوضع هذه الطريقة في هذه المجموعة.

دقة المجموعة ثابتة تمامًا ، بينما لا يمكن حل المثال أعلاه إلا بشكل ديناميكي.

هل لهذا معنى؟

لقد رأيت هذا السلوك أيضًا. عندما أقوم بإجراء الاختبارات الخاصة بي بدون مرشح المجموعات ، فإن كل شيء يمر ، ولكن عند الركض مع المجموعات ، تفشل الأمور. في بعض الحالات ، يرجع ذلك إلى وراثة صنف الاختبار الخاص بي من فئة اختبار أخرى ، ولكن في حالات أخرى لدي فصول اختبار POJO ويبدو أنه لم يتم استدعاء أساليب @BeforeMethod و @AfterMethod بشكل صحيح.

راجع للشغل ، الحل الخاص بي هو استخدام المجموعات المستبعدة والتي لن تعمل بالطبع في جميع المواقف. cbeust ، هل كان هناك أي عمل لإيجاد حل مناسب لهذا؟

بعد أكثر من عام وما زال هذا لا يعمل.
cbeust IMHO هذا ليس له أي معنى: نظرًا لأن الفئة

FWIW لقد واجهت هذا أيضًا.

لقد قمت بإنشاء محدد أسلوب مخصص ، يستخدم المجموعات من فئة فرعية اختبار توضيحي

/* *****************************************************************************
 * 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) {
    }
}
هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات