| |
| <!DOCTYPE html> |
| |
| |
| <html lang="en" data-content_root="../../../" > |
| |
| <head> |
| <meta charset="utf-8" /> |
| <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" /> |
| |
| <title>Testing ๐งช — Apache Arrow v23.0.0.dev37</title> |
| |
| |
| |
| <script data-cfasync="false"> |
| document.documentElement.dataset.mode = localStorage.getItem("mode") || ""; |
| document.documentElement.dataset.theme = localStorage.getItem("theme") || ""; |
| </script> |
| <!-- |
| this give us a css class that will be invisible only if js is disabled |
| --> |
| <noscript> |
| <style> |
| .pst-js-only { display: none !important; } |
| |
| </style> |
| </noscript> |
| |
| <!-- Loaded before other Sphinx assets --> |
| <link href="../../../_static/styles/theme.css?digest=8878045cc6db502f8baf" rel="stylesheet" /> |
| <link href="../../../_static/styles/pydata-sphinx-theme.css?digest=8878045cc6db502f8baf" rel="stylesheet" /> |
| |
| <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=03e43079" /> |
| <link rel="stylesheet" type="text/css" href="../../../_static/copybutton.css?v=76b2166b" /> |
| <link rel="stylesheet" type="text/css" href="../../../_static/sphinx-design.min.css?v=95c83b7e" /> |
| <link rel="stylesheet" type="text/css" href="../../../_static/theme_overrides.css?v=8dcd28dc" /> |
| |
| <!-- So that users can add custom icons --> |
| <script src="../../../_static/scripts/fontawesome.js?digest=8878045cc6db502f8baf"></script> |
| <!-- Pre-loaded scripts that we'll load fully later --> |
| <link rel="preload" as="script" href="../../../_static/scripts/bootstrap.js?digest=8878045cc6db502f8baf" /> |
| <link rel="preload" as="script" href="../../../_static/scripts/pydata-sphinx-theme.js?digest=8878045cc6db502f8baf" /> |
| |
| <script src="../../../_static/documentation_options.js?v=9fc6757a"></script> |
| <script src="../../../_static/doctools.js?v=9bcbadda"></script> |
| <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script> |
| <script src="../../../_static/clipboard.min.js?v=a7894cd8"></script> |
| <script src="../../../_static/copybutton.js?v=3bb21c8c"></script> |
| <script src="../../../_static/design-tabs.js?v=f930bc37"></script> |
| <script>DOCUMENTATION_OPTIONS.pagename = 'developers/guide/step_by_step/testing';</script> |
| <script> |
| DOCUMENTATION_OPTIONS.theme_version = '0.16.1'; |
| DOCUMENTATION_OPTIONS.theme_switcher_json_url = '/docs/_static/versions.json'; |
| DOCUMENTATION_OPTIONS.theme_switcher_version_match = 'dev/'; |
| DOCUMENTATION_OPTIONS.show_version_warning_banner = |
| true; |
| </script> |
| <link rel="canonical" href="https://arrow.apache.org/docs/developers/guide/step_by_step/testing.html" /> |
| <link rel="icon" href="../../../_static/favicon.ico"/> |
| <link rel="index" title="Index" href="../../../genindex.html" /> |
| <link rel="search" title="Search" href="../../../search.html" /> |
| <link rel="next" title="Styling ๐" href="styling.html" /> |
| <link rel="prev" title="Working on the Arrow codebase ๐ง" href="arrow_codebase.html" /> |
| |
| <meta name="viewport" content="width=device-width, initial-scale=1"/> |
| <meta name="docsearch:language" content="en"/> |
| <meta name="docsearch:version" content="23.0.0.dev37" /> |
| |
| <!-- Matomo --> |
| <script> |
| var _paq = window._paq = window._paq || []; |
| /* tracker methods like "setCustomDimension" should be called before "trackPageView" */ |
| /* We explicitly disable cookie tracking to avoid privacy issues */ |
| _paq.push(['disableCookies']); |
| _paq.push(['trackPageView']); |
| _paq.push(['enableLinkTracking']); |
| (function() { |
| var u="https://analytics.apache.org/"; |
| _paq.push(['setTrackerUrl', u+'matomo.php']); |
| _paq.push(['setSiteId', '20']); |
| var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0]; |
| g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s); |
| })(); |
| </script> |
| <!-- End Matomo Code --> |
| |
| </head> |
| |
| |
| <body data-bs-spy="scroll" data-bs-target=".bd-toc-nav" data-offset="180" data-bs-root-margin="0px 0px -60%" data-default-mode=""> |
| |
| |
| |
| <div id="pst-skip-link" class="skip-link d-print-none"><a href="#main-content">Skip to main content</a></div> |
| |
| <div id="pst-scroll-pixel-helper"></div> |
| |
| <button type="button" class="btn rounded-pill" id="pst-back-to-top"> |
| <i class="fa-solid fa-arrow-up"></i>Back to top</button> |
| |
| |
| <dialog id="pst-search-dialog"> |
| |
| <form class="bd-search d-flex align-items-center" |
| action="../../../search.html" |
| method="get"> |
| <i class="fa-solid fa-magnifying-glass"></i> |
| <input type="search" |
| class="form-control" |
| name="q" |
| placeholder="Search the docs ..." |
| aria-label="Search the docs ..." |
| autocomplete="off" |
| autocorrect="off" |
| autocapitalize="off" |
| spellcheck="false"/> |
| <span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd>K</kbd></span> |
| </form> |
| </dialog> |
| |
| <div class="pst-async-banner-revealer d-none"> |
| <aside id="bd-header-version-warning" class="d-none d-print-none" aria-label="Version warning"></aside> |
| </div> |
| |
| |
| <header class="bd-header navbar navbar-expand-lg bd-navbar d-print-none"> |
| <div class="bd-header__inner bd-page-width"> |
| <button class="pst-navbar-icon sidebar-toggle primary-toggle" aria-label="Site navigation"> |
| <span class="fa-solid fa-bars"></span> |
| </button> |
| |
| |
| <div class=" navbar-header-items__start"> |
| |
| <div class="navbar-item"> |
| |
| |
| |
| |
| |
| <a class="navbar-brand logo" href="../../../index.html"> |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| <img src="../../../_static/arrow.png" class="logo__image only-light" alt="Apache Arrow v23.0.0.dev37 - Home"/> |
| <img src="../../../_static/arrow-dark.png" class="logo__image only-dark pst-js-only" alt="Apache Arrow v23.0.0.dev37 - Home"/> |
| |
| |
| </a></div> |
| |
| </div> |
| |
| <div class=" navbar-header-items"> |
| |
| <div class="me-auto navbar-header-items__center"> |
| |
| <div class="navbar-item"> |
| <nav> |
| <ul class="bd-navbar-elements navbar-nav"> |
| |
| <li class="nav-item "> |
| <a class="nav-link nav-internal" href="../../../format/index.html"> |
| Specifications |
| </a> |
| </li> |
| |
| |
| <li class="nav-item current active"> |
| <a class="nav-link nav-internal" href="../../index.html"> |
| Development |
| </a> |
| </li> |
| |
| |
| <li class="nav-item "> |
| <a class="nav-link nav-internal" href="../../../implementations.html"> |
| Implementations |
| </a> |
| </li> |
| |
| </ul> |
| </nav></div> |
| |
| </div> |
| |
| |
| <div class="navbar-header-items__end"> |
| |
| <div class="navbar-item navbar-persistent--container"> |
| |
| |
| <button class="btn search-button-field search-button__button pst-js-only" title="Search" aria-label="Search" data-bs-placement="bottom" data-bs-toggle="tooltip"> |
| <i class="fa-solid fa-magnifying-glass"></i> |
| <span class="search-button__default-text">Search</span> |
| <span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd class="kbd-shortcut__modifier">K</kbd></span> |
| </button> |
| </div> |
| |
| |
| <div class="navbar-item"><div class="kapa-ai-bot"> |
| <script |
| async |
| src="https://widget.kapa.ai/kapa-widget.bundle.js" |
| data-website-id="9db461d5-ac77-4b3f-a5c5-75efa78339d2" |
| data-project-name="Apache Arrow" |
| data-project-color="#000000" |
| data-project-logo="https://arrow.apache.org/img/arrow-logo_chevrons_white-txt_black-bg.png" |
| data-modal-disclaimer="This is a custom LLM with access to all [Arrow documentation](https://arrow.apache.org/docs/). Please include the language you are using in your question, e.g., Python, C++, Java, R, etc." |
| data-consent-required="true" |
| data-user-analytics-cookie-enabled="false" |
| data-consent-screen-disclaimer="By clicking "I agree, let's chat", you consent to the use of the AI assistant in accordance with kapa.ai's [Privacy Policy](https://www.kapa.ai/content/privacy-policy). This service uses reCAPTCHA, which requires your consent to Google's [Privacy Policy](https://policies.google.com/privacy) and [Terms of Service](https://policies.google.com/terms). By proceeding, you explicitly agree to both kapa.ai's and Google's privacy policies." |
| ></script> |
| |
| </div> |
| |
| </div> |
| |
| <div class="navbar-item"> |
| <div class="version-switcher__container dropdown pst-js-only"> |
| <button id="pst-version-switcher-button-2" |
| type="button" |
| class="version-switcher__button btn btn-sm dropdown-toggle" |
| data-bs-toggle="dropdown" |
| aria-haspopup="listbox" |
| aria-controls="pst-version-switcher-list-2" |
| aria-label="Version switcher list" |
| > |
| Choose version <!-- this text may get changed later by javascript --> |
| <span class="caret"></span> |
| </button> |
| <div id="pst-version-switcher-list-2" |
| class="version-switcher__menu dropdown-menu list-group-flush py-0" |
| role="listbox" aria-labelledby="pst-version-switcher-button-2"> |
| <!-- dropdown will be populated by javascript on page load --> |
| </div> |
| </div></div> |
| |
| <div class="navbar-item"> |
| |
| <button class="btn btn-sm nav-link pst-navbar-icon theme-switch-button pst-js-only" aria-label="Color mode" data-bs-title="Color mode" data-bs-placement="bottom" data-bs-toggle="tooltip"> |
| <i class="theme-switch fa-solid fa-sun fa-lg" data-mode="light" title="Light"></i> |
| <i class="theme-switch fa-solid fa-moon fa-lg" data-mode="dark" title="Dark"></i> |
| <i class="theme-switch fa-solid fa-circle-half-stroke fa-lg" data-mode="auto" title="System Settings"></i> |
| </button></div> |
| |
| <div class="navbar-item"><ul class="navbar-icon-links" |
| aria-label="Icon Links"> |
| <li class="nav-item"> |
| |
| |
| |
| |
| |
| |
| |
| |
| <a href="https://github.com/apache/arrow" title="GitHub" class="nav-link pst-navbar-icon" rel="noopener" target="_blank" data-bs-toggle="tooltip" data-bs-placement="bottom"><i class="fa-brands fa-square-github fa-lg" aria-hidden="true"></i> |
| <span class="sr-only">GitHub</span></a> |
| </li> |
| <li class="nav-item"> |
| |
| |
| |
| |
| |
| |
| |
| |
| <a href="https://www.linkedin.com/company/apache-arrow/" title="LinkedIn" class="nav-link pst-navbar-icon" rel="noopener" target="_blank" data-bs-toggle="tooltip" data-bs-placement="bottom"><i class="fa-brands fa-linkedin fa-lg" aria-hidden="true"></i> |
| <span class="sr-only">LinkedIn</span></a> |
| </li> |
| <li class="nav-item"> |
| |
| |
| |
| |
| |
| |
| |
| |
| <a href="https://bsky.app/profile/arrow.apache.org" title="BlueSky" class="nav-link pst-navbar-icon" rel="noopener" target="_blank" data-bs-toggle="tooltip" data-bs-placement="bottom"><i class="fa-brands fa-bluesky fa-lg" aria-hidden="true"></i> |
| <span class="sr-only">BlueSky</span></a> |
| </li> |
| </ul></div> |
| |
| </div> |
| |
| </div> |
| |
| |
| <div class="navbar-persistent--mobile"> |
| |
| <button class="btn search-button-field search-button__button pst-js-only" title="Search" aria-label="Search" data-bs-placement="bottom" data-bs-toggle="tooltip"> |
| <i class="fa-solid fa-magnifying-glass"></i> |
| <span class="search-button__default-text">Search</span> |
| <span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd class="kbd-shortcut__modifier">K</kbd></span> |
| </button> |
| </div> |
| |
| |
| |
| <button class="pst-navbar-icon sidebar-toggle secondary-toggle" aria-label="On this page"> |
| <span class="fa-solid fa-outdent"></span> |
| </button> |
| |
| </div> |
| |
| </header> |
| |
| |
| <div class="bd-container"> |
| <div class="bd-container__inner bd-page-width"> |
| |
| |
| |
| <dialog id="pst-primary-sidebar-modal"></dialog> |
| <div id="pst-primary-sidebar" class="bd-sidebar-primary bd-sidebar"> |
| |
| |
| |
| <div class="sidebar-header-items sidebar-primary__section"> |
| |
| |
| <div class="sidebar-header-items__center"> |
| |
| |
| |
| <div class="navbar-item"> |
| <nav> |
| <ul class="bd-navbar-elements navbar-nav"> |
| |
| <li class="nav-item "> |
| <a class="nav-link nav-internal" href="../../../format/index.html"> |
| Specifications |
| </a> |
| </li> |
| |
| |
| <li class="nav-item current active"> |
| <a class="nav-link nav-internal" href="../../index.html"> |
| Development |
| </a> |
| </li> |
| |
| |
| <li class="nav-item "> |
| <a class="nav-link nav-internal" href="../../../implementations.html"> |
| Implementations |
| </a> |
| </li> |
| |
| </ul> |
| </nav></div> |
| |
| |
| </div> |
| |
| |
| |
| <div class="sidebar-header-items__end"> |
| |
| <div class="navbar-item"><div class="kapa-ai-bot"> |
| <script |
| async |
| src="https://widget.kapa.ai/kapa-widget.bundle.js" |
| data-website-id="9db461d5-ac77-4b3f-a5c5-75efa78339d2" |
| data-project-name="Apache Arrow" |
| data-project-color="#000000" |
| data-project-logo="https://arrow.apache.org/img/arrow-logo_chevrons_white-txt_black-bg.png" |
| data-modal-disclaimer="This is a custom LLM with access to all [Arrow documentation](https://arrow.apache.org/docs/). Please include the language you are using in your question, e.g., Python, C++, Java, R, etc." |
| data-consent-required="true" |
| data-user-analytics-cookie-enabled="false" |
| data-consent-screen-disclaimer="By clicking "I agree, let's chat", you consent to the use of the AI assistant in accordance with kapa.ai's [Privacy Policy](https://www.kapa.ai/content/privacy-policy). This service uses reCAPTCHA, which requires your consent to Google's [Privacy Policy](https://policies.google.com/privacy) and [Terms of Service](https://policies.google.com/terms). By proceeding, you explicitly agree to both kapa.ai's and Google's privacy policies." |
| ></script> |
| |
| </div> |
| |
| </div> |
| |
| <div class="navbar-item"> |
| <div class="version-switcher__container dropdown pst-js-only"> |
| <button id="pst-version-switcher-button-3" |
| type="button" |
| class="version-switcher__button btn btn-sm dropdown-toggle" |
| data-bs-toggle="dropdown" |
| aria-haspopup="listbox" |
| aria-controls="pst-version-switcher-list-3" |
| aria-label="Version switcher list" |
| > |
| Choose version <!-- this text may get changed later by javascript --> |
| <span class="caret"></span> |
| </button> |
| <div id="pst-version-switcher-list-3" |
| class="version-switcher__menu dropdown-menu list-group-flush py-0" |
| role="listbox" aria-labelledby="pst-version-switcher-button-3"> |
| <!-- dropdown will be populated by javascript on page load --> |
| </div> |
| </div></div> |
| |
| <div class="navbar-item"> |
| |
| <button class="btn btn-sm nav-link pst-navbar-icon theme-switch-button pst-js-only" aria-label="Color mode" data-bs-title="Color mode" data-bs-placement="bottom" data-bs-toggle="tooltip"> |
| <i class="theme-switch fa-solid fa-sun fa-lg" data-mode="light" title="Light"></i> |
| <i class="theme-switch fa-solid fa-moon fa-lg" data-mode="dark" title="Dark"></i> |
| <i class="theme-switch fa-solid fa-circle-half-stroke fa-lg" data-mode="auto" title="System Settings"></i> |
| </button></div> |
| |
| <div class="navbar-item"><ul class="navbar-icon-links" |
| aria-label="Icon Links"> |
| <li class="nav-item"> |
| |
| |
| |
| |
| |
| |
| |
| |
| <a href="https://github.com/apache/arrow" title="GitHub" class="nav-link pst-navbar-icon" rel="noopener" target="_blank" data-bs-toggle="tooltip" data-bs-placement="bottom"><i class="fa-brands fa-square-github fa-lg" aria-hidden="true"></i> |
| <span class="sr-only">GitHub</span></a> |
| </li> |
| <li class="nav-item"> |
| |
| |
| |
| |
| |
| |
| |
| |
| <a href="https://www.linkedin.com/company/apache-arrow/" title="LinkedIn" class="nav-link pst-navbar-icon" rel="noopener" target="_blank" data-bs-toggle="tooltip" data-bs-placement="bottom"><i class="fa-brands fa-linkedin fa-lg" aria-hidden="true"></i> |
| <span class="sr-only">LinkedIn</span></a> |
| </li> |
| <li class="nav-item"> |
| |
| |
| |
| |
| |
| |
| |
| |
| <a href="https://bsky.app/profile/arrow.apache.org" title="BlueSky" class="nav-link pst-navbar-icon" rel="noopener" target="_blank" data-bs-toggle="tooltip" data-bs-placement="bottom"><i class="fa-brands fa-bluesky fa-lg" aria-hidden="true"></i> |
| <span class="sr-only">BlueSky</span></a> |
| </li> |
| </ul></div> |
| |
| </div> |
| |
| </div> |
| |
| <div class="sidebar-primary-items__start sidebar-primary__section"> |
| <div class="sidebar-primary-item"> |
| <nav class="bd-docs-nav bd-links" |
| aria-label="Section Navigation"> |
| <p class="bd-links__title" role="heading" aria-level="1">Section Navigation</p> |
| <div class="bd-toc-item navbar-nav"><ul class="current nav bd-sidenav"> |
| <li class="toctree-l1"><a class="reference internal" href="../../bug_reports.html">Bug reports and feature requests</a></li> |
| <li class="toctree-l1 current active has-children"><a class="reference internal" href="../index.html">New Contributorโs Guide</a><details open="open"><summary><span class="toctree-toggle" role="presentation"><i class="fa-solid fa-chevron-down"></i></span></summary><ul class="current"> |
| <li class="toctree-l2"><a class="reference internal" href="../architectural_overview.html">Architectural Overview</a></li> |
| <li class="toctree-l2"><a class="reference internal" href="../communication.html">Communication</a></li> |
| <li class="toctree-l2 current active has-children"><a class="reference internal" href="index.html">Steps in making your first PR</a><details open="open"><summary><span class="toctree-toggle" role="presentation"><i class="fa-solid fa-chevron-down"></i></span></summary><ul class="current"> |
| <li class="toctree-l3"><a class="reference internal" href="set_up.html">Set up</a></li> |
| <li class="toctree-l3"><a class="reference internal" href="building.html">Building the Arrow libraries ๐๐ฟโโ๏ธ</a></li> |
| <li class="toctree-l3"><a class="reference internal" href="finding_issues.html">Finding good first issues ๐</a></li> |
| <li class="toctree-l3"><a class="reference internal" href="arrow_codebase.html">Working on the Arrow codebase ๐ง</a></li> |
| <li class="toctree-l3 current active"><a class="current reference internal" href="#">Testing ๐งช</a></li> |
| <li class="toctree-l3"><a class="reference internal" href="styling.html">Styling ๐</a></li> |
| <li class="toctree-l3"><a class="reference internal" href="pr_lifecycle.html">Lifecycle of a pull request</a></li> |
| </ul> |
| </details></li> |
| <li class="toctree-l2"><a class="reference internal" href="../documentation.html">Helping with documentation</a></li> |
| <li class="toctree-l2 has-children"><a class="reference internal" href="../tutorials/index.html">Tutorials</a><details><summary><span class="toctree-toggle" role="presentation"><i class="fa-solid fa-chevron-down"></i></span></summary><ul> |
| <li class="toctree-l3"><a class="reference internal" href="../tutorials/python_tutorial.html">Python tutorial</a></li> |
| <li class="toctree-l3"><a class="reference internal" href="../tutorials/r_tutorial.html">R tutorials</a></li> |
| </ul> |
| </details></li> |
| <li class="toctree-l2"><a class="reference internal" href="../resources.html">Additional information and resources</a></li> |
| </ul> |
| </details></li> |
| <li class="toctree-l1"><a class="reference internal" href="../../overview.html">Contributing Overview</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="../../reviewing.html">Reviewing contributions</a></li> |
| <li class="toctree-l1 has-children"><a class="reference internal" href="../../cpp/index.html">C++ Development</a><details><summary><span class="toctree-toggle" role="presentation"><i class="fa-solid fa-chevron-down"></i></span></summary><ul> |
| <li class="toctree-l2"><a class="reference internal" href="../../cpp/building.html">Building Arrow C++</a></li> |
| <li class="toctree-l2"><a class="reference internal" href="../../cpp/development.html">Development Guidelines</a></li> |
| <li class="toctree-l2"><a class="reference internal" href="../../cpp/windows.html">Developing on Windows</a></li> |
| <li class="toctree-l2"><a class="reference internal" href="../../cpp/emscripten.html">Cross compiling for WebAssembly with Emscripten</a></li> |
| <li class="toctree-l2"><a class="reference internal" href="../../cpp/conventions.html">Conventions</a></li> |
| <li class="toctree-l2"><a class="reference internal" href="../../cpp/fuzzing.html">Fuzzing Arrow C++</a></li> |
| <li class="toctree-l2"><a class="reference internal" href="../../cpp/compute.html">Developing Arrow C++ Compute</a></li> |
| <li class="toctree-l2 has-children"><a class="reference internal" href="../../cpp/acero.html">Developing Acero</a><details><summary><span class="toctree-toggle" role="presentation"><i class="fa-solid fa-chevron-down"></i></span></summary><ul> |
| <li class="toctree-l3"><a class="reference internal" href="../../cpp/acero/swiss_table.html">Swiss Table</a></li> |
| </ul> |
| </details></li> |
| </ul> |
| </details></li> |
| <li class="toctree-l1 has-children"><a class="reference internal" href="../../java/index.html">Java Development</a><details><summary><span class="toctree-toggle" role="presentation"><i class="fa-solid fa-chevron-down"></i></span></summary><ul> |
| <li class="toctree-l2"><a class="reference internal" href="../../java/building.html">Building Arrow Java</a></li> |
| <li class="toctree-l2"><a class="reference internal" href="../../java/development.html">Development Guidelines</a></li> |
| </ul> |
| </details></li> |
| <li class="toctree-l1 has-children"><a class="reference internal" href="../../python/index.html">Python Development</a><details><summary><span class="toctree-toggle" role="presentation"><i class="fa-solid fa-chevron-down"></i></span></summary><ul> |
| <li class="toctree-l2"><a class="reference internal" href="../../python/building.html">Building PyArrow</a></li> |
| <li class="toctree-l2"><a class="reference internal" href="../../python/development.html">Developing PyArrow</a></li> |
| </ul> |
| </details></li> |
| <li class="toctree-l1 has-children"><a class="reference internal" href="../../continuous_integration/index.html">Continuous Integration</a><details><summary><span class="toctree-toggle" role="presentation"><i class="fa-solid fa-chevron-down"></i></span></summary><ul> |
| <li class="toctree-l2"><a class="reference internal" href="../../continuous_integration/overview.html">Continuous Integration</a></li> |
| <li class="toctree-l2"><a class="reference internal" href="../../continuous_integration/docker.html">Running Docker Builds</a></li> |
| <li class="toctree-l2"><a class="reference internal" href="../../continuous_integration/archery.html">Daily Development using Archery</a></li> |
| <li class="toctree-l2"><a class="reference internal" href="../../continuous_integration/crossbow.html">Packaging and Testing with Crossbow</a></li> |
| </ul> |
| </details></li> |
| <li class="toctree-l1"><a class="reference internal" href="../../benchmarks.html">Benchmarks</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="../../documentation.html">Building the Documentation</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="../../release.html">Release Management Guide</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="../../release_verification.html">Release Verification Process</a></li> |
| </ul> |
| </div> |
| </nav></div> |
| </div> |
| |
| |
| <div class="sidebar-primary-items__end sidebar-primary__section"> |
| <div class="sidebar-primary-item"> |
| <div id="ethical-ad-placement" |
| class="flat" |
| data-ea-publisher="readthedocs" |
| data-ea-type="readthedocs-sidebar" |
| data-ea-manual="true"> |
| </div></div> |
| </div> |
| |
| |
| </div> |
| |
| <main id="main-content" class="bd-main" role="main"> |
| |
| |
| <div class="bd-content"> |
| <div class="bd-article-container"> |
| |
| <div class="bd-header-article d-print-none"> |
| <div class="header-article-items header-article__inner"> |
| |
| <div class="header-article-items__start"> |
| |
| <div class="header-article-item"> |
| |
| <nav aria-label="Breadcrumb" class="d-print-none"> |
| <ul class="bd-breadcrumbs"> |
| |
| <li class="breadcrumb-item breadcrumb-home"> |
| <a href="../../../index.html" class="nav-link" aria-label="Home"> |
| <i class="fa-solid fa-home"></i> |
| </a> |
| </li> |
| |
| <li class="breadcrumb-item"><a href="../../index.html" class="nav-link">Development</a></li> |
| |
| |
| <li class="breadcrumb-item"><a href="../index.html" class="nav-link">New Contributorโs Guide</a></li> |
| |
| |
| <li class="breadcrumb-item"><a href="index.html" class="nav-link">Steps in making your first PR</a></li> |
| |
| <li class="breadcrumb-item active" aria-current="page"><span class="ellipsis">Testing ๐งช</span></li> |
| </ul> |
| </nav> |
| </div> |
| |
| </div> |
| |
| |
| </div> |
| </div> |
| |
| |
| |
| |
| <div id="searchbox"></div> |
| <article class="bd-article"> |
| |
| <section id="testing"> |
| <span id="id1"></span><h1>Testing ๐งช<a class="headerlink" href="#testing" title="Link to this heading">#</a></h1> |
| <p>In this section we outline steps needed for unit testing in Arrow.</p> |
| <div class="sd-tab-set docutils"> |
| <input checked="checked" id="sd-tab-item-0" name="sd-tab-set-0" type="radio"> |
| <label class="sd-tab-label" for="sd-tab-item-0"> |
| PyArrow</label><div class="sd-tab-content docutils"> |
| <p>We use <a class="reference external" href="https://docs.pytest.org/en/latest/">pytest</a> for |
| unit tests in Python. For more info about the required |
| packages see |
| <a class="reference internal" href="../../python/development.html#python-unit-testing"><span class="std std-ref">Python unit testing section</span></a>.</p> |
| <p><strong>Structure</strong></p> |
| <p>Test layout in PyArrow follows <code class="docutils literal notranslate"><span class="pre">pytest</span></code> structure for |
| <a class="reference external" href="https://docs.pytest.org/en/6.2.x/goodpractices.html#tests-as-part-of-application-code">Tests as part of application code</a>:</p> |
| <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">pyarrow</span><span class="o">/</span> |
| <span class="fm">__init__</span><span class="o">.</span><span class="n">py</span> |
| <span class="n">csv</span><span class="o">.</span><span class="n">py</span> |
| <span class="n">dataset</span><span class="o">.</span><span class="n">py</span> |
| <span class="o">...</span> |
| <span class="n">tests</span><span class="o">/</span> |
| <span class="fm">__init__</span><span class="o">.</span><span class="n">py</span> |
| <span class="n">test_csv</span><span class="o">.</span><span class="n">py</span> |
| <span class="n">test_dataset</span><span class="o">.</span><span class="n">py</span> |
| <span class="o">...</span> |
| </pre></div> |
| </div> |
| <p>Tests for Parquet are located in a separate folder <code class="docutils literal notranslate"><span class="pre">pyarrow/tests/parquet/</span></code>.</p> |
| <p><strong>Running tests</strong></p> |
| <p>To run a specific unit test, use this command in |
| the terminal from the <code class="docutils literal notranslate"><span class="pre">arrow/python</span></code> folder:</p> |
| <div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">$ </span>pytest<span class="w"> </span>pyarrow/tests/test_file.py<span class="w"> </span>-k<span class="w"> </span>test_your_unit_test |
| </pre></div> |
| </div> |
| <p>Run all the tests from one file:</p> |
| <div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">$ </span>pytest<span class="w"> </span>pyarrow/tests/test_file.py |
| </pre></div> |
| </div> |
| <p>Run all the tests:</p> |
| <div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">$ </span>pytest<span class="w"> </span>pyarrow |
| </pre></div> |
| </div> |
| <p>You can also run the tests with <code class="docutils literal notranslate"><span class="pre">python</span> <span class="pre">-m</span> <span class="pre">pytest</span> <span class="pre">[...]</span></code> |
| which is almost equivalent to using <code class="docutils literal notranslate"><span class="pre">pytest</span> <span class="pre">[...]</span></code> directly, |
| except that calling via python will also add the current |
| directory to <code class="docutils literal notranslate"><span class="pre">sys.path</span></code> and can in some cases help if |
| <code class="docutils literal notranslate"><span class="pre">pytest</span> <span class="pre">[...]</span></code> results in an ImportError.</p> |
| <p><strong>Recompiling PyArrow or Arrow C++</strong></p> |
| <p>If the tests start failing, try to recompile PyArrow or |
| Arrow C++. See note in the <a class="reference internal" href="building.html#build-libraries-guide"><span class="std std-ref">Building other Arrow libraries</span></a> |
| section under the PyArrow tab.</p> |
| <p><strong>Fixtures</strong></p> |
| <p>Inside PyArrow test files there can be helper functions |
| and fixtures defined. Also other pytest decorators such as |
| <code class="docutils literal notranslate"><span class="pre">@parametrize</span></code> or <code class="docutils literal notranslate"><span class="pre">@skipif</span></code> are used.</p> |
| <p>For example:</p> |
| <ul class="simple"> |
| <li><p><code class="docutils literal notranslate"><span class="pre">_alltypes_example</span></code> in <code class="docutils literal notranslate"><span class="pre">test_pandas</span></code> supplies a |
| dataframe with 100 rows for all data types.</p></li> |
| <li><p><code class="docutils literal notranslate"><span class="pre">_check_pandas_roundtrip</span></code> in <code class="docutils literal notranslate"><span class="pre">test_pandas</span></code> asserts if the |
| roundtrip from <code class="docutils literal notranslate"><span class="pre">Pandas</span></code> through <code class="docutils literal notranslate"><span class="pre">pa.Table</span></code> or |
| <code class="docutils literal notranslate"><span class="pre">pa.RecordBatch</span></code> back to <code class="docutils literal notranslate"><span class="pre">Pandas</span></code> yields the same result.</p></li> |
| <li><p><code class="docutils literal notranslate"><span class="pre">large_buffer</span></code> fixture supplying a PyArrow buffer of fixed |
| size to the function <code class="docutils literal notranslate"><span class="pre">test_primitive_serialization(large_buffer)</span></code> |
| in <code class="docutils literal notranslate"><span class="pre">test_serialization.py</span></code>.</p></li> |
| </ul> |
| <p>For this reason it is good to look through the file you |
| are planning to add the tests to and see if any of |
| the defined functions or fixtures will be helpful.</p> |
| <p>For more information about <code class="docutils literal notranslate"><span class="pre">pytest</span></code> in general visit |
| <a class="reference external" href="https://docs.pytest.org/en/stable/contents.html">Full pytest documentation</a></p> |
| </div> |
| <input id="sd-tab-item-1" name="sd-tab-set-0" type="radio"> |
| <label class="sd-tab-label" for="sd-tab-item-1"> |
| R package</label><div class="sd-tab-content docutils"> |
| <p>We use <a class="reference external" href="https://testthat.r-lib.org/index.html">testthat</a> for |
| unit testing in R. More specifically, we use the <a class="reference external" href="https://testthat.r-lib.org/articles/third-edition.html">3rd edition |
| of testthat</a>. |
| On rare occasions we might want the behaviour of the 2nd edition |
| of testthat, which is indicated by <code class="docutils literal notranslate"><span class="pre">testthat::local_edition(2)</span></code>.</p> |
| <p><strong>Structure</strong></p> |
| <p>Expect the usual testthat folder structure:</p> |
| <div class="highlight-R notranslate"><div class="highlight"><pre><span></span><span class="n">tests</span> |
| <span class="w"> </span>โโโ<span class="w"> </span><span class="n">testthat</span><span class="w"> </span><span class="c1"># test files live here</span> |
| <span class="w"> </span>โโโ<span class="w"> </span><span class="n">testthat.R</span><span class="w"> </span><span class="c1"># runs tests when R CMD check runs (e.g. with devtools::check())</span> |
| </pre></div> |
| </div> |
| <p>This is the fundamental structure of testing in R with |
| <code class="docutils literal notranslate"><span class="pre">testthat</span></code>. Files such as <code class="docutils literal notranslate"><span class="pre">testthat.R</span></code> are not |
| expected to change very often. For the <code class="docutils literal notranslate"><span class="pre">arrow</span></code> R |
| package <code class="docutils literal notranslate"><span class="pre">testthat.R</span></code> also defines how the results of |
| the various tests are displayed / reported in the console.</p> |
| <p>Usually, most files in the <code class="docutils literal notranslate"><span class="pre">R/</span></code> sub-folder have a |
| corresponding test file in <code class="docutils literal notranslate"><span class="pre">tests/testthat</span></code>.</p> |
| <p><strong>Running tests</strong></p> |
| <p>To run all tests in a package locally call</p> |
| <div class="highlight-R notranslate"><div class="highlight"><pre><span></span><span class="n">devtools</span><span class="o">::</span><span class="nf">test</span><span class="p">()</span> |
| </pre></div> |
| </div> |
| <p>in the R console. Alternatively, you can use</p> |
| <div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">$ </span>make<span class="w"> </span><span class="nb">test</span> |
| </pre></div> |
| </div> |
| <p>in the shell.</p> |
| <p>You can run the tests in a single test file you have open with</p> |
| <div class="highlight-R notranslate"><div class="highlight"><pre><span></span><span class="n">devtools</span><span class="o">::</span><span class="nf">test_active_file</span><span class="p">()</span> |
| </pre></div> |
| </div> |
| <p>All tests are also run as part of our continuous |
| integration (CI) pipelines.</p> |
| <p>The <a class="reference external" href="https://arrow.apache.org/docs/r/articles/developing.html#running-tests">Arrow R Developer guide also has a section</a> |
| on running tests.</p> |
| <p><strong>Good practice</strong></p> |
| <p>In general any change to source code needs to be |
| accompanied by unit tests. All tests are expected |
| to pass before a pull request is merged.</p> |
| <ul class="simple"> |
| <li><p>Add functionality -> add unit tests</p></li> |
| <li><p>Modify functionality -> update unit tests</p></li> |
| <li><p>Solve a bug -> add unit test before solving it, |
| which helps prove the bug and its fix</p></li> |
| <li><p>Performance improvements should be reflected in |
| benchmarks (which are also tests)</p></li> |
| <li><p>An exception could be refactoring functionality that |
| is fully covered by unit tests</p></li> |
| </ul> |
| <p>A good rule of thumb is: If the new functionality is |
| a user-facing or API change, you will almost certainly |
| need to change tests โ if no tests need to be changed, |
| it might mean the tests arenโt right! If the new |
| functionality is a refactor and no APIs are changing, |
| there might not need to be test changes.</p> |
| <p><strong>Testing helpers</strong></p> |
| <p>To complement the <code class="docutils literal notranslate"><span class="pre">testthat</span></code> functionality, the <code class="docutils literal notranslate"><span class="pre">arrow</span></code> |
| R package has defined a series of specific utility |
| functions (called helpers), such as:</p> |
| <ul> |
| <li><p>expectations - these start with <code class="docutils literal notranslate"><span class="pre">expect_</span></code> and are used |
| to compare objects</p> |
| <ul> |
| <li><p>for example, the <code class="docutils literal notranslate"><span class="pre">expect_โฆ_roundtrip()</span></code> functions |
| take an input, convert it to some other format |
| (e.g. arrow, altrep) and then convert it back, |
| confirming that the values are the same.</p> |
| <div class="highlight-R notranslate"><div class="highlight"><pre><span></span><span class="n">x</span><span class="w"> </span><span class="o"><-</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="m">1</span><span class="p">,</span><span class="w"> </span><span class="m">2</span><span class="p">,</span><span class="w"> </span><span class="m">3</span><span class="p">,</span><span class="w"> </span><span class="kc">NA_real_</span><span class="p">)</span> |
| <span class="nf">expect_altrep_roundtrip</span><span class="p">(</span><span class="n">x</span><span class="p">,</span><span class="w"> </span><span class="n">min</span><span class="p">,</span><span class="w"> </span><span class="n">na.rm</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">TRUE</span><span class="p">)</span> |
| </pre></div> |
| </div> |
| </li> |
| </ul> |
| </li> |
| <li><p><code class="docutils literal notranslate"><span class="pre">skip_</span></code> - skips a unit test - think of them as acceptable |
| fails. Situations in which we might want to skip unit tests:</p> |
| <ul class="simple"> |
| <li><p><code class="docutils literal notranslate"><span class="pre">skip_if_r_version()</span></code> - this is a specific <code class="docutils literal notranslate"><span class="pre">arrow</span></code> skip. |
| For example, we use this to skip a unit test when the R |
| version is 3.5.0 and below (<code class="docutils literal notranslate"><span class="pre">skip_if_r_version(โ3.5.0โ)</span></code>). |
| You will likely see it used when the functionality we are |
| testing depends on features introduced after version 3.5.0 |
| of R (such as the alternative representation of vectors, |
| Altrep, introduced in R 3.5.0, but with significant additions |
| in subsequent releases). As part of our CI workflow we test |
| against different versions of R and this is where this |
| feature comes in.</p></li> |
| <li><p><code class="docutils literal notranslate"><span class="pre">skip_if_not_available()</span></code> - another specific {arrow} skip. |
| Arrow (libarrow) has a number of optional features that can be |
| switched on or off (which happens at build time). If a unit |
| test depends on such a feature and this feature is not |
| available (i.e. was not selected when libarrow was built) |
| the test is skipped, as opposed to having a failed test.</p></li> |
| <li><p><code class="docutils literal notranslate"><span class="pre">skip_if_offline()</span></code> - will not run tests that require an |
| internet connection</p></li> |
| <li><p><code class="docutils literal notranslate"><span class="pre">skip_on_os()</span></code> - for unit tests that are OS specific.</p></li> |
| </ul> |
| <p><em>Important</em>: Once the conditions for a <code class="docutils literal notranslate"><span class="pre">skip_()</span></code> statement is met, |
| no other line of code in the same <code class="docutils literal notranslate"><span class="pre">test_that()</span></code> test block will |
| get executed. If the <code class="docutils literal notranslate"><span class="pre">skip</span></code> is outside of a <code class="docutils literal notranslate"><span class="pre">test_that()</span></code> code |
| block, it will skip the rest of the file.</p> |
| </li> |
| </ul> |
| <p>For more information about unit testing in R in general:</p> |
| <ul class="simple"> |
| <li><p>the <code class="docutils literal notranslate"><span class="pre">testthat</span></code> <a class="reference external" href="https://testthat.r-lib.org/index.html">website</a></p></li> |
| <li><p>the <strong>R Packages</strong> <a class="reference external" href="https://r-pkgs.org">book</a> by Hadley Wickham and Jenny Bryan</p></li> |
| </ul> |
| </div> |
| </div> |
| </section> |
| |
| |
| </article> |
| |
| |
| |
| |
| |
| <footer class="prev-next-footer d-print-none"> |
| |
| <div class="prev-next-area"> |
| <a class="left-prev" |
| href="arrow_codebase.html" |
| title="previous page"> |
| <i class="fa-solid fa-angle-left"></i> |
| <div class="prev-next-info"> |
| <p class="prev-next-subtitle">previous</p> |
| <p class="prev-next-title">Working on the Arrow codebase ๐ง</p> |
| </div> |
| </a> |
| <a class="right-next" |
| href="styling.html" |
| title="next page"> |
| <div class="prev-next-info"> |
| <p class="prev-next-subtitle">next</p> |
| <p class="prev-next-title">Styling ๐</p> |
| </div> |
| <i class="fa-solid fa-angle-right"></i> |
| </a> |
| </div> |
| </footer> |
| |
| </div> |
| |
| |
| |
| <dialog id="pst-secondary-sidebar-modal"></dialog> |
| <div id="pst-secondary-sidebar" class="bd-sidebar-secondary bd-toc"><div class="sidebar-secondary-items sidebar-secondary__inner"> |
| |
| |
| <div class="sidebar-secondary-item"> |
| |
| |
| <div class="tocsection editthispage"> |
| <a href="https://github.com/apache/arrow/edit/main/docs/source/developers/guide/step_by_step/testing.rst"> |
| <i class="fa-solid fa-pencil"></i> |
| |
| |
| |
| Edit on GitHub |
| |
| |
| </a> |
| </div> |
| </div> |
| |
| </div></div> |
| |
| |
| </div> |
| <footer class="bd-footer-content"> |
| |
| </footer> |
| |
| </main> |
| </div> |
| </div> |
| |
| <!-- Scripts loaded after <body> so the DOM is not blocked --> |
| <script defer src="../../../_static/scripts/bootstrap.js?digest=8878045cc6db502f8baf"></script> |
| <script defer src="../../../_static/scripts/pydata-sphinx-theme.js?digest=8878045cc6db502f8baf"></script> |
| |
| <footer class="bd-footer"> |
| <div class="bd-footer__inner bd-page-width"> |
| |
| <div class="footer-items__start"> |
| |
| <div class="footer-item"> |
| |
| <p class="copyright"> |
| |
| ยฉ Copyright 2016-2025 Apache Software Foundation. |
| Apache Arrow, Arrow, Apache, the Apache logo, and the Apache Arrow project logo are either registered trademarks or trademarks of The Apache Software Foundation in the United States and other countries. |
| <br/> |
| |
| </p> |
| </div> |
| |
| <div class="footer-item"> |
| |
| <p class="sphinx-version"> |
| Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 8.2.3. |
| <br/> |
| </p> |
| </div> |
| |
| </div> |
| |
| |
| |
| <div class="footer-items__end"> |
| |
| <div class="footer-item"> |
| <p class="theme-version"> |
| <!-- # L10n: Setting the PST URL as an argument as this does not need to be localized --> |
| Built with the <a href="https://pydata-sphinx-theme.readthedocs.io/en/stable/index.html">PyData Sphinx Theme</a> 0.16.1. |
| </p></div> |
| |
| </div> |
| |
| </div> |
| |
| </footer> |
| </body> |
| </html> |