.. _tutorial-testing: Bonus: Testing the Application ============================== Now that you have finished the application and everything works as expected, it's probably not a bad idea to add automated tests to simplify modifications in the future. The application above is used as a basic example of how to perform unit testing in the :ref:`testing` section of the documentation. Go there to see how easy it is to test Flask applications. Adding Tests to flaskr ====================== Assuming you have seen the testing section above and have either written your own tests for ``flaskr`` or have followed along with the examples provided, you might be wondering about ways to organize the project. One possible and recommended project structure is:: flaskr/ flaskr/ __init__.py static/ templates/ tests/ context.py test_flaskr.py setup.py MANIFEST.in For now go ahead a create the :file:`tests/` directory as well as the :file:`context.py` and :file:`test_flaskr.py` files, if you haven't already. The context file is used as an import helper. The contents of that file are:: import sys, os basedir = os.path.dirname(os.path.abspath(__file__)) sys.path.insert(0, basedir + '/../') from flaskr import flaskr Testing + Setuptools ==================== One way to handle testing is to integrate it with ``setuptools``. All it requires is adding a couple of lines to the :file:`setup.py` file and creating a new file :file:`setup.cfg`. Go ahead and update the :file:`setup.py` to contain:: from setuptools import setup setup( name='flaskr', packages=['flaskr'], include_package_data=True, install_requires=[ 'flask', ], ) setup_requires=[ 'pytest-runner', ], tests_require=[ 'pytest', ], ) Now create :file:`setup.cfg` in the project root (alongside :file:`setup.py`):: [aliases] test=pytest Now you can run:: python setup.py test This calls on the alias created in :file:`setup.cfg` which in turn runs ``pytest`` via ``pytest-runner``, as the :file:`setup.py` script has been called. (Recall the `setup_requires` argument in :file:`setup.py`) Following the standard rules of test-discovery your tests will be found, run, and hopefully pass. This is one possible way to run and manage testing. Here ``pytest`` is used, but there are other options such as ``nose``. Integrating testing with ``setuptools`` is convenient because it is not necessary to actually download ``pytest`` or any other testing framework one might use.