diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 81e95c76c27720526ed71c273e01fb1f6a086074..2b2794d38ae8f053cf37215145b97af7549daa3f 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -4,7 +4,7 @@ stages:
   - deploy
 
 lint:
-  image: python:3.8
+  image: python:3.10
   stage: test
 
   cache:
@@ -24,6 +24,34 @@ lint:
   script:
     - pre-commit run -a
 
+test:
+  image: python:3.10
+
+  stage: test
+  cache:
+    paths:
+      - .cache/pip
+
+  variables:
+    PIP_CACHE_DIR: "$CI_PROJECT_DIR/.cache/pip"
+    ARKINDEX_API_SCHEMA_URL: schema.yml
+
+  before_script:
+    - pip install tox
+
+    # Download OpenAPI schema from last backend build
+    - curl https://assets.teklia.com/arkindex/openapi.yml > schema.yml
+
+    # Add system deps for opencv
+    - apt-get update -q
+    - apt-get install -q -y libgl1
+
+  except:
+    - schedules
+
+  script:
+    - tox
+
 bump-python-deps:
   stage: deploy
   image: registry.gitlab.com/teklia/devops:latest