<?xml version="1.0" encoding="utf-8" standalone="yes"?><?xml-stylesheet type="text/xsl" href="/rss.xsl"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Python Developer Tooling Handbook – Testing</title>
    <link>https://pydevtools.com/handbook/topics/testing/</link>
    <description>Run pytest, parallelize tests, and matrix-test against Python versions.</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en</language>
    <lastBuildDate>Wed, 08 Apr 2026 13:59:07 -0400</lastBuildDate>
    
	  <atom:link href="https://pydevtools.com/handbook/topics/testing/index.xml" rel="self" type="application/rss+xml" />
    
    <item>
      <title>Do you still need tox or nox if you use uv?</title>
      <link>https://pydevtools.com/handbook/explanation/do-you-still-need-tox-or-nox-if-you-use-uv/</link>
      <pubDate>Sat, 16 May 2026 07:30:29 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/explanation/do-you-still-need-tox-or-nox-if-you-use-uv/</guid>
      <description>&lt;p&gt;For many projects, no. &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt; can run your test suite against multiple Python versions without any extra tool. But &lt;a href=&#34;https://pydevtools.com/handbook/reference/tox/&#34;&gt;tox&lt;/a&gt; and &lt;a href=&#34;https://pydevtools.com/handbook/reference/nox/&#34;&gt;nox&lt;/a&gt; do more than version switching, and the gap between &amp;ldquo;run pytest on 3.12&amp;rdquo; and &amp;ldquo;test five Python versions against two dependency sets in parallel&amp;rdquo; is where they still matter.&lt;/p&gt;
&lt;h2&gt;What uv handles on its own&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;what-uv-handles-on-its-own&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#what-uv-handles-on-its-own&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;uv run --python&lt;/code&gt; selects a Python version and executes a command in your project&amp;rsquo;s environment. If that version is not installed, uv downloads it automatically:&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to Fix Common pytest Errors with uv</title>
      <link>https://pydevtools.com/handbook/how-to/how-to-fix-common-pytest-errors-with-uv/</link>
      <pubDate>Wed, 13 May 2026 06:43:22 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/how-to/how-to-fix-common-pytest-errors-with-uv/</guid>
      <description>&lt;p&gt;pytest failures that have nothing to do with your actual tests are some of the most frustrating errors in Python development. This guide covers the problems people hit most often when running pytest in &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt;-managed projects and how to fix them.&lt;/p&gt;
&lt;h2&gt;ModuleNotFoundError&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;modulenotfounderror&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#modulenotfounderror&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The most common pytest error in uv projects. There are several causes.&lt;/p&gt;
&lt;h3&gt;Missing &lt;code&gt;uv sync&lt;/code&gt;&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;missing-uv-sync&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#missing-uv-sync&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;If you see &lt;code&gt;ModuleNotFoundError&lt;/code&gt; for your own package, the project likely has not been installed into the virtual environment:&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to replace tox with uv and a Makefile</title>
      <link>https://pydevtools.com/handbook/how-to/how-to-replace-tox-with-uv-and-a-makefile/</link>
      <pubDate>Wed, 13 May 2026 06:43:22 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/how-to/how-to-replace-tox-with-uv-and-a-makefile/</guid>
      <description>&lt;p&gt;A Makefile is already the control surface for many Python projects. &lt;code&gt;make test&lt;/code&gt;, &lt;code&gt;make lint&lt;/code&gt;, &lt;code&gt;make format&lt;/code&gt; are muscle memory. Adopting &lt;a href=&#34;https://pydevtools.com/handbook/reference/tox/&#34;&gt;tox&lt;/a&gt; on top means learning a second config format with its own INI DSL, its own matrix syntax, and its own per-environment caching story, just to loop pytest across Python versions.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt; makes that loop possible inside Make itself. Four pattern rules cover what most teams use tox for. The one piece that turns &amp;ldquo;works but slow&amp;rdquo; into a genuine tox replacement is uv&amp;rsquo;s &lt;code&gt;UV_PROJECT_ENVIRONMENT&lt;/code&gt; variable, which lets each Python version keep its own virtual environment side by side instead of rebuilding &lt;code&gt;.venv&lt;/code&gt; on every switch. This guide builds the Makefile from scratch, then shows where it stops being the right tool and &lt;a href=&#34;https://pydevtools.com/handbook/reference/tox-uv/&#34;&gt;tox-uv&lt;/a&gt; or &lt;a href=&#34;https://pydevtools.com/handbook/reference/nox/&#34;&gt;nox&lt;/a&gt; takes over.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to run tests in parallel with pytest-xdist</title>
      <link>https://pydevtools.com/handbook/how-to/how-to-run-tests-in-parallel-with-pytest-xdist/</link>
      <pubDate>Wed, 13 May 2026 06:43:22 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/how-to/how-to-run-tests-in-parallel-with-pytest-xdist/</guid>
      <description>&lt;p&gt;A large test suite that runs sequentially can take minutes. &lt;code&gt;pytest-xdist&lt;/code&gt; distributes tests across multiple worker processes, which can lead to considerable speed ups depending on the test suite and hardware.&lt;/p&gt;
