1 package org.testng; 2 3 import static org.testng.internal.Utils.isStringBlank; 4 5 import org.testng.collections.Lists; 6 import org.testng.collections.Maps; 7 import org.testng.internal.Attributes; 8 import org.testng.internal.IConfiguration; 9 import org.testng.internal.IInvoker; 10 import org.testng.internal.Utils; 11 import org.testng.internal.annotations.IAnnotationFinder; 12 import org.testng.internal.thread.ThreadUtil; 13 import org.testng.reporters.JUnitXMLReporter; 14 import org.testng.reporters.TestHTMLReporter; 15 import org.testng.reporters.TextReporter; 16 import org.testng.xml.XmlSuite; 17 import org.testng.xml.XmlTest; 18 19 import java.io.File; 20 import java.io.Serializable; 21 import java.lang.reflect.Method; 22 import java.util.ArrayList; 23 import java.util.Arrays; 24 import java.util.Collection; 25 import java.util.Collections; 26 import java.util.Comparator; 27 import java.util.LinkedHashMap; 28 import java.util.List; 29 import java.util.Map; 30 import java.util.Set; 31 import com.google.inject.Injector; 32 33 /** 34 * <CODE>SuiteRunner</CODE> is responsible for running all the tests included in one 35 * suite. The test start is triggered by {@link #run()} method. 36 * 37 * @author Cedric Beust, Apr 26, 2004 38 */ 39 public class SuiteRunner implements ISuite, Serializable, IInvokedMethodListener { 40 41 /* generated */ 42 private static final long serialVersionUID = 5284208932089503131L; 43 44 private static final String DEFAULT_OUTPUT_DIR = "test-output"; 45 46 private Map<String, ISuiteResult> m_suiteResults = Collections.synchronizedMap(Maps.<String, ISuiteResult>newLinkedHashMap()); 47 transient private List<TestRunner> m_testRunners = Lists.newArrayList(); 48 transient private Map<Class<? extends ISuiteListener>, ISuiteListener> m_listeners = Maps.newHashMap(); 49 transient private TestListenerAdapter m_textReporter = new TestListenerAdapter(); 50 51 private String m_outputDir; // DEFAULT_OUTPUT_DIR; 52 private XmlSuite m_suite; 53 private Injector m_parentInjector; 54 55 transient private List<ITestListener> m_testListeners = Lists.newArrayList(); 56 transient private List<IClassListener> m_classListeners = Lists.newArrayList(); 57 transient private ITestRunnerFactory m_tmpRunnerFactory; 58 59 transient private ITestRunnerFactory m_runnerFactory; 60 transient private boolean m_useDefaultListeners = true; 61 62 // The remote host where this suite was run, or null if run locally 63 private String m_host; 64 65 // The configuration 66 transient private IConfiguration m_configuration; 67 68 transient private ITestObjectFactory m_objectFactory; 69 transient private Boolean m_skipFailedInvocationCounts = Boolean.FALSE; 70 71 transient private List<IMethodInterceptor> m_methodInterceptors; 72 private Map<Class<? extends IInvokedMethodListener>, IInvokedMethodListener> m_invokedMethodListeners; 73 74 /** The list of all the methods invoked during this run */ 75 private List<IInvokedMethod> m_invokedMethods = 76 Collections.synchronizedList(Lists.<IInvokedMethod>newArrayList()); 77 78 private List<ITestNGMethod> m_allTestMethods = Lists.newArrayList(); 79 80 // transient private IAnnotationTransformer m_annotationTransformer = null; 81 SuiteRunner(IConfiguration configuration, XmlSuite suite, String outputDir)82 public SuiteRunner(IConfiguration configuration, XmlSuite suite, 83 String outputDir) 84 { 85 this(configuration, suite, outputDir, null); 86 } 87 SuiteRunner(IConfiguration configuration, XmlSuite suite, String outputDir, ITestRunnerFactory runnerFactory)88 public SuiteRunner(IConfiguration configuration, XmlSuite suite, String outputDir, 89 ITestRunnerFactory runnerFactory) 90 { 91 this(configuration, suite, outputDir, runnerFactory, false); 92 } 93 SuiteRunner(IConfiguration configuration, XmlSuite suite, String outputDir, ITestRunnerFactory runnerFactory, boolean useDefaultListeners)94 public SuiteRunner(IConfiguration configuration, 95 XmlSuite suite, 96 String outputDir, 97 ITestRunnerFactory runnerFactory, 98 boolean useDefaultListeners) 99 { 100 this(configuration, suite, outputDir, runnerFactory, useDefaultListeners, 101 new ArrayList<IMethodInterceptor>() /* method interceptor */, 102 null /* invoked method listeners */, 103 null /* test listeners */, 104 null /* class listeners */); 105 } 106 SuiteRunner(IConfiguration configuration, XmlSuite suite, String outputDir, ITestRunnerFactory runnerFactory, boolean useDefaultListeners, List<IMethodInterceptor> methodInterceptors, List<IInvokedMethodListener> invokedMethodListeners, List<ITestListener> testListeners, List<IClassListener> classListeners)107 protected SuiteRunner(IConfiguration configuration, 108 XmlSuite suite, 109 String outputDir, 110 ITestRunnerFactory runnerFactory, 111 boolean useDefaultListeners, 112 List<IMethodInterceptor> methodInterceptors, 113 List<IInvokedMethodListener> invokedMethodListeners, 114 List<ITestListener> testListeners, 115 List<IClassListener> classListeners) 116 { 117 init(configuration, suite, outputDir, runnerFactory, useDefaultListeners, methodInterceptors, invokedMethodListeners, testListeners, classListeners); 118 } 119 init(IConfiguration configuration, XmlSuite suite, String outputDir, ITestRunnerFactory runnerFactory, boolean useDefaultListeners, List<IMethodInterceptor> methodInterceptors, List<IInvokedMethodListener> invokedMethodListener, List<ITestListener> testListeners, List<IClassListener> classListeners)120 private void init(IConfiguration configuration, 121 XmlSuite suite, 122 String outputDir, 123 ITestRunnerFactory runnerFactory, 124 boolean useDefaultListeners, 125 List<IMethodInterceptor> methodInterceptors, 126 List<IInvokedMethodListener> invokedMethodListener, 127 List<ITestListener> testListeners, 128 List<IClassListener> classListeners) 129 { 130 m_configuration = configuration; 131 m_suite = suite; 132 m_useDefaultListeners = useDefaultListeners; 133 m_tmpRunnerFactory= runnerFactory; 134 m_methodInterceptors = methodInterceptors != null ? methodInterceptors : new ArrayList<IMethodInterceptor>(); 135 setOutputDir(outputDir); 136 m_objectFactory = m_configuration.getObjectFactory(); 137 if(m_objectFactory == null) { 138 m_objectFactory = suite.getObjectFactory(); 139 } 140 // Add our own IInvokedMethodListener 141 m_invokedMethodListeners = Maps.newHashMap(); 142 if (invokedMethodListener != null) { 143 for (IInvokedMethodListener listener : invokedMethodListener) { 144 m_invokedMethodListeners.put(listener.getClass(), listener); 145 } 146 } 147 m_invokedMethodListeners.put(getClass(), this); 148 149 m_skipFailedInvocationCounts = suite.skipFailedInvocationCounts(); 150 if (null != testListeners) { 151 m_testListeners.addAll(testListeners); 152 } 153 if (null != classListeners) { 154 m_classListeners.addAll(classListeners); 155 } 156 m_runnerFactory = buildRunnerFactory(); 157 158 // Order the <test> tags based on their order of appearance in testng.xml 159 List<XmlTest> xmlTests = m_suite.getTests(); 160 Collections.sort(xmlTests, new Comparator<XmlTest>() { 161 @Override 162 public int compare(XmlTest arg0, XmlTest arg1) { 163 return arg0.getIndex() - arg1.getIndex(); 164 } 165 }); 166 167 for (XmlTest test : xmlTests) { 168 TestRunner tr = m_runnerFactory.newTestRunner(this, test, m_invokedMethodListeners.values(), m_classListeners); 169 170 // 171 // Install the method interceptor, if any was passed 172 // 173 for (IMethodInterceptor methodInterceptor : m_methodInterceptors) { 174 tr.addMethodInterceptor(methodInterceptor); 175 } 176 177 // Reuse the same text reporter so we can accumulate all the results 178 // (this is used to display the final suite report at the end) 179 tr.addListener(m_textReporter); 180 m_testRunners.add(tr); 181 182 // Add the methods found in this test to our global count 183 m_allTestMethods.addAll(Arrays.asList(tr.getAllTestMethods())); 184 } 185 } 186 187 @Override getXmlSuite()188 public XmlSuite getXmlSuite() { 189 return m_suite; 190 } 191 192 @Override getName()193 public String getName() { 194 return m_suite.getName(); 195 } 196 setObjectFactory(ITestObjectFactory objectFactory)197 public void setObjectFactory(ITestObjectFactory objectFactory) { 198 m_objectFactory = objectFactory; 199 } 200 setReportResults(boolean reportResults)201 public void setReportResults(boolean reportResults) { 202 m_useDefaultListeners = reportResults; 203 } 204 invokeListeners(boolean start)205 private void invokeListeners(boolean start) { 206 for (ISuiteListener sl : m_listeners.values()) { 207 if (start) { 208 sl.onStart(this); 209 } 210 else { 211 sl.onFinish(this); 212 } 213 } 214 } 215 setOutputDir(String outputdir)216 private void setOutputDir(String outputdir) { 217 if (isStringBlank(outputdir) && m_useDefaultListeners) { 218 outputdir = DEFAULT_OUTPUT_DIR; 219 } 220 221 m_outputDir = (null != outputdir) ? new File(outputdir).getAbsolutePath() 222 : null; 223 } 224 buildRunnerFactory()225 private ITestRunnerFactory buildRunnerFactory() { 226 ITestRunnerFactory factory = null; 227 228 if (null == m_tmpRunnerFactory) { 229 factory = new DefaultTestRunnerFactory(m_configuration, 230 m_testListeners.toArray(new ITestListener[m_testListeners.size()]), 231 m_useDefaultListeners, m_skipFailedInvocationCounts); 232 } 233 else { 234 factory = new ProxyTestRunnerFactory( 235 m_testListeners.toArray(new ITestListener[m_testListeners.size()]), 236 m_tmpRunnerFactory); 237 } 238 239 return factory; 240 } 241 242 @Override getParallel()243 public String getParallel() { 244 return m_suite.getParallel().toString(); 245 } 246 getParentModule()247 public String getParentModule() { 248 return m_suite.getParentModule(); 249 } 250 251 @Override getGuiceStage()252 public String getGuiceStage() { 253 return m_suite.getGuiceStage(); 254 } 255 getParentInjector()256 public Injector getParentInjector() { 257 return m_parentInjector; 258 } 259 setParentInjector(Injector injector)260 public void setParentInjector(Injector injector) { 261 m_parentInjector = injector; 262 } 263 264 @Override run()265 public void run() { 266 invokeListeners(true /* start */); 267 try { 268 privateRun(); 269 } 270 finally { 271 invokeListeners(false /* stop */); 272 } 273 } 274 privateRun()275 private void privateRun() { 276 277 // Map for unicity, Linked for guaranteed order 278 Map<Method, ITestNGMethod> beforeSuiteMethods= new LinkedHashMap<>(); 279 Map<Method, ITestNGMethod> afterSuiteMethods = new LinkedHashMap<>(); 280 281 IInvoker invoker = null; 282 283 // Get the invoker and find all the suite level methods 284 for (TestRunner tr: m_testRunners) { 285 // TODO: Code smell. Invoker should belong to SuiteRunner, not TestRunner 286 // -- cbeust 287 invoker = tr.getInvoker(); 288 289 for (ITestNGMethod m : tr.getBeforeSuiteMethods()) { 290 beforeSuiteMethods.put(m.getMethod(), m); 291 } 292 293 for (ITestNGMethod m : tr.getAfterSuiteMethods()) { 294 afterSuiteMethods.put(m.getMethod(), m); 295 } 296 } 297 298 // 299 // Invoke beforeSuite methods (the invoker can be null 300 // if the suite we are currently running only contains 301 // a <file-suite> tag and no real tests) 302 // 303 if (invoker != null) { 304 if(beforeSuiteMethods.values().size() > 0) { 305 invoker.invokeConfigurations(null, 306 beforeSuiteMethods.values().toArray(new ITestNGMethod[beforeSuiteMethods.size()]), 307 m_suite, m_suite.getParameters(), null, /* no parameter values */ 308 null /* instance */ 309 ); 310 } 311 312 Utils.log("SuiteRunner", 3, "Created " + m_testRunners.size() + " TestRunners"); 313 314 // 315 // Run all the test runners 316 // 317 boolean testsInParallel = XmlSuite.ParallelMode.TESTS.equals(m_suite.getParallel()); 318 if (!testsInParallel) { 319 runSequentially(); 320 } 321 else { 322 runInParallelTestMode(); 323 } 324 325 // SuitePlan sp = new SuitePlan(); 326 // for (TestRunner tr : m_testRunners) { 327 // sp.addTestPlan(tr.getTestPlan()); 328 // } 329 330 // sp.dump(); 331 332 // 333 // Invoke afterSuite methods 334 // 335 if (afterSuiteMethods.values().size() > 0) { 336 invoker.invokeConfigurations(null, 337 afterSuiteMethods.values().toArray(new ITestNGMethod[afterSuiteMethods.size()]), 338 m_suite, m_suite.getAllParameters(), null, /* no parameter values */ 339 340 null /* instance */); 341 } 342 } 343 } 344 345 private List<IReporter> m_reporters = Lists.newArrayList(); 346 addReporter(IReporter listener)347 private void addReporter(IReporter listener) { 348 m_reporters.add(listener); 349 } 350 addConfigurationListener(IConfigurationListener listener)351 void addConfigurationListener(IConfigurationListener listener) { 352 m_configuration.addConfigurationListener(listener); 353 } 354 getReporters()355 public List<IReporter> getReporters() { 356 return m_reporters; 357 } 358 runSequentially()359 private void runSequentially() { 360 for (TestRunner tr : m_testRunners) { 361 runTest(tr); 362 } 363 } 364 runTest(TestRunner tr)365 private void runTest(TestRunner tr) { 366 tr.run(); 367 368 ISuiteResult sr = new SuiteResult(m_suite, tr); 369 m_suiteResults.put(tr.getName(), sr); 370 } 371 372 /** 373 * Implement <suite parallel="tests">. 374 * Since this kind of parallelism happens at the suite level, we need a special code path 375 * to execute it. All the other parallelism strategies are implemented at the test level 376 * in TestRunner#createParallelWorkers (but since this method deals with just one <test> 377 * tag, it can't implement <suite parallel="tests">, which is why we're doing it here). 378 */ runInParallelTestMode()379 private void runInParallelTestMode() { 380 List<Runnable> tasks= Lists.newArrayList(m_testRunners.size()); 381 for(TestRunner tr: m_testRunners) { 382 tasks.add(new SuiteWorker(tr)); 383 } 384 385 ThreadUtil.execute(tasks, m_suite.getThreadCount(), 386 m_suite.getTimeOut(XmlTest.DEFAULT_TIMEOUT_MS), false); 387 } 388 389 private class SuiteWorker implements Runnable { 390 private TestRunner m_testRunner; 391 SuiteWorker(TestRunner tr)392 public SuiteWorker(TestRunner tr) { 393 m_testRunner = tr; 394 } 395 396 @Override run()397 public void run() { 398 Utils.log("[SuiteWorker]", 4, "Running XML Test '" 399 + m_testRunner.getTest().getName() + "' in Parallel"); 400 runTest(m_testRunner); 401 } 402 } 403 404 /** 405 * Registers ISuiteListeners interested in reporting the result of the current 406 * suite. 407 * 408 * @param reporter 409 */ addListener(ISuiteListener reporter)410 protected void addListener(ISuiteListener reporter) { 411 m_listeners.put(reporter.getClass(), reporter); 412 } 413 414 @Override addListener(ITestNGListener listener)415 public void addListener(ITestNGListener listener) { 416 if (listener instanceof IInvokedMethodListener) { 417 IInvokedMethodListener invokedMethodListener = (IInvokedMethodListener) listener; 418 m_invokedMethodListeners.put(invokedMethodListener.getClass(), invokedMethodListener); 419 } 420 if (listener instanceof ISuiteListener) { 421 addListener((ISuiteListener) listener); 422 } 423 if (listener instanceof IReporter) { 424 addReporter((IReporter) listener); 425 } 426 if (listener instanceof IConfigurationListener) { 427 addConfigurationListener((IConfigurationListener) listener); 428 } 429 } 430 431 @Override getOutputDirectory()432 public String getOutputDirectory() { 433 return m_outputDir + File.separatorChar + getName(); 434 } 435 436 @Override getResults()437 public Map<String, ISuiteResult> getResults() { 438 return m_suiteResults; 439 } 440 441 /** 442 * FIXME: should be removed? 443 * 444 * @see org.testng.ISuite#getParameter(java.lang.String) 445 */ 446 @Override getParameter(String parameterName)447 public String getParameter(String parameterName) { 448 return m_suite.getParameter(parameterName); 449 } 450 451 /** 452 * @see org.testng.ISuite#getMethodsByGroups() 453 */ 454 @Override getMethodsByGroups()455 public Map<String, Collection<ITestNGMethod>> getMethodsByGroups() { 456 Map<String, Collection<ITestNGMethod>> result = Maps.newHashMap(); 457 458 for (TestRunner tr : m_testRunners) { 459 ITestNGMethod[] methods = tr.getAllTestMethods(); 460 for (ITestNGMethod m : methods) { 461 String[] groups = m.getGroups(); 462 for (String groupName : groups) { 463 Collection<ITestNGMethod> testMethods = result.get(groupName); 464 if (null == testMethods) { 465 testMethods = Lists.newArrayList(); 466 result.put(groupName, testMethods); 467 } 468 testMethods.add(m); 469 } 470 } 471 } 472 473 return result; 474 } 475 476 /** 477 * @see org.testng.ISuite#getInvokedMethods() 478 */ 479 @Override getInvokedMethods()480 public Collection<ITestNGMethod> getInvokedMethods() { 481 return getIncludedOrExcludedMethods(true /* included */); 482 } 483 484 /** 485 * @see org.testng.ISuite#getExcludedMethods() 486 */ 487 @Override getExcludedMethods()488 public Collection<ITestNGMethod> getExcludedMethods() { 489 return getIncludedOrExcludedMethods(false/* included */); 490 } 491 getIncludedOrExcludedMethods(boolean included)492 private Collection<ITestNGMethod> getIncludedOrExcludedMethods(boolean included) { 493 List<ITestNGMethod> result= Lists.newArrayList(); 494 495 for (TestRunner tr : m_testRunners) { 496 Collection<ITestNGMethod> methods = included ? tr.getInvokedMethods() : tr.getExcludedMethods(); 497 for (ITestNGMethod m : methods) { 498 result.add(m); 499 } 500 } 501 502 return result; 503 } 504 505 @Override getObjectFactory()506 public IObjectFactory getObjectFactory() { 507 return m_objectFactory instanceof IObjectFactory ? (IObjectFactory) m_objectFactory : null; 508 } 509 510 @Override getObjectFactory2()511 public IObjectFactory2 getObjectFactory2() { 512 return m_objectFactory instanceof IObjectFactory2 ? (IObjectFactory2) m_objectFactory : null; 513 } 514 515 /** 516 * Returns the annotation finder for the given annotation type. 517 * @return the annotation finder for the given annotation type. 518 */ 519 @Override getAnnotationFinder()520 public IAnnotationFinder getAnnotationFinder() { 521 return m_configuration.getAnnotationFinder(); 522 } 523 ppp(String s)524 public static void ppp(String s) { 525 System.out.println("[SuiteRunner] " + s); 526 } 527 528 /** 529 * The default implementation of {@link ITestRunnerFactory}. 530 */ 531 private static class DefaultTestRunnerFactory implements ITestRunnerFactory { 532 private ITestListener[] m_failureGenerators; 533 private boolean m_useDefaultListeners; 534 private boolean m_skipFailedInvocationCounts; 535 private IConfiguration m_configuration; 536 DefaultTestRunnerFactory(IConfiguration configuration, ITestListener[] failureListeners, boolean useDefaultListeners, boolean skipFailedInvocationCounts)537 public DefaultTestRunnerFactory(IConfiguration configuration, 538 ITestListener[] failureListeners, 539 boolean useDefaultListeners, 540 boolean skipFailedInvocationCounts) 541 { 542 m_configuration = configuration; 543 m_failureGenerators = failureListeners; 544 m_useDefaultListeners = useDefaultListeners; 545 m_skipFailedInvocationCounts = skipFailedInvocationCounts; 546 } 547 548 @Override newTestRunner(ISuite suite, XmlTest test, Collection<IInvokedMethodListener> listeners, List<IClassListener> classListeners)549 public TestRunner newTestRunner(ISuite suite, XmlTest test, 550 Collection<IInvokedMethodListener> listeners, List<IClassListener> classListeners) { 551 boolean skip = m_skipFailedInvocationCounts; 552 if (! skip) { 553 skip = test.skipFailedInvocationCounts(); 554 } 555 TestRunner testRunner = new TestRunner(m_configuration, suite, test, 556 suite.getOutputDirectory(), suite.getAnnotationFinder(), skip, 557 listeners, classListeners); 558 559 if (m_useDefaultListeners) { 560 testRunner.addListener(new TestHTMLReporter()); 561 testRunner.addListener(new JUnitXMLReporter()); 562 563 //TODO: Moved these here because maven2 has output reporters running 564 //already, the output from these causes directories to be created with 565 //files. This is not the desired behaviour of running tests in maven2. 566 //Don't know what to do about this though, are people relying on these 567 //to be added even with defaultListeners set to false? 568 testRunner.addListener(new TextReporter(testRunner.getName(), TestRunner.getVerbose())); 569 } 570 571 for (ITestListener itl : m_failureGenerators) { 572 testRunner.addListener(itl); 573 } 574 for (IConfigurationListener cl : m_configuration.getConfigurationListeners()) { 575 testRunner.addConfigurationListener(cl); 576 } 577 578 return testRunner; 579 } 580 } 581 582 private static class ProxyTestRunnerFactory implements ITestRunnerFactory { 583 private ITestListener[] m_failureGenerators; 584 private ITestRunnerFactory m_target; 585 ProxyTestRunnerFactory(ITestListener[] failureListeners, ITestRunnerFactory target)586 public ProxyTestRunnerFactory(ITestListener[] failureListeners, ITestRunnerFactory target) { 587 m_failureGenerators = failureListeners; 588 m_target= target; 589 } 590 591 @Override newTestRunner(ISuite suite, XmlTest test, Collection<IInvokedMethodListener> listeners, List<IClassListener> classListeners)592 public TestRunner newTestRunner(ISuite suite, XmlTest test, 593 Collection<IInvokedMethodListener> listeners, List<IClassListener> classListeners) { 594 TestRunner testRunner= m_target.newTestRunner(suite, test, listeners, classListeners); 595 596 testRunner.addListener(new TextReporter(testRunner.getName(), TestRunner.getVerbose())); 597 598 for (ITestListener itl : m_failureGenerators) { 599 testRunner.addListener(itl); 600 } 601 602 return testRunner; 603 } 604 } 605 setHost(String host)606 public void setHost(String host) { 607 m_host = host; 608 } 609 610 @Override getHost()611 public String getHost() { 612 return m_host; 613 } 614 615 private SuiteRunState m_suiteState= new SuiteRunState(); 616 617 /** 618 * @see org.testng.ISuite#getSuiteState() 619 */ 620 @Override getSuiteState()621 public SuiteRunState getSuiteState() { 622 return m_suiteState; 623 } 624 setSkipFailedInvocationCounts(Boolean skipFailedInvocationCounts)625 public void setSkipFailedInvocationCounts(Boolean skipFailedInvocationCounts) { 626 if (skipFailedInvocationCounts != null) { 627 m_skipFailedInvocationCounts = skipFailedInvocationCounts; 628 } 629 } 630 631 private IAttributes m_attributes = new Attributes(); 632 633 @Override getAttribute(String name)634 public Object getAttribute(String name) { 635 return m_attributes.getAttribute(name); 636 } 637 638 @Override setAttribute(String name, Object value)639 public void setAttribute(String name, Object value) { 640 m_attributes.setAttribute(name, value); 641 } 642 643 @Override getAttributeNames()644 public Set<String> getAttributeNames() { 645 return m_attributes.getAttributeNames(); 646 } 647 648 @Override removeAttribute(String name)649 public Object removeAttribute(String name) { 650 return m_attributes.removeAttribute(name); 651 } 652 653 ///// 654 // implements IInvokedMethodListener 655 // 656 657 @Override afterInvocation(IInvokedMethod method, ITestResult testResult)658 public void afterInvocation(IInvokedMethod method, ITestResult testResult) { 659 } 660 661 @Override beforeInvocation(IInvokedMethod method, ITestResult testResult)662 public void beforeInvocation(IInvokedMethod method, ITestResult testResult) { 663 if (method == null) { 664 throw new NullPointerException("Method should not be null"); 665 } 666 m_invokedMethods.add(method); 667 } 668 669 // 670 // implements IInvokedMethodListener 671 ///// 672 673 @Override getAllInvokedMethods()674 public List<IInvokedMethod> getAllInvokedMethods() { 675 return m_invokedMethods; 676 } 677 678 @Override getAllMethods()679 public List<ITestNGMethod> getAllMethods() { 680 return m_allTestMethods; 681 } 682 } 683