Testing Flask Applications

FlaskFlaskBeginner
Practice Now

This tutorial is from open-source community. Access the source code

Introduction

In this lab, you will learn how to test Flask applications using the pytest framework. Testing is an important part of the software development process, as it helps to ensure the correctness and reliability of your application. Flask provides utilities for testing, making it easy to write tests for different parts of your application.

Note: You need to create the code file yourself and run it in the environment. You can preview the Flask service status on Web 5000.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL flask(("`Flask`")) -.-> flask/CoreConceptsGroup(["`Core Concepts`"]) flask(("`Flask`")) -.-> flask/DevelopmentToolsGroup(["`Development Tools`"]) flask(("`Flask`")) -.-> flask/DataHandlingGroup(["`Data Handling`"]) flask/CoreConceptsGroup -.-> flask/application_object("`Application Object`") flask/DevelopmentToolsGroup -.-> flask/blueprint_objects("`Blueprint Objects`") flask/DataHandlingGroup -.-> flask/incoming_request_data("`Incoming Request Data`") flask/DataHandlingGroup -.-> flask/response_objects("`Response Objects`") flask/CoreConceptsGroup -.-> flask/sessions("`Sessions`") flask/CoreConceptsGroup -.-> flask/session_interface("`Session Interface`") flask/DevelopmentToolsGroup -.-> flask/test_cli_runner("`Test CLI Runner`") flask/DataHandlingGroup -.-> flask/application_globals("`Application Globals`") flask/CoreConceptsGroup -.-> flask/useful_internals("`Useful Internals`") flask/DevelopmentToolsGroup -.-> flask/command_line_interface("`Command Line Interface`") subgraph Lab Skills flask/application_object -.-> lab-136109{{"`Testing Flask Applications`"}} flask/blueprint_objects -.-> lab-136109{{"`Testing Flask Applications`"}} flask/incoming_request_data -.-> lab-136109{{"`Testing Flask Applications`"}} flask/response_objects -.-> lab-136109{{"`Testing Flask Applications`"}} flask/sessions -.-> lab-136109{{"`Testing Flask Applications`"}} flask/session_interface -.-> lab-136109{{"`Testing Flask Applications`"}} flask/test_cli_runner -.-> lab-136109{{"`Testing Flask Applications`"}} flask/application_globals -.-> lab-136109{{"`Testing Flask Applications`"}} flask/useful_internals -.-> lab-136109{{"`Testing Flask Applications`"}} flask/command_line_interface -.-> lab-136109{{"`Testing Flask Applications`"}} end

Set up the Testing Environment

Before you can start writing tests for your Flask application, you need to set up the testing environment. Here are the steps to do that:

  1. Install the pytest framework by running the following command:

    pip install pytest
  2. Create a new file called conftest.py in the tests folder of your Flask application.

  3. In the conftest.py file, import the necessary modules:

    import pytest
    from my_app import create_app
  4. Define a fixture named app that creates and configures an app instance:

    @pytest.fixture()
    def app():
        app = create_app()
        app.config.update({
            "TESTING": True,
        })
        yield app

    Note that if you are using an application factory pattern, you should modify the fixture accordingly.

  5. Define fixtures for the test client and CLI runner:

    @pytest.fixture()
    def client(app):
        return app.test_client()
    
    @pytest.fixture()
    def runner(app):
        return app.test_cli_runner()

Writing Tests

Now that you have set up the testing environment, you can start writing tests for your Flask application. Here are some examples of common tests you might want to write:

  1. Test a route:

    def test_hello(client):
        response = client.get("/")
        assert response.status_code == 200
        assert b"Hello, World!" in response.data

    This test sends a GET request to the root route ("/") and checks that the response status code is 200 and the response data contains the string "Hello, World!".

  2. Test a POST request:

    def test_login(client):
        response = client.post("/login", data={"username": "test", "password": "pass"})
        assert response.status_code == 200
        assert b"Logged in successfully" in response.data

    This test sends a POST request to the login route ("/login") with form data containing a username and password. It checks that the response status code is 200 and the response data contains the string "Logged in successfully".

  3. Test a command:

    def test_hello_command(runner):
        result = runner.invoke(args=["hello"])
        assert result.exit_code == 0
        assert "Hello, World!" in result.output

    This test invokes a command named "hello" and checks that the command exits with a code of 0 and the output contains the string "Hello, World!".

Running the Tests

To run the tests, navigate to the root folder of your Flask application in the terminal and run the following command:

pytest

This command will discover and run all the tests in the tests folder. You should see the test results in the terminal output.

Summary

In this lab, you learned how to test Flask applications using the pytest framework. You set up the testing environment, wrote tests for different parts of your application, and ran the tests to verify the correctness of your code. Testing is an essential part of the software development process, and writing tests for your Flask application will help ensure its reliability and stability.

Other Flask Tutorials you may like