Test suite¶
Testing requirements¶
You’ll need:
A running SQL server (PostgreSQL, or SQLite with –sqlite parameters)
python3.7 or higher.
Running tests¶
Oscar uses pytest to run the tests.
The fast way is:
$ make test
This will create a virtualenv in venv, install the test dependencies and run pytest.
Details¶
First we create a virtualenv, install the required dependencies and activate it:
$ make venv
$ source venv/bin/activate
Then we run the test suite using:
$ py.test
You can run a subset of the tests by passing a path:
$ py.test tests/integration/offer/test_availability.py
To run an individual test class, use:
$ py.test tests/integration/offer/test_availability.py::TestASuspendedOffer
(Note the ‘::’.)
To run an individual test, use:
$ py.test tests/integration/offer/test_availability.py::TestASuspendedOffer::test_is_unavailable
You can also run tests which match an expression via:
$ py.test tests/integration/offer/test_availability.py -k is_unavailable
Testing against different setups¶
To run all tests against multiple versions of Django and Python, use tox:
$ tox
You need to have all Python interpreters to test against installed on your system. All other requirements are downloaded automatically.
To speed up the process, you may want to use tox parallel mode.
Kinds of tests¶
Tests are split into 3 folders:
integration - These are for tests that exercise a collection or chain of units, like testing a template tag.
functional - These should be as close to “end-to-end” as possible. Most of these tests should use WebTest to simulate the behaviour of a user browsing the site.
Naming tests¶
When running a subset of tests, Oscar uses the spec plugin. It is a good practice to name your test cases and methods so that the spec output reads well. For example:
$ py.test tests/integration/catalogue/test_product.py --spec
============================ test session starts =============================
platform darwin -- Python 3.6.0, pytest-3.0.6, py-1.4.33, pluggy-0.4.0
rootdir: /Users/sasha0/projects/djangooscar, inifile: setup.cfg
plugins: xdist-1.15.0, warnings-0.2.0, spec-1.1.0, django-3.1.2, cov-2.4.0
collected 15 items
tests/integration/catalogue/test_product.py::ProductCreationTests
[PASS] Allow two products without upc
[PASS] Create products with attributes
[PASS] None upc is represented as empty string
[PASS] Upc uniqueness enforced
tests/integration/catalogue/test_product.py::TopLevelProductTests
[PASS] Top level products are part of browsable set
[PASS] Top level products must have product class
[PASS] Top level products must have titles
tests/integration/catalogue/test_product.py::ChildProductTests
[PASS] Child products are not part of browsable set
[PASS] Child products dont need a product class
[PASS] Child products dont need titles
[PASS] Child products inherit fields
tests/integration/catalogue/test_product.py::TestAChildProduct
[PASS] Delegates requires shipping logic
tests/integration/catalogue/test_product.py::ProductAttributeCreationTests
[PASS] Entity attributes
[PASS] Validating option attribute
tests/integration/catalogue/test_product.py::ProductRecommendationTests
[PASS] Recommended products ordering
========================= 15 passed in 15.39 seconds =========================