diff --git a/.gitignore b/.gitignore
index 37784224e7da7e2b4b2b02808e07206100020152..b3eb314b7859639b72827615c74570e53b13e38e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,3 +4,4 @@ playbook.retry
 *.egg-info
 build
 dist
+.eggs
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 14afa3a36435e40ad3702d429b440bb93f65cac4..a7801193d4fac95901a42ac74bd83e079efd650d 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -19,10 +19,9 @@ backend-tests:
     DB_PORT: 5432
 
   before_script:
-    - apk update
-    - apk add postgresql-dev libjpeg-turbo-dev gcc musl-dev
-    - pip install -r requirements.txt
+    - apk --update add postgresql-dev libjpeg-turbo-dev gcc musl-dev
 
   script:
+    - python setup.py test
+    - pip install .[test]
     - flake8
-    - cd arkindex && ./manage.py test
diff --git a/arkindex/project/runtests.py b/arkindex/project/runtests.py
new file mode 100644
index 0000000000000000000000000000000000000000..bf4147a42268bd40999ddf75e3c3fb7c40b0ba94
--- /dev/null
+++ b/arkindex/project/runtests.py
@@ -0,0 +1,22 @@
+#This file exists to allow python setup.py test to work.
+import os, sys
+os.environ['DJANGO_SETTINGS_MODULE'] = 'arkindex.project.settings'
+test_dir = os.path.dirname(__file__)
+sys.path.insert(0, test_dir)
+
+from django.test.utils import get_runner
+from django.conf import settings
+
+def run():
+    # Setup django
+    import django
+    django.setup()
+
+    # Run tests on documents
+    TestRunner = get_runner(settings)
+    test_runner = TestRunner(verbosity=2, interactive=True)
+    failures = test_runner.run_tests(['arkindex.documents.tests'])
+    sys.exit(failures)
+
+if __name__ == '__main__':
+    run()
diff --git a/requirements.txt b/requirements.txt
index d1d6ebfc06423a770b6c5236855481f580e590b4..ca6a985a2a8ea4bda81e1507453c0d63700ba7ac 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -6,19 +6,14 @@ django-webpack-loader==0.5.0
 djangorestframework==3.7.1
 elasticsearch==5.4.0
 et-xmlfile==1.0.1
-flake8==3.5.0
 idna==2.6
 ijson==2.3
 jdcal==1.3
-mccabe==0.6.1
 olefile==0.44
 openpyxl==2.4.9
 Pillow==4.3.0
 psycopg2==2.7.3.2
-pycodestyle==2.3.1
-pyflakes==1.6.0
 pytz==2017.2
 requests==2.18.4
 roman==2.0.0
-tripoli==2.0.0
 urllib3==1.22
diff --git a/setup.py b/setup.py
index 775e1a8dd2b4ba9cc68c64a914af7d486ad847fb..8e0f08670b2fcecc33870469c9600f4f5739946f 100644
--- a/setup.py
+++ b/setup.py
@@ -7,6 +7,9 @@ with open('VERSION') as f:
 with open('requirements.txt') as f:
     requirements = f.read().splitlines()
 
+with open('tests-requirements.txt') as f:
+    tests_requirements = f.read().splitlines()
+
 setup(
     name='arkindex',
     version=VERSION,
@@ -15,7 +18,13 @@ setup(
     author_email='abadie@teklia.com',
     url='https://arkindex.teklia.com',
     install_requires=requirements,
+    test_suite='arkindex.project.runtests.run',
+    tests_require=tests_requirements,
+    extras_require={
+        'test': tests_requirements,
+    },
     packages=find_packages(),
+    py_modules=['arkindex',],
     scripts=[
         'arkindex/manage.py',
     ],
diff --git a/tests-requirements.txt b/tests-requirements.txt
new file mode 100644
index 0000000000000000000000000000000000000000..891bc2c834c13e486eca73dd6e5e8a726877a35a
--- /dev/null
+++ b/tests-requirements.txt
@@ -0,0 +1,2 @@
+flake8
+tripoli