1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
|
.. _wiki2_adding_tests:
============
Adding Tests
============
We will now add tests for the models and views as well as a few functional
tests in a new ``tests`` package. Tests ensure that an application works,
and that it continues to work when changes are made in the future.
The file ``tests/test_it.py`` at the root of our project directory was generated from choosing the ``sqlalchemy`` backend option.
It is a common practice to put tests into a ``tests`` package alongside the application package, especially as projects grow in size and complexity.
Each module in the test package 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/test_it.py``.
.. warning::
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!
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 ``basic``
user cannot edit pages that it didn't create but the ``editor`` user can, and
so on.
View the results of all our edits to ``tests`` package
======================================================
Create ``tests/test_views.py`` such that it appears as follows:
.. literalinclude:: src/tests/tests/test_views.py
:linenos:
:language: python
Create ``tests/test_functional.py`` such that it appears as follows:
.. literalinclude:: src/tests/tests/test_functional.py
:linenos:
:language: python
Create ``tests/test_initdb.py`` such that it appears as follows:
.. literalinclude:: src/tests/tests/test_initdb.py
:linenos:
:language: python
Create ``tests/test_security.py`` such that it appears as follows:
.. literalinclude:: src/tests/tests/test_security.py
:linenos:
:language: python
Create ``tests/test_user_model.py`` such that it appears as follows:
.. literalinclude:: src/tests/tests/test_user_model.py
:linenos:
:language: python
.. note::
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``.
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.
On Unix:
.. code-block:: bash
rm tutorial.sqlite
$VENV/bin/pytest -q
On Windows:
.. code-block:: doscon
del tutorial.sqlite
%VENV%\Scripts\pytest -q
The expected result should look like the following:
.. code-block:: text
...............................
31 passed in 8.85 seconds
.. _webtest: https://docs.pylonsproject.org/projects/webtest/en/latest/
|