Add tox runner with a handful of basic jobs
diff --git a/.bandit.yml b/.bandit.yml
new file mode 100644
index 0000000..a0e3247
--- /dev/null
+++ b/.bandit.yml
@@ -0,0 +1,3 @@
+skips:
+- B603  # Ignore warnings about calling subprocess.Popen without shell=True
+- B607  # Ignore warnings about calling subprocess.Popen without a full path to executable
diff --git a/CHANGES.txt b/CHANGES.txt
index 3422e4d..5abbe58 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -3,6 +3,7 @@
 -----------------------------------
 
 - Added support for Python 3.8.
+- Added tox runner with a handful of basic jobs
 - Add RFC3125 providing Electronic Signature Policies
 - Add RFC5126 providing CMS Advanced Electronic Signatures (CAdES)
 - Removed support for EOL Pythons 2.4, 2.5, 2.6, 3.2, 3.3 and 3.4.
diff --git a/tox.ini b/tox.ini
new file mode 100644
index 0000000..a335e3c
--- /dev/null
+++ b/tox.ini
@@ -0,0 +1,43 @@
+[tox]
+minversion = 3.4.0
+envlist = unittest, bandit, build
+
+[testenv]
+basepython = python3
+usedevelop = True
+setenv =
+   VIRTUAL_ENV={envdir}
+   PYTHONWARNINGS=default::DeprecationWarning
+install_command = pip install {opts} {packages}
+
+[testenv:unittest]
+deps =
+  discover
+  -r{toxinidir}/requirements.txt
+commands = discover -s examples/pyasn1_modules-example-switch/tests -s tests
+
+[testenv:cover]
+setenv =
+   {[testenv]setenv}
+   PYTHON=coverage run --parallel-mode
+deps =
+    coverage
+    discover
+commands = coverage erase
+           coverage run --source pyasn1_modules -m unittest discover {posargs}
+           coverage report --fail-under 80
+
+[testenv:bandit]
+skip_install = true
+deps =
+    bandit
+commands =
+    bandit -r pyasn1_modules -c .bandit.yml
+
+[testenv:build]
+skip_install = true
+deps =
+    wheel
+    setuptools
+commands =
+    python setup.py -q sdist bdist_wheel