&lt;h2&gt;Installation&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;installation&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#installation&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Add pytest-xdist as a dev dependency using &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt;:&lt;/p&gt;
&lt;div class=&#34;hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code&#34;&gt;

&lt;div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;uv add --dev pytest-xdist&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;hextra-code-copy-btn-container  hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0&#34;&gt;
  &lt;button
    class=&#34;hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50&#34;
    title=&#34;Copy code&#34;
    aria-label=&#34;Copy code&#34;
    data-copied-label=&#34;Copied!&#34;
  &gt;
    &lt;div class=&#34;hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4&#34;&gt;&lt;/div&gt;
&lt;div class=&#34;hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4&#34;&gt;&lt;/div&gt;
  &lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2&gt;Running tests in parallel&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;running-tests-in-parallel&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#running-tests-in-parallel&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Pass &lt;code&gt;-n auto&lt;/code&gt; to let pytest-xdist detect the number of available CPU cores and spawn that many workers:&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to Run Tests Using uv</title>
      <link>https://pydevtools.com/handbook/how-to/how-to-run-tests-using-uv/</link>
      <pubDate>Wed, 13 May 2026 06:43:22 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/how-to/how-to-run-tests-using-uv/</guid>
      <description>&lt;p&gt;If your project lists &lt;a href=&#34;https://pydevtools.com/handbook/reference/pytest/&#34;&gt;pytest&lt;/a&gt; as a dev dependency, run every test with a single command:&lt;/p&gt;
&lt;div class=&#34;hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code&#34;&gt;

&lt;div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;uv run pytest&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;hextra-code-copy-btn-container  hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0&#34;&gt;
  &lt;button
    class=&#34;hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50&#34;
    title=&#34;Copy code&#34;
    aria-label=&#34;Copy code&#34;
    data-copied-label=&#34;Copied!&#34;
  &gt;
    &lt;div class=&#34;hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4&#34;&gt;&lt;/div&gt;
&lt;div class=&#34;hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4&#34;&gt;&lt;/div&gt;
  &lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;uv run&lt;/code&gt; syncs the &lt;a href=&#34;https://pydevtools.com/handbook/explanation/what-is-a-virtual-environment/&#34;&gt;virtual environment&lt;/a&gt; automatically, so the project and its dependencies are always installed before pytest starts.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to Test Against Multiple Python Versions Using uv</title>
      <link>https://pydevtools.com/handbook/how-to/how-to-test-against-multiple-python-versions-using-uv/</link>
      <pubDate>Wed, 13 May 2026 06:43:22 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/how-to/how-to-test-against-multiple-python-versions-using-uv/</guid>
      <description>&lt;p&gt;A library that works on Python 3.11 can break on 3.12 because of removed deprecations, C API changes, or subtle differences in standard library behavior. Catching these failures before your users do requires running tests against each version you support. &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt; makes this straightforward: it downloads Python versions on demand, so there is no need to install them yourself.&lt;/p&gt;
&lt;h2&gt;Prerequisites&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;prerequisites&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#prerequisites&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.astral.sh/uv/getting-started/installation/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;uv installed&lt;/a&gt; on your system&lt;/li&gt;
&lt;li&gt;A Python project with &lt;a href=&#34;https://pydevtools.com/handbook/reference/pytest/&#34;&gt;pytest&lt;/a&gt; configured as a dependency (see &lt;a href=&#34;https://pydevtools.com/handbook/tutorial/setting-up-testing-with-pytest-and-uv/&#34;&gt;Setting up testing with pytest and uv&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Run Tests Against a Single Alternate Version&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;run-tests-against-a-single-alternate-version&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#run-tests-against-a-single-alternate-version&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Pass &lt;code&gt;--python&lt;/code&gt; to select a specific Python version:&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to use uv to speed up tox</title>
      <link>https://pydevtools.com/handbook/how-to/how-to-use-uv-to-speed-up-tox/</link>
      <pubDate>Wed, 13 May 2026 06:43:22 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/how-to/how-to-use-uv-to-speed-up-tox/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://pydevtools.com/handbook/reference/tox/&#34;&gt;tox&lt;/a&gt; spends most of its time creating virtual environments and installing dependencies. The &lt;a href=&#34;https://pydevtools.com/handbook/reference/tox-uv/&#34;&gt;tox-uv&lt;/a&gt; plugin replaces both pip and virtualenv with &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt;, cutting that overhead without changing how you write &lt;code&gt;tox.ini&lt;/code&gt; or run your test matrix.&lt;/p&gt;
