Best Testng code snippet using org.testng.DataProviderHolder.addListeners
Source:TestNG.java  
...783    //784    // Install the listeners found in the suites785    //786    for (XmlSuite s : m_suites) {787      addListeners(s);788      //789      // Install the method selectors790      //791      for (XmlMethodSelector methodSelector : s.getMethodSelectors()) {792        addMethodSelector(methodSelector.getClassName(), methodSelector.getPriority());793        addMethodSelector(methodSelector);794      }795      //796      // Find if we have an object factory797      //798      if (s.getObjectFactory() != null) {799        if (factory == null) {800          factory = s.getObjectFactory();801        } else {802          throw new TestNGException("Found more than one object-factory tag in your suites");803        }804      }805    }806    m_configuration.setAnnotationFinder(new JDK15AnnotationFinder(getAnnotationTransformer()));807    m_configuration.setHookable(m_hookable);808    m_configuration.setConfigurable(m_configurable);809    m_configuration.setObjectFactory(factory);810    m_configuration.setAlwaysRunListeners(this.m_alwaysRun);811    m_configuration.setExecutorFactory(getExecutorFactory());812  }813  private void addListeners(XmlSuite s) {814    for (String listenerName : s.getListeners()) {815      Class<?> listenerClass = ClassHelper.forName(listenerName);816      // If specified listener does not exist, a TestNGException will be thrown817      if (listenerClass == null) {818        throw new TestNGException(819            "Listener " + listenerName + " was not found in project's classpath");820      }821      ITestNGListener listener = (ITestNGListener) InstanceCreator.newInstance(listenerClass);822      addListener(listener);823    }824    // Add the child suite listeners825    List<XmlSuite> childSuites = s.getChildSuites();826    for (XmlSuite c : childSuites) {827      addListeners(c);828    }829  }830  /** Using reflection to remain Java 5 compliant. */831  private void addServiceLoaderListeners() {832    Iterable<ITestNGListener> loader =833        m_serviceLoaderClassLoader != null834            ? ServiceLoader.load(ITestNGListener.class, m_serviceLoaderClassLoader)835            : ServiceLoader.load(ITestNGListener.class);836    for (ITestNGListener l : loader) {837      Utils.log("[TestNG]", 2, "Adding ServiceLoader listener:" + l);838      addListener(l);839      addServiceLoaderListener(l);840    }841  }842  /**843   * Before suites are executed, do a sanity check to ensure all required conditions are met. If844   * not, throw an exception to stop test execution845   *846   * @throws TestNGException if the sanity check fails847   */848  private void sanityCheck() {849    XmlSuiteUtils.validateIfSuitesContainDuplicateTests(m_suites);850    XmlSuiteUtils.adjustSuiteNamesToEnsureUniqueness(m_suites);851  }852  /** Invoked by the remote runner. */853  public void initializeEverything() {854    // The Eclipse plug-in (RemoteTestNG) might have invoked this method already855    // so don't initialize suites twice.856    if (m_isInitialized) {857      return;858    }859    initializeSuitesAndJarFile();860    initializeConfiguration();861    initializeDefaultListeners();862    initializeCommandLineSuites();863    initializeCommandLineSuitesParams();864    initializeCommandLineSuitesGroups();865    m_isInitialized = true;866  }867  /** Run TestNG. */868  public void run() {869    initializeEverything();870    sanityCheck();871    runExecutionListeners(true /* start */);872    runSuiteAlterationListeners();873    m_start = System.currentTimeMillis();874    List<ISuite> suiteRunners = runSuites();875    m_end = System.currentTimeMillis();876    if (null != suiteRunners) {877      generateReports(suiteRunners);878    }879    runExecutionListeners(false /* finish */);880    exitCode = this.exitCodeListener.getStatus();881    if (exitCodeListener.noTestsFound()) {882      if (TestRunner.getVerbose() > 1) {883        System.err.println("[TestNG] No tests found. Nothing was run");884        usage();885      }886    }887    m_instance = null;888    m_jCommander = null;889  }890  /**891   * Run the test suites.892   *893   * <p>This method can be overridden by subclass. <br>894   * For example, DistributedTestNG to run in master/slave mode according to commandline args.895   *896   * @return - List of suites that were run as {@link ISuite} objects.897   * @since 6.9.11 when moving distributed/remote classes out into separate project898   */899  protected List<ISuite> runSuites() {900    return runSuitesLocally();901  }902  private void runSuiteAlterationListeners() {903    for (IAlterSuiteListener l : m_alterSuiteListeners.values()) {904      l.alter(m_suites);905    }906  }907  private void runExecutionListeners(boolean start) {908    for (IExecutionListener l : m_configuration.getExecutionListeners()) {909      if (start) {910        l.onExecutionStart();911      } else {912        l.onExecutionFinish();913      }914    }915  }916  private static void usage() {917    if (m_jCommander == null) {918      m_jCommander = new JCommander(new CommandLineArgs());919    }920    m_jCommander.usage();921  }922  private void generateReports(List<ISuite> suiteRunners) {923    for (IReporter reporter : m_reporters.values()) {924      try {925        long start = System.currentTimeMillis();926        reporter.generateReport(m_suites, suiteRunners, m_outputDir);927        Utils.log(928            "TestNG",929            2,930            "Time taken by " + reporter + ": " + (System.currentTimeMillis() - start) + " ms");931      } catch (Exception ex) {932        System.err.println("[TestNG] Reporter " + reporter + " failed");933        ex.printStackTrace(System.err);934      }935    }936  }937  /**938   * This needs to be public for maven2, for now..At least until an alternative mechanism is found.939   */940  public List<ISuite> runSuitesLocally() {941    if (m_suites.isEmpty()) {942      error("No test suite found. Nothing to run");943      usage();944      return Collections.emptyList();945    }946    SuiteRunnerMap suiteRunnerMap = new SuiteRunnerMap();947    if (m_suites.get(0).getVerbose() >= 2) {948      Version.displayBanner();949    }950    // First initialize the suite runners to ensure there are no configuration issues.951    // Create a map with XmlSuite as key and corresponding SuiteRunner as value952    for (XmlSuite xmlSuite : m_suites) {953      createSuiteRunners(suiteRunnerMap, xmlSuite);954    }955    //956    // Run suites957    //958    if (m_suiteThreadPoolSize == 1 && !m_randomizeSuites) {959      // Single threaded and not randomized: run the suites in order960      for (XmlSuite xmlSuite : m_suites) {961        runSuitesSequentially(962            xmlSuite, suiteRunnerMap, getVerbose(xmlSuite), getDefaultSuiteName());963      }964      //965      // Generate the suites report966      //967      return Lists.newArrayList(suiteRunnerMap.values());968    }969    // Multithreaded: generate a dynamic graph that stores the suite hierarchy. This is then970    // used to run related suites in specific order. Parent suites are run only971    // once all the child suites have completed execution972    IDynamicGraph<ISuite> suiteGraph = new DynamicGraph<>();973    for (XmlSuite xmlSuite : m_suites) {974      populateSuiteGraph(suiteGraph, suiteRunnerMap, xmlSuite);975    }976    IThreadWorkerFactory<ISuite> factory =977        new SuiteWorkerFactory(978            suiteRunnerMap, 0 /* verbose hasn't been set yet */, getDefaultSuiteName());979    ITestNGThreadPoolExecutor pooledExecutor = this.getExecutorFactory().newSuiteExecutor(980            "suites",981            suiteGraph,982            factory,983            m_suiteThreadPoolSize,984            m_suiteThreadPoolSize,985            Integer.MAX_VALUE,986            TimeUnit.MILLISECONDS,987            new LinkedBlockingQueue<>(),988            null);989    Utils.log("TestNG", 2, "Starting executor for all suites");990    // Run all suites in parallel991    pooledExecutor.run();992    try {993      pooledExecutor.awaitTermination(Long.MAX_VALUE, TimeUnit.MILLISECONDS);994      pooledExecutor.shutdownNow();995    } catch (InterruptedException handled) {996      Thread.currentThread().interrupt();997      error("Error waiting for concurrent executors to finish " + handled.getMessage());998    }999    //1000    // Generate the suites report1001    //1002    return Lists.newArrayList(suiteRunnerMap.values());1003  }1004  private static void error(String s) {1005    LOGGER.error(s);1006  }1007  /**1008   * @return the verbose level, checking in order: the verbose level on the suite, the verbose level1009   *     on the TestNG object, or 1.1010   */1011  private int getVerbose(XmlSuite xmlSuite) {1012    return xmlSuite.getVerbose() != null1013        ? xmlSuite.getVerbose()1014        : (m_verbose != null ? m_verbose : DEFAULT_VERBOSE);1015  }1016  /**1017   * Recursively runs suites. Runs the children suites before running the parent suite. This is done1018   * so that the results for parent suite can reflect the combined results of the children suites.1019   *1020   * @param xmlSuite XML Suite to be executed1021   * @param suiteRunnerMap Maps {@code XmlSuite}s to respective {@code ISuite}1022   * @param verbose verbose level1023   * @param defaultSuiteName default suite name1024   */1025  private void runSuitesSequentially(1026      XmlSuite xmlSuite, SuiteRunnerMap suiteRunnerMap, int verbose, String defaultSuiteName) {1027    for (XmlSuite childSuite : xmlSuite.getChildSuites()) {1028      runSuitesSequentially(childSuite, suiteRunnerMap, verbose, defaultSuiteName);1029    }1030    SuiteRunnerWorker srw =1031        new SuiteRunnerWorker(1032            suiteRunnerMap.get(xmlSuite), suiteRunnerMap, verbose, defaultSuiteName);1033    srw.run();1034  }1035  /**1036   * Populates the dynamic graph with the reverse hierarchy of suites. Edges are added pointing from1037   * child suite runners to parent suite runners, hence making parent suite runners dependent on all1038   * the child suite runners1039   *1040   * @param suiteGraph dynamic graph representing the reverse hierarchy of SuiteRunners1041   * @param suiteRunnerMap Map with XMLSuite as key and its respective SuiteRunner as value1042   * @param xmlSuite XML Suite1043   */1044  private void populateSuiteGraph(1045      IDynamicGraph<ISuite> suiteGraph /* OUT */, SuiteRunnerMap suiteRunnerMap, XmlSuite xmlSuite) {1046    ISuite parentSuiteRunner = suiteRunnerMap.get(xmlSuite);1047    if (xmlSuite.getChildSuites().isEmpty()) {1048      suiteGraph.addNode(parentSuiteRunner);1049    } else {1050      for (XmlSuite childSuite : xmlSuite.getChildSuites()) {1051        suiteGraph.addEdge(0, parentSuiteRunner, suiteRunnerMap.get(childSuite));1052        populateSuiteGraph(suiteGraph, suiteRunnerMap, childSuite);1053      }1054    }1055  }1056  /**1057   * Creates the {@code SuiteRunner}s and populates the suite runner map with this information1058   *1059   * @param suiteRunnerMap Map with XMLSuite as key and it's respective SuiteRunner as value. This1060   *     is updated as part of this method call1061   * @param xmlSuite Xml Suite (and its children) for which {@code SuiteRunner}s are created1062   */1063  private void createSuiteRunners(SuiteRunnerMap suiteRunnerMap /* OUT */, XmlSuite xmlSuite) {1064    if (null != m_isJUnit && !m_isJUnit.equals(XmlSuite.DEFAULT_JUNIT)) {1065      xmlSuite.setJUnit(m_isJUnit);1066    }1067    // If the skip flag was invoked on the command line, it1068    // takes precedence1069    if (null != m_skipFailedInvocationCounts) {1070      xmlSuite.setSkipFailedInvocationCounts(m_skipFailedInvocationCounts);1071    }1072    // Override the XmlSuite verbose value with the one from TestNG1073    if (m_verbose != null) {1074      xmlSuite.setVerbose(m_verbose);1075    }1076    if (null != m_configFailurePolicy) {1077      xmlSuite.setConfigFailurePolicy(m_configFailurePolicy);1078    }1079    Set<XmlMethodSelector> selectors = Sets.newHashSet();1080    for (XmlTest t : xmlSuite.getTests()) {1081      for (Map.Entry<String, Integer> ms : m_methodDescriptors.entrySet()) {1082        XmlMethodSelector xms = new XmlMethodSelector();1083        xms.setName(ms.getKey());1084        xms.setPriority(ms.getValue());1085        selectors.add(xms);1086      }1087      selectors.addAll(m_selectors);1088      t.getMethodSelectors().addAll(Lists.newArrayList(selectors));1089    }1090    suiteRunnerMap.put(xmlSuite, createSuiteRunner(xmlSuite));1091    for (XmlSuite childSuite : xmlSuite.getChildSuites()) {1092      createSuiteRunners(suiteRunnerMap, childSuite);1093    }1094  }1095  /** Creates a suite runner and configures its initial state */1096  private SuiteRunner createSuiteRunner(XmlSuite xmlSuite) {1097    DataProviderHolder holder = new DataProviderHolder();1098    holder.addListeners(m_dataProviderListeners.values());1099    holder.addInterceptors(m_dataProviderInterceptors.values());1100    SuiteRunner result =1101        new SuiteRunner(1102            getConfiguration(),1103            xmlSuite,1104            m_outputDir,1105            m_testRunnerFactory,1106            m_useDefaultListeners,1107            m_methodInterceptors,1108            m_invokedMethodListeners.values(),1109            m_testListeners.values(),1110            m_classListeners.values(),1111            holder,1112            Systematiser.getComparator());...Source:TestInvoker.java  
...204    return dpListeners;205  }206  private DataProviderHolder buildDataProviderHolder() {207    DataProviderHolder holder = new DataProviderHolder();208    holder.addListeners(dataProviderListeners());209    holder.addInterceptors(this.holder.getInterceptors());210    return holder;211  }212  /**213   * Checks to see of the test method has certain dependencies that prevents TestNG from executing214   * it215   *216   * @param testMethod test method being checked for217   * @return error message or null if dependencies have been run successfully218   */219  private String checkDependencies(ITestNGMethod testMethod) {220    // If this method is marked alwaysRun, no need to check for its dependencies221    if (testMethod.isAlwaysRun()) {222      return null;...Source:SuiteRunner.java  
...494        Collection<IInvokedMethodListener> listeners,495        List<IClassListener> classListeners,496        Map<Class<? extends IDataProviderListener>, IDataProviderListener> dataProviderListeners) {497      DataProviderHolder holder = new DataProviderHolder();498      holder.addListeners(dataProviderListeners.values());499      return newTestRunner(suite, test, listeners, classListeners, holder);500    }501    @Override502    public TestRunner newTestRunner(ISuite suite, XmlTest test,503        Collection<IInvokedMethodListener> listeners, List<IClassListener> classListeners,504        DataProviderHolder holder) {505      boolean skip = skipFailedInvocationCounts;506      if (!skip) {507        skip = test.skipFailedInvocationCounts();508      }509      TestRunner testRunner =510          new TestRunner(511              configuration,512              suite,513              test,514              suite.getOutputDirectory(),515              suite.getAnnotationFinder(),516              skip,517              listeners,518              classListeners,519              comparator, holder);520      if (useDefaultListeners) {521        testRunner.addListener(new TestHTMLReporter());522        testRunner.addListener(new JUnitXMLReporter());523        // TODO: Moved these here because maven2 has output reporters running524        // already, the output from these causes directories to be created with525        // files. This is not the desired behaviour of running tests in maven2.526        // Don't know what to do about this though, are people relying on these527        // to be added even with defaultListeners set to false?528        testRunner.addListener(new TextReporter(testRunner.getName(), TestRunner.getVerbose()));529      }530      for (ITestListener itl : failureGenerators) {531        testRunner.addTestListener(itl);532      }533      for (IConfigurationListener cl : configuration.getConfigurationListeners()) {534        testRunner.addConfigurationListener(cl);535      }536      return testRunner;537    }538  }539  private static class ProxyTestRunnerFactory implements ITestRunnerFactory {540    private final ITestListener[] failureGenerators;541    private final ITestRunnerFactory target;542    public ProxyTestRunnerFactory(ITestListener[] failureListeners, ITestRunnerFactory target) {543      failureGenerators = failureListeners;544      this.target = target;545    }546    @Override547    public TestRunner newTestRunner(548        ISuite suite,549        XmlTest test,550        Collection<IInvokedMethodListener> listeners,551        List<IClassListener> classListeners) {552      return newTestRunner(suite, test, listeners, classListeners, Collections.emptyMap());553    }554    @Override555    public TestRunner newTestRunner(556        ISuite suite,557        XmlTest test,558        Collection<IInvokedMethodListener> listeners,559        List<IClassListener> classListeners,560        Map<Class<? extends IDataProviderListener>, IDataProviderListener> dataProviderListeners) {561      DataProviderHolder holder = new DataProviderHolder();562      holder.addListeners(dataProviderListeners.values());563      return newTestRunner(suite, test, listeners, classListeners, holder);564    }565    @Override566    public TestRunner newTestRunner(ISuite suite, XmlTest test,567        Collection<IInvokedMethodListener> listeners, List<IClassListener> classListeners,568        DataProviderHolder holder) {569      TestRunner testRunner = target.newTestRunner(suite, test, listeners, classListeners, holder);570      testRunner.addListener(new TextReporter(testRunner.getName(), TestRunner.getVerbose()));571      for (ITestListener itl : failureGenerators) {572        testRunner.addListener(itl);573      }574      return testRunner;575    }576  }...Source:DataProviderHolder.java  
...14  }15  public Collection<IDataProviderInterceptor> getInterceptors() {16    return Collections.unmodifiableCollection(interceptors);17  }18  public void addListeners(Collection<IDataProviderListener> listeners) {19    listeners.forEach(this::addListener);20  }21  public void addListener(IDataProviderListener listener) {22    listeners.add(listener);23  }24  public void addInterceptors(Collection<IDataProviderInterceptor> interceptors) {25    interceptors.forEach(this::addInterceptor);26  }27  public void addInterceptor(IDataProviderInterceptor interceptor) {28    interceptors.add(interceptor);29  }30  public void merge(DataProviderHolder other) {31    this.listeners.addAll(other.getListeners());32    this.interceptors.addAll(other.getInterceptors());...addListeners
Using AI Code Generation
1DataProviderHolder dph = new DataProviderHolder();2dph.addListeners(new IDataProviderListener[]{new DataProviderListener()});3DataProviderHolder dph = new DataProviderHolder();4dph.addDataProvider("dp1", new IDataProvider() {5    public Object[][] provide(Method method, ITestContext context) {6        return new Object[][]{{"data1"}};7    }8});9DataProviderHolder dph = new DataProviderHolder();10dph.removeDataProvider("dp1");11DataProviderHolder dph = new DataProviderHolder();12dph.addDataProvider("dp1", new IDataProvider() {13    public Object[][] provide(Method method, ITestContext context) {14        return new Object[][]{{"data1"}};15    }16});17DataProviderHolder dph = new DataProviderHolder();18dph.removeDataProvider("dp1");addListeners
Using AI Code Generation
1package com.example;2import org.testng.IInvokedMethod;3import org.testng.IInvokedMethodListener;4import org.testng.IListenerFactory;5import org.testng.IRetryAnalyzer;6import org.testng.ITestContext;7import org.testng.ITestListener;8import org.testng.ITestResult;9import org.testng.TestListenerAdapter;10import org.testng.annotations.DataProvider;11import org.testng.annotations.Listeners;12import org.testng.annotations.Test;13import org.testng.internal.DataProviderHolder;14import java.lang.reflect.Method;15import java.util.ArrayList;16import java.util.List;17@Listeners({DataProviderHolderTest.TestListener.class})18public class DataProviderHolderTest {19  @Test(dataProvider = "dataProvider")20  public void test(String param) {21    System.out.println("param: " + param);22  }23  public Object[][] dataProvider() {24    return new Object[][]{{"param1"}, {"param2"}};25  }26      IInvokedMethodListener, IListenerFactory {27    private List<Object> listeners = new ArrayList<>();28    public void onTestStart(ITestResult result) {29      super.onTestStart(result);30      System.out.println("onTestStart");31    }32    public void onTestSuccess(ITestResult result) {33      super.onTestSuccess(result);34      System.out.println("onTestSuccess");35    }36    public void onTestFailure(ITestResult result) {37      super.onTestFailure(result);38      System.out.println("onTestFailure");39    }40    public void onTestSkipped(ITestResult result) {41      super.onTestSkipped(result);42      System.out.println("onTestSkipped");43    }44    public void onTestFailedButWithinSuccessPercentage(ITestResult result) {TestNG is a Java-based open-source framework for test automation that includes various test types, such as unit testing, functional testing, E2E testing, etc. TestNG is in many ways similar to JUnit and NUnit. But in contrast to its competitors, its extensive features make it a lot more reliable framework. One of the major reasons for its popularity is its ability to structure tests and improve the scripts' readability and maintainability. Another reason can be the important characteristics like the convenience of using multiple annotations, reliance, and priority that make this framework popular among developers and testers for test design. You can refer to the TestNG tutorial to learn why you should choose the TestNG framework.
You can push your abilities to do automated testing using TestNG and advance your career by earning a TestNG certification. Check out our TestNG certification.
Watch this complete tutorial to learn how you can leverage the capabilities of the TestNG framework for Selenium automation testing.
Get 100 minutes of automation test minutes FREE!!
