ضع في اعتبارك فئات الاختبار التالية:
<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);
لكني لست متأكدًا مما إذا كانت هذه هي الطريقة الصحيحة لحل المشكلة. ولا الآثار المحتملة ....
أرى المشكلة ، ولا يعمل اقتراحك تمامًا ، للأسف. من الصعب بعض الشيء حلها لأن التعليقات التوضيحية يتم حلها في مرحلة البدء ، مما يعني أنه عند تحليل التعليق التوضيحي للاختبار @ للوالد ، فمن الواضح أنه لا يعرف شيئًا عن حقيقة أن التعليق التوضيحي
سيدريك ، شكرًا لك على ملاحظاتك السريعة حول هذه المسألة. تقول "إنه معقد بعض الشيء لحلها" ، فهل هذا يعني أنك لا تعتقد أن هذه المشكلة سيكون لها فرصة للحل في المستقبل القريب؟ هل يمكنك التفكير في أي حلول ممكنة؟
ما قصدته هو: عند تنفيذ قرار المجموعة ، لم يتم إنشاء أي فئة اختبار حتى الآن ، لذلك عندما أنظر إلى 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) {
}
}