&lt;div class=&#34;hx:overflow-x-auto hx:mt-6 hx:flex hx:flex-col hx:rounded-lg hx:border hx:py-4 hx:px-4 hx:border-gray-200 hx:contrast-more:border-current hx:contrast-more:dark:border-current hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200&#34;&gt;
  &lt;p class=&#34;hx:flex hx:items-center hx:font-medium&#34;&gt;&lt;svg height=16px class=&#34;hx:inline-block hx:align-middle hx:mr-2&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; fill=&#34;none&#34; viewBox=&#34;0 0 24 24&#34; stroke-width=&#34;2&#34; stroke=&#34;currentColor&#34; aria-hidden=&#34;true&#34;&gt;&lt;path stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; d=&#34;M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z&#34;/&gt;&lt;/svg&gt;Note&lt;/p&gt;</description>
    </item>
    <item>
      <title>nox: Python Test Automation Tool</title>
      <link>https://pydevtools.com/handbook/reference/nox/</link>
      <pubDate>Sat, 16 May 2026 07:30:29 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/reference/nox/</guid>
      <description>&lt;p&gt;nox manages Python virtual environments and runs tests across multiple Python versions and configurations. Unlike &lt;a href=&#34;https://pydevtools.com/handbook/reference/tox/&#34;&gt;tox&lt;/a&gt;, which uses INI format configuration files, nox uses Python files for configuration, providing more flexibility and control. &lt;a href=&#34;https://pydevtools.com/handbook/reference/hatch/&#34;&gt;Hatch&lt;/a&gt; offers a third approach with its environment matrix system configured in &lt;code&gt;pyproject.toml&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;When to Use nox&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;when-to-use-nox&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#when-to-use-nox&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;nox solves the problem of running test suites, linters, and other checks across multiple Python versions and dependency combinations. Choose nox over &lt;a href=&#34;https://pydevtools.com/handbook/reference/tox/&#34;&gt;tox&lt;/a&gt; when test automation logic requires conditionals, loops, or dynamic session generation that INI configuration cannot express. Projects with straightforward multi-version testing may find &lt;a href=&#34;https://pydevtools.com/handbook/how-to/how-to-test-against-multiple-python-versions-using-uv/&#34;&gt;uv&amp;rsquo;s built-in multi-version support&lt;/a&gt; sufficient without a separate tool; see &lt;a href=&#34;https://pydevtools.com/handbook/explanation/do-you-still-need-tox-or-nox-if-you-use-uv/&#34;&gt;Do you still need tox or nox if you use uv?&lt;/a&gt; for guidance.&lt;/p&gt;</description>
    </item>
    <item>
      <title>pytest: Python Testing Framework</title>
      <link>https://pydevtools.com/handbook/reference/pytest/</link>
      <pubDate>Sat, 16 May 2026 07:30:29 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/reference/pytest/</guid>
      <description>&lt;p&gt;pytest is a mature, feature-rich testing framework for Python that simplifies test writing and execution through a clear, concise syntax. Unlike Python&amp;rsquo;s built-in unittest module, pytest minimizes boilerplate and offers powerful fixture capabilities, parameterized testing, and a comprehensive plugin ecosystem.&lt;/p&gt;
&lt;p&gt;pytest is the standard choice for most Python testing, from small scripts to large applications. Its &lt;code&gt;assert&lt;/code&gt;-based syntax requires less code than unittest, and its fixture system scales well as projects grow. The main reasons to prefer unittest over pytest are maintaining a codebase already committed to unittest conventions or working in an environment where third-party packages are restricted.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Setting up testing with pytest and uv</title>
      <link>https://pydevtools.com/handbook/tutorial/setting-up-testing-with-pytest-and-uv/</link>
      <pubDate>Thu, 14 May 2026 08:14:46 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/tutorial/setting-up-testing-with-pytest-and-uv/</guid>
      <description>&lt;p&gt;Every Python project needs tests, but setting up a test suite from scratch involves decisions about project layout, dependency management, and configuration. This tutorial walks through the full setup using &lt;a href=&#34;https://pydevtools.com/handbook/reference/pytest/&#34;&gt;pytest&lt;/a&gt; and &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt;: creating a project, writing tests, using fixtures, measuring coverage, and configuring defaults.&lt;/p&gt;
