pytest
The pytest framework makes it easy to write small tests, yet scales to support complex functional testing
Top Related Projects
nose is nicer testing for python
Python version of the Playwright testing and automation library.
A browser automation framework and ecosystem.
Generic automation framework for acceptance testing and RPA
Most popular Mocking framework for unit tests written in Java
Quick Overview
pytest is a popular Python testing framework that provides a simple and powerful way to write and run tests for your Python applications. It supports a wide range of testing scenarios, from unit tests to integration tests, and can be easily integrated with other tools and libraries.
Pros
- Simplicity: pytest has a straightforward and intuitive syntax, making it easy to write and understand tests.
- Flexibility: pytest supports a wide range of testing scenarios, including parametrized tests, fixtures, and markers.
- Extensibility: pytest has a large and active ecosystem of plugins that extend its functionality, such as support for parallel test execution, code coverage, and more.
- Cross-platform: pytest is cross-platform and can be used on Windows, macOS, and Linux.
Cons
- Learning Curve: While pytest is relatively easy to use, it may have a steeper learning curve compared to some other testing frameworks, especially for beginners.
- Dependency Management: pytest relies on a number of dependencies, which can make it more complex to set up and maintain in some environments.
- Performance: For large test suites, pytest may not be as performant as some other testing frameworks, especially when it comes to parallel test execution.
- Compatibility: pytest may not always be compatible with the latest versions of Python or other libraries, which can cause compatibility issues in some cases.
Code Examples
Here are a few examples of how to use pytest:
- Writing a simple test:
def test_add():
assert 2 + 2 == 4
- Using fixtures:
import pytest
@pytest.fixture
def example_data():
return [1, 2, 3]
def test_example(example_data):
assert len(example_data) == 3
- Parametrizing tests:
import pytest
@pytest.mark.parametrize("a, b, expected", [(1, 2, 3), (4, 5, 9), (-1, -2, -3)])
def test_add(a, b, expected):
assert a + b == expected
- Using markers:
import pytest
@pytest.mark.slow
def test_slow_operation():
# Perform a slow operation
pass
Getting Started
To get started with pytest, you can follow these steps:
- Install pytest using pip:
pip install pytest
- Create a new Python file (e.g.,
test_example.py
) and write your first test:
def test_add():
assert 2 + 2 == 4
- Run the tests using the
pytest
command:
pytest
This will run all the tests in the current directory and its subdirectories.
-
Customize your tests by using fixtures, parametrization, and markers as needed.
-
Explore the wide range of pytest plugins available to extend its functionality, such as
pytest-cov
for code coverage orpytest-xdist
for parallel test execution.
For more detailed information on using pytest, you can refer to the pytest documentation.
Competitor Comparisons
nose is nicer testing for python
Pros of nose
- Simpler and more lightweight than pytest
- Easier to get started with for beginners
- Compatible with older Python versions (2.4+)
Cons of nose
- Less active development and community support
- Fewer plugins and extensions available
- Limited fixture functionality compared to pytest
Code Comparison
nose:
from nose.tools import assert_equal
def test_addition():
assert_equal(2 + 2, 4)
pytest:
def test_addition():
assert 2 + 2 == 4
nose uses explicit assertion functions, while pytest allows for more natural assertions. pytest also provides better output and failure messages by default.
nose is simpler to set up and use initially, but pytest offers more advanced features and better extensibility. pytest has become the more popular choice in recent years due to its active development, rich plugin ecosystem, and powerful fixture system.
While nose is still functional, it's worth noting that its development has slowed significantly. For new projects or those looking to modernize their testing setup, pytest is generally the recommended choice due to its ongoing support and feature set.
Python version of the Playwright testing and automation library.
Pros of Playwright-Python
- Comprehensive browser automation with support for Chromium, Firefox, and WebKit
- Built-in async support for better performance in web testing scenarios
- Powerful selectors and auto-waiting mechanisms for more stable tests
Cons of Playwright-Python
- More focused on browser automation, less versatile for general-purpose testing
- Steeper learning curve for those new to browser automation
- Larger dependency footprint due to browser-specific requirements
Code Comparison
Pytest:
def test_example():
assert 1 + 1 == 2
assert "hello" in "hello world"
Playwright-Python:
async def test_example(page):
await page.goto("https://example.com")
assert await page.title() == "Example Domain"
await page.click("text=More information")
Summary
Pytest is a general-purpose testing framework for Python, suitable for a wide range of testing needs. Playwright-Python, on the other hand, specializes in browser automation and end-to-end testing for web applications. While Pytest offers simplicity and flexibility for various testing scenarios, Playwright-Python provides powerful tools for web-specific testing, including cross-browser support and built-in asynchronous capabilities. The choice between the two depends on the specific testing requirements of your project.
A browser automation framework and ecosystem.
Pros of Selenium
- Specialized for web browser automation and testing
- Supports multiple programming languages (Java, Python, C#, etc.)
- Provides direct interaction with web elements and browser controls
Cons of Selenium
- Steeper learning curve for beginners
- Slower test execution compared to pytest
- Requires additional setup and configuration for browser drivers
Code Comparison
Selenium (Python):
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("https://example.com")
element = driver.find_element(By.ID, "my-element")
element.click()
driver.quit()
pytest:
def test_example():
expected = "Hello, World!"
actual = my_function()
assert actual == expected
Selenium focuses on browser automation and interaction with web elements, while pytest is a general-purpose testing framework for Python. Selenium is ideal for end-to-end web testing, while pytest excels in unit and integration testing across various Python projects. Selenium requires more setup but offers powerful browser control, whereas pytest provides a simpler syntax for writing and organizing tests. The choice between the two depends on the specific testing requirements of your project.
Generic automation framework for acceptance testing and RPA
Pros of Robot Framework
- More versatile, supporting various test types (acceptance, system, integration)
- Keyword-driven approach makes tests more readable for non-technical stakeholders
- Built-in support for Selenium and other external libraries
Cons of Robot Framework
- Steeper learning curve, especially for those new to keyword-driven testing
- Less flexibility for complex test logic compared to pytest's Python-based approach
- Slower test execution speed, particularly for large test suites
Code Comparison
Robot Framework:
*** Test Cases ***
Valid Login
Open Browser ${LOGIN_URL} ${BROWSER}
Input Text username ${VALID_USER}
Input Password password ${VALID_PASS}
Submit Form
Page Should Contain Welcome
pytest:
def test_valid_login(browser):
browser.get(LOGIN_URL)
browser.find_element_by_id("username").send_keys(VALID_USER)
browser.find_element_by_id("password").send_keys(VALID_PASS)
browser.find_element_by_id("submit").click()
assert "Welcome" in browser.page_source
Both frameworks offer powerful testing capabilities, but Robot Framework excels in readability and versatility, while pytest provides more flexibility and faster execution for Python-centric projects.
Most popular Mocking framework for unit tests written in Java
Pros of Mockito
- Specialized for mocking, providing a rich set of features for creating and manipulating mock objects
- Intuitive and readable syntax for defining mock behavior
- Strong support for Java and Android development
Cons of Mockito
- Limited to mocking functionality, not a full-featured testing framework
- Steeper learning curve for complex mocking scenarios
- Less flexibility for general-purpose testing compared to pytest
Code Comparison
Mockito example:
import static org.mockito.Mockito.*;
List mockedList = mock(List.class);
when(mockedList.get(0)).thenReturn("first");
assertEquals("first", mockedList.get(0));
pytest example:
def test_list_get(mocker):
mocked_list = mocker.MagicMock()
mocked_list.get.return_value = "first"
assert mocked_list.get(0) == "first"
While both frameworks support mocking, Mockito provides a more specialized and extensive set of mocking features for Java, whereas pytest offers a broader range of testing capabilities for Python, including mocking through plugins like pytest-mock.
Convert designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual CopilotREADME
.. image:: https://github.com/pytest-dev/pytest/raw/main/doc/en/img/pytest_logo_curves.svg :target: https://docs.pytest.org/en/stable/ :align: center :height: 200 :alt: pytest
.. image:: https://img.shields.io/pypi/v/pytest.svg :target: https://pypi.org/project/pytest/
.. image:: https://img.shields.io/conda/vn/conda-forge/pytest.svg :target: https://anaconda.org/conda-forge/pytest
.. image:: https://img.shields.io/pypi/pyversions/pytest.svg :target: https://pypi.org/project/pytest/
.. image:: https://codecov.io/gh/pytest-dev/pytest/branch/main/graph/badge.svg :target: https://codecov.io/gh/pytest-dev/pytest :alt: Code coverage Status
.. image:: https://github.com/pytest-dev/pytest/actions/workflows/test.yml/badge.svg :target: https://github.com/pytest-dev/pytest/actions?query=workflow%3Atest
.. image:: https://results.pre-commit.ci/badge/github/pytest-dev/pytest/main.svg :target: https://results.pre-commit.ci/latest/github/pytest-dev/pytest/main :alt: pre-commit.ci status
.. image:: https://www.codetriage.com/pytest-dev/pytest/badges/users.svg :target: https://www.codetriage.com/pytest-dev/pytest
.. image:: https://readthedocs.org/projects/pytest/badge/?version=latest :target: https://pytest.readthedocs.io/en/latest/?badge=latest :alt: Documentation Status
.. image:: https://img.shields.io/badge/Discord-pytest--dev-blue :target: https://discord.com/invite/pytest-dev :alt: Discord
.. image:: https://img.shields.io/badge/Libera%20chat-%23pytest-orange :target: https://web.libera.chat/#pytest :alt: Libera chat
The pytest
framework makes it easy to write small tests, yet
scales to support complex functional testing for applications and libraries.
An example of a simple test:
.. code-block:: python
# content of test_sample.py
def inc(x):
return x + 1
def test_answer():
assert inc(3) == 5
To execute it::
$ pytest
============================= test session starts =============================
collected 1 items
test_sample.py F
================================== FAILURES ===================================
_________________________________ test_answer _________________________________
def test_answer():
> assert inc(3) == 5
E assert 4 == 5
E + where 4 = inc(3)
test_sample.py:5: AssertionError
========================== 1 failed in 0.04 seconds ===========================
Due to pytest
's detailed assertion introspection, only plain assert
statements are used. See getting-started <https://docs.pytest.org/en/stable/getting-started.html#our-first-test-run>
_ for more examples.
Features
-
Detailed info on failing
assert statements <https://docs.pytest.org/en/stable/how-to/assert.html>
_ (no need to rememberself.assert*
names) -
Auto-discovery <https://docs.pytest.org/en/stable/explanation/goodpractices.html#python-test-discovery>
_ of test modules and functions -
Modular fixtures <https://docs.pytest.org/en/stable/explanation/fixtures.html>
_ for managing small or parametrized long-lived test resources -
Can run
unittest <https://docs.pytest.org/en/stable/how-to/unittest.html>
_ (or trial) test suites out of the box -
Python 3.8+ or PyPy3
-
Rich plugin architecture, with over 1300+
external plugins <https://docs.pytest.org/en/latest/reference/plugin_list.html>
_ and thriving community
Documentation
For full documentation, including installation, tutorials and PDF documents, please see https://docs.pytest.org/en/stable/.
Bugs/Requests
Please use the GitHub issue tracker <https://github.com/pytest-dev/pytest/issues>
_ to submit bugs or request features.
Changelog
Consult the Changelog <https://docs.pytest.org/en/stable/changelog.html>
__ page for fixes and enhancements of each version.
Support pytest
Open Collective
_ is an online funding platform for open and transparent communities.
It provides tools to raise money and share your finances in full transparency.
It is the platform of choice for individuals and companies that want to make one-time or monthly donations directly to the project.
See more details in the pytest collective
_.
.. _Open Collective: https://opencollective.com .. _pytest collective: https://opencollective.com/pytest
pytest for enterprise
Available as part of the Tidelift Subscription.
The maintainers of pytest and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use.
Learn more. <https://tidelift.com/subscription/pkg/pypi-pytest?utm_source=pypi-pytest&utm_medium=referral&utm_campaign=enterprise&utm_term=repo>
_
Security ^^^^^^^^
pytest has never been associated with a security vulnerability, but in any case, to report a
security vulnerability please use the Tidelift security contact <https://tidelift.com/security>
_.
Tidelift will coordinate the fix and disclosure.
License
Copyright Holger Krekel and others, 2004.
Distributed under the terms of the MIT
_ license, pytest is free and open source software.
.. _MIT
: https://github.com/pytest-dev/pytest/blob/main/LICENSE
Top Related Projects
nose is nicer testing for python
Python version of the Playwright testing and automation library.
A browser automation framework and ecosystem.
Generic automation framework for acceptance testing and RPA
Most popular Mocking framework for unit tests written in Java
Convert designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual Copilot