diff options
Diffstat (limited to 'docs/tutorials/wiki2/tests.rst')
| -rw-r--r-- | docs/tutorials/wiki2/tests.rst | 138 |
1 files changed, 78 insertions, 60 deletions
diff --git a/docs/tutorials/wiki2/tests.rst b/docs/tutorials/wiki2/tests.rst index 9aca0c5b7..941a50928 100644 --- a/docs/tutorials/wiki2/tests.rst +++ b/docs/tutorials/wiki2/tests.rst @@ -1,100 +1,118 @@ +.. _wiki2_adding_tests: + ============ Adding Tests ============ -We will now add tests for the models and the views and a few functional -tests in the ``tests.py``. Tests ensure that an application works, and -that it continues to work after changes are made in the future. +We will now add tests for the models and views as well as a few functional +tests in a new ``tests`` subpackage. Tests ensure that an application works, +and that it continues to work when changes are made in the future. +The file ``tests.py`` was generated from choosing the ``sqlalchemy`` backend +option, but it is a common practice to put tests into a ``tests`` +subpackage, especially as projects grow in size and complexity. Each module in +the test subpackage should contain tests for its corresponding module in our +application. Each corresponding pair of modules should have the same names, +except the test module should have the prefix ``test_``. +Start by deleting ``tests.py``, then create a new directory to contain our new +tests as well as a new empty file ``tests/__init__.py``. -Testing the Models -================== +.. warning:: -To test the model class ``Page`` we'll add a new ``PageModelTests`` -class to our ``tests.py`` file that was generated as part of the -``alchemy`` scaffold. + It is very important when refactoring a Python module into a package to be + sure to delete the cache files (``.pyc`` files or ``__pycache__`` folders) + sitting around! Python will prioritize the cache files before traversing + into folders, using the old code, and you will wonder why none of your + changes are working! -Testing the Views -================= -We'll modify our ``tests.py`` file, adding tests for each view -function we added above. As a result, we'll *delete* the -``ViewTests`` class that the ``alchemy`` scaffold provided, and add -four other test classes: ``ViewWikiTests``, ``ViewPageTests``, -``AddPageTests``, and ``EditPageTests``. These test the -``view_wiki``, ``view_page``, ``add_page``, and ``edit_page`` views -respectively. +Test the views +============== + +We'll create a new ``tests/test_views.py`` file, adding a ``BaseTest`` class +used as the base for other test classes. Next we'll add tests for each view +function we previously added to our application. We'll add four test classes: +``ViewWikiTests``, ``ViewPageTests``, ``AddPageTests``, and ``EditPageTests``. +These test the ``view_wiki``, ``view_page``, ``add_page``, and ``edit_page`` +views. + Functional tests ================ -We'll test the whole application, covering security aspects that are not -tested in the unit tests, like logging in, logging out, checking that -the ``viewer`` user cannot add or edit pages, but the ``editor`` user -can, and so on. +We'll test the whole application, covering security aspects that are not tested +in the unit tests, like logging in, logging out, checking that the ``basic`` +user cannot edit pages that it didn't create but the ``editor`` user can, and +so on. -Viewing the results of all our edits to ``tests.py`` -==================================================== -Once we're done with the ``tests.py`` module, it will look a lot like: +View the results of all our edits to ``tests`` subpackage +========================================================= -.. literalinclude:: src/tests/tutorial/tests.py - :linenos: - :language: python +Create ``tutorial/tests/test_views.py`` such that it appears as follows: -Running the Tests -================= +.. literalinclude:: src/tests/tutorial/tests/test_views.py + :linenos: + :language: python -We can run these tests by using ``setup.py test`` in the same way we did in -:ref:`running_tests`. However, first we must edit our ``setup.py`` to -include a dependency on WebTest, which we've used in our ``tests.py``. -Change the ``requires`` list in ``setup.py`` to include ``WebTest``. +Create ``tutorial/tests/test_functional.py`` such that it appears as follows: -.. literalinclude:: src/tests/setup.py - :linenos: - :language: python - :lines: 11-22 - :emphasize-lines: 11 +.. literalinclude:: src/tests/tutorial/tests/test_functional.py + :linenos: + :language: python -After we've added a dependency on WebTest in ``setup.py``, we need to rerun -``setup.py develop`` to get WebTest installed into our virtualenv. Assuming -our shell's current working directory is the "tutorial" distribution -directory: +Create ``tutorial/tests/test_initdb.py`` such that it appears as follows: -On UNIX: +.. literalinclude:: src/tests/tutorial/tests/test_initdb.py + :linenos: + :language: python -.. code-block:: text +Create ``tutorial/tests/test_security.py`` such that it appears as follows: - $ $VENV/bin/python setup.py develop +.. literalinclude:: src/tests/tutorial/tests/test_security.py + :linenos: + :language: python -On Windows: +Create ``tutorial/tests/test_user_model.py`` such that it appears as follows: -.. code-block:: text +.. literalinclude:: src/tests/tutorial/tests/test_user_model.py + :linenos: + :language: python - c:\pyramidtut\tutorial> %VENV%\Scripts\python setup.py develop +.. note:: -Once that command has completed successfully, we can run the tests -themselves: + We're utilizing the excellent WebTest_ package to do functional testing of + the application. This is defined in the ``tests_require`` section of our + ``setup.py``. Any other dependencies needed only for testing purposes can be + added there and will be installed automatically when running + ``setup.py test``. -On UNIX: -.. code-block:: text +Running the tests +================= + +We can run these tests similarly to how we did in :ref:`running_tests`, but first delete the SQLite database ``tutorial.sqlite``. If you do not delete the database, then you will see an integrity error when running the tests. - $ $VENV/bin/python setup.py test -q +On Unix: + +.. code-block:: bash + + rm tutorial.sqlite + $VENV/bin/pytest -q On Windows: -.. code-block:: text +.. code-block:: doscon - c:\pyramidtut\tutorial> %VENV%\Scripts\python setup.py test -q + del tutorial.sqlite + %VENV%\Scripts\pytest -q -The expected result ends something like: +The expected result should look like the following: .. code-block:: text - ...................... - ---------------------------------------------------------------------- - Ran 21 tests in 2.700s + ................................ + 32 passed in 9.90 seconds - OK +.. _webtest: https://docs.pylonsproject.org/projects/webtest/en/latest/ |