&lt;h2&gt;Prerequisites&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;prerequisites&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#prerequisites&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://docs.astral.sh/uv/getting-started/installation/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Install uv on your system.&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Creating a Project with Tests&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;creating-a-project-with-tests&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#creating-a-project-with-tests&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Start by creating a sample project with a test directory structure:&lt;/p&gt;</description>
    </item>
    <item>
      <title>tox: Python Test Automation Tool</title>
      <link>https://pydevtools.com/handbook/reference/tox/</link>
      <pubDate>Fri, 01 May 2026 06:56:25 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/reference/tox/</guid>
      <description>&lt;p&gt;tox is a command-line testing automation tool that manages Python virtual environments and executes tests across multiple Python versions and configurations. It allows developers to define standardized test environments and run tests reliably across different platforms.&lt;/p&gt;
&lt;div class=&#34;hx:overflow-x-auto hx:mt-6 hx:flex hx:rounded-lg hx:border hx:py-2 hx:ltr:pr-4 hx:rtl:pl-4 hx:contrast-more:border-current hx:contrast-more:dark:border-current hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200&#34;&gt;
  &lt;div class=&#34;hx:ltr:pl-3 hx:ltr:pr-2 hx:rtl:pr-3 hx:rtl:pl-2&#34;&gt;&lt;svg height=1.2em class=&#34;hx:inline-block hx:align-middle&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; fill=&#34;none&#34; viewBox=&#34;0 0 24 24&#34; stroke-width=&#34;2&#34; stroke=&#34;currentColor&#34; aria-hidden=&#34;true&#34;&gt;&lt;path stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; d=&#34;M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z&#34;/&gt;&lt;/svg&gt;&lt;/div&gt;

  &lt;div class=&#34;hx:w-full hx:min-w-0 hx:leading-7&#34;&gt;
    &lt;div class=&#34;hx:mt-6 hx:leading-7 hx:first:mt-0&#34;&gt;tox is particularly valuable for library maintainers who must ensure their packages work correctly across multiple Python versions and dependency configurations.&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2&gt;Key Features&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;key-features&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#key-features&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Multi-Environment Testing: Creates and manages separate virtual environments for different Python versions and configurations&lt;/li&gt;
&lt;li&gt;Configuration as Code: Declarative test environment setup in &lt;code&gt;tox.toml&lt;/code&gt;, &lt;code&gt;pyproject.toml&lt;/code&gt; (&lt;code&gt;[tool.tox]&lt;/code&gt;), or &lt;code&gt;tox.ini&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;CI Integration: Commonly used in continuous integration pipelines&lt;/li&gt;
&lt;li&gt;Parallel Execution: Can run test environments concurrently with &lt;code&gt;--parallel&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Dependency Management: Handles installation of test dependencies per environment&lt;/li&gt;
&lt;li&gt;Platform Support: Works across Windows, macOS, and Linux&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Configuration Files&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;configuration-files&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#configuration-files&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;tox 4.21 (September 2024) added native TOML configuration. The current tox documentation recommends TOML over INI for new projects, reserving INI for advanced features that the TOML parser does not yet expose. Four file layouts are supported:&lt;/p&gt;</description>
    </item>
    <item>
      <title>tox-uv: uv backend for tox</title>
      <link>https://pydevtools.com/handbook/reference/tox-uv/</link>
      <pubDate>Tue, 28 Apr 2026 21:54:51 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/reference/tox-uv/</guid>
      <description>&lt;p&gt;tox-uv is a plugin for &lt;a href=&#34;https://pydevtools.com/handbook/reference/tox/&#34;&gt;tox&lt;/a&gt; that replaces pip and virtualenv with &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt;. When installed alongside tox, it activates automatically and handles all virtual environment creation and dependency installation using uv&amp;rsquo;s resolver and installer. No changes to &lt;code&gt;tox.ini&lt;/code&gt; are required for basic usage.&lt;/p&gt;
&lt;h2&gt;Installation&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;installation&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#installation&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The recommended approach installs tox and the plugin together as a uv tool:&lt;/p&gt;
&lt;div class=&#34;hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code&#34;&gt;

&lt;div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;uv tool install tox --with tox-uv&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;hextra-code-copy-btn-container  hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0&#34;&gt;
  &lt;button
    class=&#34;hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50&#34;
    title=&#34;Copy code&#34;
    aria-label=&#34;Copy code&#34;
    data-copied-label=&#34;Copied!&#34;
  &gt;
    &lt;div class=&#34;hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4&#34;&gt;&lt;/div&gt;
&lt;div class=&#34;hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4&#34;&gt;&lt;/div&gt;
  &lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Two distribution packages exist:&lt;/p&gt;</description>
    </item>
    
  </channel>
</rss>
