summaryrefslogtreecommitdiff
path: root/docs/tutorials/wiki2/tests.rst
diff options
context:
space:
mode:
Diffstat (limited to 'docs/tutorials/wiki2/tests.rst')
-rw-r--r--docs/tutorials/wiki2/tests.rst138
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/