diff --git a/ci/appveyor/tests.cmd b/ci/appveyor/tests.cmd
index 3983b2607ddcc050e52b84a23fc811daa90b028f..a2029cc5d5442022e4959cc771f92e0845de1efc 100644
--- a/ci/appveyor/tests.cmd
+++ b/ci/appveyor/tests.cmd
@@ -11,6 +11,6 @@ pyrcc5 -version
 
 lrelease -version
 
-python -m unittest discover --start-directory src/sakia/tests -t src
+python setup.py test
 
 if %errorlevel% neq 0 exit /b 1
\ No newline at end of file
diff --git a/ci/travis/build.sh b/ci/travis/build.sh
index 3efe79543b56704a3102c126aaf32d62de40b5d6..b044d97633282d00e3f30724827ccfd4089922b7 100755
--- a/ci/travis/build.sh
+++ b/ci/travis/build.sh
@@ -23,6 +23,5 @@ then
 elif [ $TRAVIS_OS_NAME == "linux" ]
 then
     python setup.py build
-    cp $HOME/.pyenv/versions/$PYENV_PYTHON_VERSION/lib/libpython3.*m.so.1.0 build/exe.linux-x86_64-3.*/
 fi
 
diff --git a/ci/travis/test.sh b/ci/travis/test.sh
index b5c4fd2a41217e3e26b307d496cbb88bc53400ba..f8de170e798250b4fc0bbb8dbc2c6103b9b4b41a 100755
--- a/ci/travis/test.sh
+++ b/ci/travis/test.sh
@@ -14,5 +14,5 @@ then
     sleep 3
 fi
 
-coverage run --source=sakia.core,sakia.gui,sakia.models python -m unittest discover --start-directory src/sakia/tests -t src
+coverage run --source=sakia.core,sakia.gui,sakia.models python setup.py test
 
diff --git a/setup.py b/setup.py
index 825b1954ca1de85132371b9fd1419f516cc2ab3f..7ae85bc41d9735f9635b693e17c01387d49dd3e9 100644
--- a/setup.py
+++ b/setup.py
@@ -3,123 +3,124 @@ from cx_Freeze import setup, Executable
 from PyQt5 import QtCore
 from os import listdir
 from os.path import isfile, join
+import unittest
 
-#############################################################################
-# preparation des options
 sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), 'src')))
 
-print(sys.path)
-print("Environnement:")
-print(os.environ)
-includes = ["sip", "re", "json", "logging",
-            "hashlib", "os", "urllib",
-            "ucoinpy", "pylibscrypt", "aiohttp", "asyncio",
-            "quamash", "jsonschema"]
-exclude = ['.git']
-packages = ["libnacl", "encodings"]
-
-includefiles = []
-zipincludes = []
-
-if sys.platform == "win32":
-    app = QtCore.QCoreApplication(sys.argv)
-    libEGL_path = ""
-    libsodium_path = ""
-    print(QtCore.QCoreApplication.libraryPaths())
-    for path in QtCore.QCoreApplication.libraryPaths():
-        if os.path.isfile(os.path.join(os.path.dirname(path), "libEGL.dll")):
-            libEGL_path = os.path.join(os.path.dirname(path), "libEGL.dll")
-
-    if 'CONDA_DEFAULT_ENV' in os.environ:
-            # Check if we are in Conda env
-        schemas = os.path.join(site.getsitepackages()[1], "jsonschema", "schemas")
+if "test" in sys.argv:
+    runner = unittest.TextTestRunner().run(unittest.defaultTestLoader.discover(start_dir='sakia.tests',
+                                                                               pattern='test_*'))
 
+    sys.exit(not runner.wasSuccessful())
+else:
+    print(sys.path)
+    print("Environnement:")
+    print(os.environ)
+    includes = ["sip", "re", "json", "logging",
+                "hashlib", "os", "urllib",
+                "ucoinpy", "pylibscrypt", "aiohttp", "asyncio",
+                "quamash", "jsonschema"]
+    exclude = ['.git']
+    packages = ["libnacl", "encodings"]
+
+    includefiles = []
+    zipincludes = []
+
+    if sys.platform == "win32":
+        app = QtCore.QCoreApplication(sys.argv)
+        libEGL_path = ""
+        libsodium_path = ""
+        print(QtCore.QCoreApplication.libraryPaths())
+        for path in QtCore.QCoreApplication.libraryPaths():
+            if os.path.isfile(os.path.join(os.path.dirname(path), "libEGL.dll")):
+                libEGL_path = os.path.join(os.path.dirname(path), "libEGL.dll")
+
+        if 'CONDA_DEFAULT_ENV' in os.environ:
+                # Check if we are in Conda env
+            schemas = os.path.join(site.getsitepackages()[1], "jsonschema", "schemas")
+
+            onlyfiles = [ f for f in listdir(schemas) if isfile(join(schemas,f)) ]
+            for f in onlyfiles:
+                zipincludes.append((os.path.join(schemas, f), os.path.join("jsonschema", "schemas", f)))
+
+            path = QtCore.QCoreApplication.libraryPaths()[0]
+            libEGL_path = os.path.join(path, "Scripts", "libEGL.dll")
+            libsodium_path = os.path.join(path, "Scripts", "libsodium.dll")
+
+            files = lambda mypath: [ f for f in os.listdir(mypath) if os.path.isfile(os.path.join(mypath,f)) ]
+            for f in files(os.path.join(path, "Scripts", "plugins", "platforms")):
+                includefiles.append((os.path.join(path, "Scripts", "plugins", "platforms", f), os.path.join("platforms", f) ))
+
+            for f in files(os.path.join(path, "Scripts", "plugins", "imageformats")):
+                includefiles.append((os.path.join(path, "Scripts", "plugins", "imageformats", f), os.path.join("imageformats", f) ))
+
+            for f in files(os.path.join(path, "Scripts", "plugins", "iconengines")):
+                includefiles.append((os.path.join(path, "Scripts", "plugins", "iconengines", f), os.path.join("iconengines", f) ))
+        includefiles.append(libEGL_path)
+        includefiles.append(libsodium_path)
+    else:
+        schemas = os.path.join(site.getsitepackages()[0], "jsonschema", "schemas")
         onlyfiles = [ f for f in listdir(schemas) if isfile(join(schemas,f)) ]
         for f in onlyfiles:
             zipincludes.append((os.path.join(schemas, f), os.path.join("jsonschema", "schemas", f)))
 
