1 package org.testng.internal; 2 3 import org.testng.ITestClass; 4 import org.testng.ITestNGMethod; 5 import org.testng.annotations.ITestAnnotation; 6 import org.testng.internal.annotations.AnnotationHelper; 7 import org.testng.internal.annotations.IAnnotationFinder; 8 import org.testng.xml.XmlClass; 9 import org.testng.xml.XmlInclude; 10 import org.testng.xml.XmlTest; 11 12 import java.io.Serializable; 13 import java.lang.reflect.Method; 14 import java.util.Collections; 15 import java.util.Comparator; 16 import java.util.List; 17 18 19 /** 20 * This class represents a test method. 21 * 22 * @author Cedric Beust, May 3, 2004 23 * @author <a href = "mailto:the_mindstorm@evolva.ro">Alexandru Popescu</a> 24 */ 25 public class TestNGMethod extends BaseTestMethod implements Serializable { 26 /** 27 * 28 */ 29 private static final long serialVersionUID = -1742868891986775307L; 30 private int m_threadPoolSize = 0; 31 private int m_invocationCount = 1; 32 private int m_totalInvocationCount = m_invocationCount; 33 private int m_successPercentage = 100; 34 35 /** 36 * Constructs a <code>TestNGMethod</code> 37 * 38 * @param method 39 * @param finder 40 */ TestNGMethod(Method method, IAnnotationFinder finder, XmlTest xmlTest, Object instance)41 public TestNGMethod(Method method, IAnnotationFinder finder, XmlTest xmlTest, Object instance) { 42 this(method, finder, true, xmlTest, instance); 43 } 44 TestNGMethod(Method method, IAnnotationFinder finder, boolean initialize, XmlTest xmlTest, Object instance)45 private TestNGMethod(Method method, IAnnotationFinder finder, boolean initialize, 46 XmlTest xmlTest, Object instance) { 47 super(method.getName(), method, finder, instance); 48 49 if(initialize) { 50 init(xmlTest); 51 } 52 } 53 54 /** 55 * {@inheritDoc} 56 */ 57 @Override getInvocationCount()58 public int getInvocationCount() { 59 return m_invocationCount; 60 } 61 62 /** 63 * {@inheritDoc} 64 */ 65 @Override getTotalInvocationCount()66 public int getTotalInvocationCount() { 67 return m_totalInvocationCount; 68 } 69 70 /** 71 * {@inheritDoc} 72 */ 73 @Override getSuccessPercentage()74 public int getSuccessPercentage() { 75 return m_successPercentage; 76 } 77 78 /** 79 * {@inheritDoc} 80 */ 81 @Override isTest()82 public boolean isTest() { 83 return true; 84 } 85 ppp(String s)86 private void ppp(String s) { 87 System.out.println("[TestNGMethod] " + s); 88 } 89 init(XmlTest xmlTest)90 private void init(XmlTest xmlTest) { 91 setXmlTest(xmlTest); 92 setInvocationNumbers(xmlTest.getInvocationNumbers( 93 m_method.getDeclaringClass().getName() + "." + m_method.getName())); 94 { 95 ITestAnnotation testAnnotation = 96 AnnotationHelper.findTest(getAnnotationFinder(), m_method.getMethod()); 97 98 if (testAnnotation == null) { 99 // Try on the class 100 testAnnotation = AnnotationHelper.findTest(getAnnotationFinder(), m_method.getDeclaringClass()); 101 } 102 103 if (null != testAnnotation) { 104 setTimeOut(testAnnotation.getTimeOut()); 105 m_successPercentage = testAnnotation.getSuccessPercentage(); 106 107 setInvocationCount(testAnnotation.getInvocationCount()); 108 m_totalInvocationCount = testAnnotation.getInvocationCount(); 109 setThreadPoolSize(testAnnotation.getThreadPoolSize()); 110 setAlwaysRun(testAnnotation.getAlwaysRun()); 111 setDescription(findDescription(testAnnotation, xmlTest)); 112 setEnabled(testAnnotation.getEnabled()); 113 setRetryAnalyzer(testAnnotation.getRetryAnalyzer()); 114 setSkipFailedInvocations(testAnnotation.skipFailedInvocations()); 115 setInvocationTimeOut(testAnnotation.invocationTimeOut()); 116 setIgnoreMissingDependencies(testAnnotation.ignoreMissingDependencies()); 117 setPriority(testAnnotation.getPriority()); 118 } 119 120 // Groups 121 { 122 initGroups(ITestAnnotation.class); 123 } 124 } 125 } 126 findDescription(ITestAnnotation testAnnotation, XmlTest xmlTest)127 private String findDescription(ITestAnnotation testAnnotation, XmlTest xmlTest) { 128 String result = testAnnotation.getDescription(); 129 if (result == null) { 130 List<XmlClass> classes = xmlTest.getXmlClasses(); 131 for (XmlClass c : classes) { 132 if (c.getName().equals(m_method.getMethod().getDeclaringClass().getName())) { 133 for (XmlInclude include : c.getIncludedMethods()) { 134 if (include.getName().equals(m_method.getName())) { 135 result = include.getDescription(); 136 if (result != null) { 137 break; 138 } 139 } 140 } 141 } 142 } 143 } 144 return result; 145 } 146 147 /** 148 * {@inheritDoc} 149 */ 150 @Override getThreadPoolSize()151 public int getThreadPoolSize() { 152 return m_threadPoolSize; 153 } 154 155 /** 156 * Sets the number of threads on which this method should be invoked. 157 */ 158 @Override setThreadPoolSize(int threadPoolSize)159 public void setThreadPoolSize(int threadPoolSize) { 160 m_threadPoolSize = threadPoolSize; 161 } 162 163 /** 164 * Sets the number of invocations for this method. 165 */ 166 @Override setInvocationCount(int counter)167 public void setInvocationCount(int counter) { 168 m_invocationCount= counter; 169 } 170 171 /** 172 * Clones the current <code>TestNGMethod</code> and its @BeforeMethod and @AfterMethod methods. 173 * @see org.testng.internal.BaseTestMethod#clone() 174 */ 175 @Override clone()176 public BaseTestMethod clone() { 177 TestNGMethod clone= new TestNGMethod(getMethod(), getAnnotationFinder(), false, getXmlTest(), 178 getInstance()); 179 ITestClass tc= getTestClass(); 180 NoOpTestClass testClass= new NoOpTestClass(tc); 181 testClass.setBeforeTestMethods(clone(tc.getBeforeTestMethods())); 182 testClass.setAfterTestMethod(clone(tc.getAfterTestMethods())); 183 clone.m_testClass= testClass; 184 clone.setDate(getDate()); 185 clone.setGroups(getGroups()); 186 clone.setGroupsDependedUpon(getGroupsDependedUpon(), Collections.<String>emptyList()); 187 clone.setMethodsDependedUpon(getMethodsDependedUpon()); 188 clone.setAlwaysRun(isAlwaysRun()); 189 clone.m_beforeGroups= getBeforeGroups(); 190 clone.m_afterGroups= getAfterGroups(); 191 clone.m_currentInvocationCount= m_currentInvocationCount; 192 clone.setMissingGroup(getMissingGroup()); 193 clone.setThreadPoolSize(getThreadPoolSize()); 194 clone.setDescription(getDescription()); 195 clone.setEnabled(getEnabled()); 196 clone.setParameterInvocationCount(getParameterInvocationCount()); 197 clone.setInvocationCount(getInvocationCount()); 198 clone.m_totalInvocationCount = getTotalInvocationCount(); 199 clone.m_successPercentage = getSuccessPercentage(); 200 clone.setTimeOut(getTimeOut()); 201 clone.setRetryAnalyzer(getRetryAnalyzer()); 202 clone.setSkipFailedInvocations(skipFailedInvocations()); 203 clone.setInvocationNumbers(getInvocationNumbers()); 204 clone.setPriority(getPriority()); 205 206 return clone; 207 } 208 clone(ITestNGMethod[] sources)209 private ITestNGMethod[] clone(ITestNGMethod[] sources) { 210 ITestNGMethod[] clones= new ITestNGMethod[sources.length]; 211 for(int i= 0; i < sources.length; i++) { 212 clones[i]= sources[i].clone(); 213 } 214 215 return clones; 216 } 217 218 /** Sorts ITestNGMethod by Class name. */ 219 public static final Comparator<ITestNGMethod> SORT_BY_CLASS = 220 new Comparator<ITestNGMethod>() { 221 222 @Override 223 public int compare(ITestNGMethod o1, ITestNGMethod o2) { 224 String c1 = o1.getTestClass().getName(); 225 String c2 = o2.getTestClass().getName(); 226 return c1.compareTo(c2); 227 } 228 }; 229 } 230