jamescooke / flake8-aaa

A Flake8 plugin that checks Python tests follow the Arrange-Act-Assert pattern
https://flake8-aaa.readthedocs.io/
MIT License
68 stars 5 forks source link
arrange-act-assert code-quality flake8-plugin linter python tdd test-driven-development testing

Flake8-AAA

.. image:: https://img.shields.io/github/actions/workflow/status/jamescooke/flake8-aaa/build.yml?branch=master :alt: GitHub Workflow Status :target: https://github.com/jamescooke/flake8-aaa/actions?query=branch%3Amaster

.. image:: https://img.shields.io/readthedocs/flake8-aaa.svg :alt: Read the Docs :target: https://flake8-aaa.readthedocs.io/

.. image:: https://img.shields.io/pypi/v/flake8-aaa.svg :alt: PyPI :target: https://pypi.org/project/flake8-aaa/

.. image:: https://img.shields.io/pypi/dm/flake8-aaa :alt: PyPI monthly downloads :target: https://pypistats.org/packages/flake8-aaa

.. image:: https://img.shields.io/pypi/pyversions/flake8-aaa.svg :alt: PyPI - Python Version :target: https://pypi.org/project/flake8-aaa/

.. image:: https://img.shields.io/github/license/jamescooke/flake8-aaa.svg :alt: flake8-aaa is licensed under the MIT License :target: https://github.com/jamescooke/flake8-aaa/blob/master/LICENSE

..

A Flake8 plugin that checks Python tests follow the Arrange-Act-Assert pattern.


📝 Table of Contents

🧐 About

What is the Arrange-Act-Assert pattern? .......................................

"Arrange-Act-Assert" is a testing pattern that focuses each test on a single object's behaviour. It's also known as "AAA" and "3A".

As the name suggests each test is broken down into three distinct parts separated by blank lines:

For example, a simple test on the behaviour of add +:

.. code-block:: python

def test() -> None:
   x = 1
   y = 1

   result = x + y

   assert result == 2

As you can see, the Act block starts with result = and is separated from the Arrange and Assert blocks by blank lines. The test is focused - it only contains one add operation and no further additions occur.

Using AAA consistently makes it easier to find the Action in a test. It's therefore always easy to see the object behaviour each test is focused on.

Further reading:

What is Flake8? ...............

Flake8 is a command line utility for enforcing style consistency across Python projects. It wraps multiple style checking tools and also runs third-party checks provided by plugins, of which Flake8-AAA is one.

Further reading:

What does Flake8-AAA do? ........................

Flake8-AAA extends Flake8 to check your Python tests match the AAA pattern.

It does this by adding the following checks to Flake8:

In the future, Flake8-AAA will check that no test has become too complicated and that Arrange blocks do not contain assertions.

Checking your code with these simple formatting rules helps you write simple, consistently formatted tests that match the AAA pattern. They are most helpful if you call Flake8 regularly, for example when you save a file or before you run a test suite.

Further reading:

🏁 Getting Started

Installation ............

Install flake8-aaa:

.. code-block:: shell

pip install flake8-aaa

This will install Flake8-AAA and its dependencies, which include Flake8.

You can confirm that Flake8 recognises the plugin by checking its version string:

.. code-block:: shell

flake8 --version

.. code-block::

6.1.0 (flake8-aaa: 0.17.0, mccabe: 0.7.0, pycodestyle: 2.11.1, pyflakes: 3.1.0) CPython 3.11.6 on Linux

The flake8-aaa: 0.17.0 part tells you that Flake8-AAA was installed successfully and its checks will be used by Flake8.

Further reading:

First run .........

Let's check the good example from above. We expect Flake8 to return no errors:

.. code-block:: shell

curl https://raw.githubusercontent.com/jamescooke/flake8-aaa/master/examples/good/test_example.py > test_example.py
flake8 test_example.py

Silence - just what we wanted.

Now let's see a failure from Flake8-AAA. We can use a bad example:

.. code-block:: shell

curl https://raw.githubusercontent.com/jamescooke/flake8-aaa/master/examples/bad/test.py > test.py
flake8 test.py

.. code-block::

test.py:4:1: AAA01 no Act block found in test

🎈 Usage

Since Flake8-AAA is a Flake8 plugin, the majority of its usage is dependent on how you use Flake8. In general you can point it at your source code and test suite:

.. code-block:: shell

flake8 src tests

If you're not already using Flake8 then you might consider:

If you just want Flake8-AAA error messages you can filter errors returned by Flake8 with --select:

.. code-block:: shell

flake8 --select AAA tests

Further reading:

⛏️ Compatibility

Flake8-AAA works with:

Further reading:

📕 Resources