diff --git a/docs/internals/contributing/writing-code/unit-tests.txt b/docs/internals/contributing/writing-code/unit-tests.txt
index 0737b84888..f47ac5e788 100644
--- a/docs/internals/contributing/writing-code/unit-tests.txt
+++ b/docs/internals/contributing/writing-code/unit-tests.txt
@@ -136,23 +136,40 @@ Running all the tests
 If you want to run the full suite of tests, you'll need to install a number of
 dependencies:
 
+*  Pillow_
 *  PyYAML_
+*  pytz_
 *  setuptools_
 *  memcached_, plus a :ref:`supported Python binding <memcached>`
 *  gettext_ (:ref:`gettext_on_windows`)
-*  selenium_ (if also using Python >= 2.6)
+*  selenium_
+
+You can find these dependencies in `pip requirements files`_ inside the
+``tests/requirements`` directory of the Django source tree and install them
+like so::
+
+    pip install -r tests/requirements/py2.txt  # Python 3: py3.txt
+
+You can also install the database adapter(s) of your choice using
+``oracle.txt``, ``mysql.txt``, or ``postgres.txt``.
 
 If you want to test the memcached cache backend, you'll also need to define
 a :setting:`CACHES` setting that points at your memcached instance.
 
+To run the GeoDjango tests, you will need to :doc:`setup a spatial database
+and install the Geospatial libraries</ref/contrib/gis/install/index>`.
+
 Each of these dependencies is optional. If you're missing any of them, the
 associated tests will be skipped.
 
+.. _Pillow: https://pypi.python.org/pypi/Pillow/
 .. _PyYAML: http://pyyaml.org/wiki/PyYAML
+.. _pytz: https://pypi.python.org/pypi/pytz/
 .. _setuptools: http://pypi.python.org/pypi/setuptools/
 .. _memcached: http://memcached.org/
 .. _gettext: http://www.gnu.org/software/gettext/manual/gettext.html
 .. _selenium: http://pypi.python.org/pypi/selenium
+.. _pip requirements files: http://www.pip-installer.org/en/latest/requirements.html
 
 Code coverage
 ~~~~~~~~~~~~~
diff --git a/tests/requirements/base.txt b/tests/requirements/base.txt
new file mode 100644
index 0000000000..89bd8230b2
--- /dev/null
+++ b/tests/requirements/base.txt
@@ -0,0 +1,6 @@
+bcrypt
+docutils
+Pillow
+PyYAML
+pytz
+selenium
diff --git a/tests/requirements/mysql.txt b/tests/requirements/mysql.txt
new file mode 100644
index 0000000000..c7a2347407
--- /dev/null
+++ b/tests/requirements/mysql.txt
@@ -0,0 +1 @@
+MySQL-python
diff --git a/tests/requirements/oracle.txt b/tests/requirements/oracle.txt
new file mode 100644
index 0000000000..ae5b7349cd
--- /dev/null
+++ b/tests/requirements/oracle.txt
@@ -0,0 +1 @@
+cx_oracle
diff --git a/tests/requirements/postgres.txt b/tests/requirements/postgres.txt
new file mode 100644
index 0000000000..658130bb2c
--- /dev/null
+++ b/tests/requirements/postgres.txt
@@ -0,0 +1 @@
+psycopg2
diff --git a/tests/requirements/py2.txt b/tests/requirements/py2.txt
new file mode 100644
index 0000000000..a9f6804039
--- /dev/null
+++ b/tests/requirements/py2.txt
@@ -0,0 +1,2 @@
+-r base.txt
+python-memcached
diff --git a/tests/requirements/py3.txt b/tests/requirements/py3.txt
new file mode 100644
index 0000000000..ced3eed101
--- /dev/null
+++ b/tests/requirements/py3.txt
@@ -0,0 +1,2 @@
+-r base.txt
+python3-memcached
diff --git a/tests/runtests.py b/tests/runtests.py
index da4592ecc0..0d8df30bf7 100755
--- a/tests/runtests.py
+++ b/tests/runtests.py
@@ -22,6 +22,7 @@ TEMP_DIR = tempfile.mkdtemp(prefix='django_')
 os.environ['DJANGO_TEST_TEMP_DIR'] = TEMP_DIR
 
 SUBDIRS_TO_SKIP = [
+    'requirements',
     'templates',
     'test_discovery_sample',
     'test_discovery_sample2',