diff --git a/.gitignore b/.gitignore
index 519b094..6eb46ea 100644
--- a/.gitignore
+++ b/.gitignore
@@ -24,3 +24,6 @@ alerts.env
 # docs
 build/
 docs/_build
+
+# tests
+.tox
diff --git a/pytest.ini b/pytest.ini
deleted file mode 100644
index 6e31137..0000000
--- a/pytest.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-[pytest]
-testpaths = tests
-python_files=test*.py
-addopts = -v --verbose
diff --git a/tests/requirements.txt b/tests/requirements.txt
index 8e1f5ad..815da53 100644
--- a/tests/requirements.txt
+++ b/tests/requirements.txt
@@ -1 +1,2 @@
 pytest==4.3.1
+tox
diff --git a/tox.ini b/tox.ini
new file mode 100644
index 0000000..848647a
--- /dev/null
+++ b/tox.ini
@@ -0,0 +1,56 @@
+# Ensure that this file do not contain non-ascii characters
+# as flake8 can fail to parse the file on OS X and Windows
+
+[tox]
+skipsdist = True
+setupdir={toxinidir}/src
+envlist =
+    ; py37
+    pep8
+
+[testenv]
+usedevelop = True
+basepython =
+    py37: python3.7
+
+deps = 
+    -r{toxinidir}/tests/requirements.txt
+commands =
+    ; coverage run --source=restic_compose_backup -m pytest tests/
+    ; coverage report
+    pytest
+
+[testenv:pep8]
+usedevelop = false
+deps = flake8
+basepython = python3.7
+commands = flake8
+
+[pytest]
+norecursedirs = tests/* .venv/* .tox/* build/ docs/
+
+[flake8]
+# H405: multi line docstring summary not separated with an empty line
+# D100: Missing docstring in public module
+# D101: Missing docstring in public class
+# D102: Missing docstring in public method
+# D103: Missing docstring in public function
+# D104: Missing docstring in public package
+# D105: Missing docstring in magic method
+# D200: One-line docstring should fit on one line with quotes
+# D202: No blank lines allowed after function docstring
+# D203: 1 blank required before class docstring.
+# D204: 1 blank required after class docstring
+# D205: Blank line required between one-line summary and description.
+# D207: Docstring is under-indented
+# D208: Docstring is over-indented
+# D211: No blank lines allowed before class docstring
+# D301: Use r""" if any backslashes in a docstring
+# D400: First line should end with a period.
+# D401: First line should be in imperative mood.
+# *** E302 expected 2 blank lines, found 1
+# *** W503 line break before binary operator
+ignore = H405,D100,D101,D102,D103,D104,D105,D200,D202,D203,D204,D205,D211,D301,D400,D401,W503
+show-source = True
+max-line-length = 120
+exclude = .tox,.venv*,tests,build,conf.py