Testng: μƒμ†λœ ν…ŒμŠ€νŠΈ 방법은 μ˜ˆμƒν•œ κ·Έλ£Ή λ™μž‘μ„ 얻지 λͺ»ν•©λ‹ˆλ‹€.

에 λ§Œλ“  2012λ…„ 03μ›” 01일  Β·  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 λŒ“κΈ€

λ¬Έμ œκ°€ μžˆλŠ” 것 같은데 λΆˆν–‰νžˆλ„ κ·€ν•˜μ˜ μ œμ•ˆμ΄ μ œλŒ€λ‘œ μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 주석이 μ΄ˆκΈ°ν™” λ‹¨κ³„μ—μ„œ ν•΄κ²°λ˜κΈ° λ•Œλ¬Έμ— ν•΄κ²°ν•˜κΈ°κ°€ μ•½κ°„ κΉŒλ‹€λ‘­μŠ΅λ‹ˆλ‹€. 즉, λΆ€λͺ¨μ˜ @Test 주석이 ꡬ문 뢄석될 λ•Œ μžμ‹ 주석이 더 λ§Žμ€ 그룹을 μΆ”κ°€ν•œλ‹€λŠ” 사싀에 λŒ€ν•΄ μ „ν˜€ μ•Œμ§€ λͺ»ν•©λ‹ˆλ‹€...

Cedric, 이 λ¬Έμ œμ— λŒ€ν•œ μ‹ μ†ν•œ ν”Όλ“œλ°±μ— κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€. "ν•΄κ²°ν•˜κΈ°κ°€ 쑰금 κΉŒλ‹€λ‘­λ‹€"κ³  λ§μ”€ν•˜μ…¨λŠ”λ°, 이 λ¬Έμ œκ°€ κ°€κΉŒμš΄ μ‹œμΌ 내에 해결될 κ°€λŠ₯성이 μ—†λ‹€κ³  μƒκ°ν•˜μ‹­λ‹ˆκΉŒ? κ°€λŠ₯ν•œ ν•΄κ²° 방법에 λŒ€ν•΄ 생각해 λ³Ό 수 μžˆμŠ΅λ‹ˆκΉŒ?

λ‚΄ 말은: κ·Έλ£Ή 확인이 μˆ˜ν–‰λ  λ•Œ ν…ŒμŠ€νŠΈ ν΄λž˜μŠ€κ°€ 아직 μΈμŠ€ν„΄μŠ€ν™”λ˜μ§€ μ•Šμ•˜μœΌλ―€λ‘œ parentTestMethod()λ₯Ό λ³Ό λ•Œ 이 그룹에 ν•΄λ‹Ή λ©”μ„œλ“œλ₯Ό 넣을 수 μžˆλŠ” ChildTest μΈμŠ€ν„΄μŠ€κ°€ μ—†μŠ΅λ‹ˆλ‹€.

κ·Έλ£Ή 확인은 μˆœμ „νžˆ μ •μ μ΄μ§€λ§Œ μœ„μ˜ μ˜ˆλŠ” λ™μ μœΌλ‘œλ§Œ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

이게 말이 돼?

λ‚˜λ„ 이런 행동을 λ³Έ 적이 μžˆλ‹€. κ·Έλ£Ή ν•„ν„° 없이 ν…ŒμŠ€νŠΈλ₯Ό μ‹€ν–‰ν•˜λ©΄ λͺ¨λ“  것이 ν†΅κ³Όν•˜μ§€λ§Œ 그룹으둜 μ‹€ν–‰ν•  λ•ŒλŠ” μ‹€νŒ¨ν•©λ‹ˆλ‹€. μ–΄λ–€ κ²½μš°μ—λŠ” λ‹€λ₯Έ ν…ŒμŠ€νŠΈ ν΄λž˜μŠ€μ—μ„œ μƒμ†ν•œ ν…ŒμŠ€νŠΈ 클래슀 λ•Œλ¬Έμ΄μ§€λ§Œ λ‹€λ₯Έ κ²½μš°μ—λŠ” POJO ν…ŒμŠ€νŠΈ ν΄λž˜μŠ€κ°€ 있고 @BeforeMethod 및 @AfterMethod λ©”μ„œλ“œκ°€ μ œλŒ€λ‘œ ν˜ΈμΆœλ˜μ§€ μ•ŠλŠ” 것 κ°™μŠ΅λ‹ˆλ‹€.

BTW, λ‚΄ μ†”λ£¨μ…˜μ€ λ¬Όλ‘  λͺ¨λ“  μƒν™©μ—μ„œ μž‘λ™ν•˜μ§€ μ•ŠλŠ” μ œμ™Έ 그룹을 μ‚¬μš©ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. @cbeust , 이에 λŒ€ν•œ μ μ ˆν•œ μ†”λ£¨μ…˜μ— λŒ€ν•œ μž‘μ—…μ΄ μžˆμ—ˆμŠ΅λ‹ˆκΉŒ?

1년이 λ„˜μ—ˆμ§€λ§Œ μ—¬μ „νžˆ μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
@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 λ“±κΈ‰