DEV Community

Namah Shrestha
Namah Shrestha

Posted on

Chapter 3: Using PyTest, MyPy and flake8 for testing

3.1 Adding new dependencies to requirements

  • Now we need to install more libraries. Namely pytest, mypy and flake8.
  • So our requirements.txt file looks something like this. We have added dependencies for pytest:

  • Instead of directly overwriting the requirements.txt file, we create a new file called requirements_dev.txt. Since testing is required in dev environment.

  • So we have two requirement files:

    • requirements.txt which we use while running our code:

    • requirements_dev.txt which holds dev dependencies like our test, lint and type check libraries.

  • While running tests we will use requirements_dev.txt file to install dependencies.

3.2 Adding to our metadata in setup.cfg

  • Our setup.cfg file looks something like this:

        name = something
        description = just some dummy codebase
        author = Coding with Zim
        license = MIT
        license_file = LICENSE
        platforms = unix, linux, osx, cygwin, win32
        classifiers = 
            Programming Language :: Python :: 3
            Programming Language :: Python :: 3 :: Only
            Programming Language :: Python :: 3.6
            Programming Language :: Python :: 3.7
            Programming Language :: Python :: 3.8
            Programming Language :: Python :: 3.9
        packages =
        install_requires =
        python_requires = >=3.6
        package_dir =
        zip_safe = no
        something = py.typed
        max-line-length = 160
  • options.extras_require are optional dependencies. We can read more about it here:

  • options.package_data is a type of Data File Support , we can read more about it here: We are basically using it to denote that our code is type-hinted, which means we are using types in the code.

  • For this to work we need to create a py.typed blank file in our something directory alongside

  • flake8 is the configuration for the flake8 linter that we will be using. Here we are only saying that the maximum line length is 160.

  • So our flake8 configuration is stored in the cfg file and our python configuration is stored in our pyproject.toml file.

3.3 Adding python configurations to pyproject.toml

  • Our pyproject.toml file looks something like this:

    requires = ["setuptools>=42.0", "wheel"]
    build-backend = "setuptools.build_meta"
    addopts = "--cov=something"
    testpaths = [
    mypy_path = "src"
    check_untyped_defs = true
    disallow_any_generics = true
    ignore_missing_imports = true
    no_implicit_optional = true
    show_error_codes = true
    strict_equality = true
    warn_redundant_casts = true
    warn_return_any = true
    warn_unreachable = true
    warn_unused_configs = true
    no_implicit_reexport = true
  • We already discussed about the build-system.

  • tool.pytest.ini_options are pytest tool options during the execution of tests. In our case we have added the --cov=something option in addopts so that we see the test coverage. testpaths basically denotes all the directories containing tests.

  • tool.mypy are mypy tool options. To learn about mypy:“Mypy is an optional static,background on the Mypy project.

  • So, now we install the dev dependencies with pip:

    (env)yourproject$ pip install -r requirements_dev.txt
  • Finally we should be able to run our test with pytest, check linting with flake8 and type check with mypy.

    $ pytest # this command will test our code with default test discovery mechanism.
    $ mypy # this command will run type checks on our code with mypy.
    $ flake8 # this command will check code linting.

Top comments (0)