-        path = QtCore.QCoreApplication.libraryPaths()[0]
-        libEGL_path = os.path.join(path, "Scripts", "libEGL.dll")
-        libsodium_path = os.path.join(path, "Scripts", "libsodium.dll")
-
-        files = lambda mypath: [ f for f in os.listdir(mypath) if os.path.isfile(os.path.join(mypath,f)) ]
-        for f in files(os.path.join(path, "Scripts", "plugins", "platforms")):
-            includefiles.append((os.path.join(path, "Scripts", "plugins", "platforms", f), os.path.join("platforms", f) ))
-
-        for f in files(os.path.join(path, "Scripts", "plugins", "imageformats")):
-            includefiles.append((os.path.join(path, "Scripts", "plugins", "imageformats", f), os.path.join("imageformats", f) ))
-
-        for f in files(os.path.join(path, "Scripts", "plugins", "iconengines")):
-            includefiles.append((os.path.join(path, "Scripts", "plugins", "iconengines", f), os.path.join("iconengines", f) ))
-    includefiles.append(libEGL_path)
-    includefiles.append(libsodium_path)
-else:
-    schemas = os.path.join(site.getsitepackages()[0], "jsonschema", "schemas")
-    onlyfiles = [ f for f in listdir(schemas) if isfile(join(schemas,f)) ]
-    for f in onlyfiles:
-        zipincludes.append((os.path.join(schemas, f), os.path.join("jsonschema", "schemas", f)))
-
-if sys.platform == "darwin":
-    info = subprocess.check_output(["brew", "info", "libsodium"])
-    info = info.decode().splitlines(keepends=False)
-    if len(info) > 1:
-        library_path = info[3].split(" ")[0]
-        libsodium_path = os.path.join(library_path, "lib",
-                                      "libsodium.dylib")
-        includefiles.append((libsodium_path, "lib/libsodium.dylib"))
-        print(libsodium_path)
-    else:
-        print("Erreur : libsodium not found. Please install it with brew install libsodium.")
-
-    qtconf_path = os.path.join(os.path.dirname(__file__), "res/osx/qt.conf")
-    includefiles.append((qtconf_path, "qt.conf"))
-
-print("Includes : ")
-print(includes)
-print("Excludes : ")
-print(exclude)
-print("Include files : ")
-print(includefiles)
-print("Zip files : ")
-print(zipincludes)
-print("Packages : ")
-print(packages)
-print("Sys.path : ")
-print(sys.path)
-
-options = {"path": sys.path,
-           "includes": includes,
-           "include_files": includefiles,
-           "excludes": exclude,
-           "packages": packages,
-           "zip_includes": zipincludes
-           }
-
-#############################################################################
-# preparation des cibles
-base = None
-file_type=""
-icon="sakia.png"
-if sys.platform == "win32":
-    base = "Win32GUI"
-    file_type=".exe"
-    icon="sakia.ico"
-
-target = Executable(
-    script = "src/sakia/main.py",
-    targetName="sakia"+file_type,
-    base = base,
-    icon = icon,
-    )
-
-#############################################################################
-# creation du setup
-setup(
-    name = "sakia",
-    version = "0.11.2",
-    description = "UCoin client",
-    author = "Inso",
-    options = {"build_exe": options},
-    executables = [target]
-    )
+    if sys.platform == "darwin":
+        info = subprocess.check_output(["brew", "info", "libsodium"])
+        info = info.decode().splitlines(keepends=False)
+        if len(info) > 1:
+            library_path = info[3].split(" ")[0]
+            libsodium_path = os.path.join(library_path, "lib",
+                                          "libsodium.dylib")
+            includefiles.append((libsodium_path, "lib/libsodium.dylib"))
+            print(libsodium_path)
+        else:
+            print("Erreur : libsodium not found. Please install it with brew install libsodium.")
+
+        qtconf_path = os.path.join(os.path.dirname(__file__), "res/osx/qt.conf")
+        includefiles.append((qtconf_path, "qt.conf"))
+
+    print("Includes : ")
+    print(includes)
+    print("Excludes : ")
+    print(exclude)
+    print("Include files : ")
+    print(includefiles)
+    print("Zip files : ")
+    print(zipincludes)
+    print("Packages : ")
+    print(packages)
+    print("Sys.path : ")
+    print(sys.path)
+
+    options = {"path": sys.path,
+               "includes": includes,
+               "include_files": includefiles,
+               "excludes": exclude,
+               "packages": packages,
+               "zip_includes": zipincludes
+               }
+
+    base = None
+    file_type=""
+    icon="sakia.png"
+    if sys.platform == "win32":
+        base = "Win32GUI"
+        file_type=".exe"
+        icon="sakia.ico"
+
+    target = Executable(
+        script = "src/sakia/main.py",
+        targetName="sakia"+file_type,
+        base = base,
+        icon = icon,
+        )
+
+    setup(
+        name = "sakia",
+        version = "0.11.2",
+        description = "UCoin client",
+        author = "Inso",
+        options = {"build_exe": options},
+        executables = [target]
+        )