14.14. Testing the server code

The python code on the server is tested with pytest

Tests are kept separate to the code they are testing in a tests sub-folder with the filename of the module appended with _tests.py. So the module camcops_server/cc_modules/cc_patient.py is tested in camcops_server/cc_modules/tests/cc_patient_tests.py.

Test classes should end in Tests e.g. PatientTests. Tests that require an empty database should inherit from DemoRequestTestCase. Tests that require the demonstration database should inherit from DemoDatabaseTestCase. See camcops_server/cc_modules/cc_unittest. Tests that do not require a database can just inherit from the standard python unittest.TestCase

To run all tests whilst in the CamCOPS virtual environment:

cd server/camcops_server
pytest

By default if there is an existing test database, this will be reused.

Custom CamCOPS pytest options:

--create-db

Create a new test database. Necessary when there have been schema changes.

--database-in-memory

Store the database in memory instead of on disk (SQLite only).

--echo

Log all SQL statements to the default log handler

--mysql

Use MySQL instead of the default SQLite

--db-url

SQLAlchemy test database URL (MySQL only, default: mysql+mysqldb://camcops:camcops@localhost:3306/test_camcops?charset=utf8

Some common standard pytest options:

-x

Stop on failure

-k wildcard

Run tests whose classes or files only match the wildcard

-s

Do not capture stdout and stderr. Necessary when debugging with e.g. pdb

--ff

Run previously failed tests first