diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
new file mode 100644
index 0000000000000000000000000000000000000000..862887e836616cdf71594cf64e6b707d459446cd
--- /dev/null
+++ b/.gitlab-ci.yml
@@ -0,0 +1,8 @@
+before_script:
+  - apt-get update
+
+test-3.4:
+  image: python:3.4
+  script:
+  - pip install -e .
+  - py.test .
diff --git a/wetb/gtsdf/tests/test_gtsdf.py b/wetb/gtsdf/tests/test_gtsdf.py
index 402c22b4e53c8e59a62f75c4a6edc713a3890fb7..541cf073399bc6b44350b311a3f8c469512591f0 100644
--- a/wetb/gtsdf/tests/test_gtsdf.py
+++ b/wetb/gtsdf/tests/test_gtsdf.py
@@ -12,15 +12,20 @@ import unittest
 import os
 import shutil
 
+tmp_path = os.path.dirname(__file__) + "/tmp/"
 class Test_gsdf(unittest.TestCase):
-    f = "tmp/"
     def setUp(self):
         unittest.TestCase.setUp(self)
-        if not os.path.isdir(self.f):
-            os.makedirs(self.f)
+        if not os.path.isdir(tmp_path):
+            os.makedirs(tmp_path)
+
+    @classmethod
+    def tearDownClass(cls):
+        super(Test_gsdf, cls).tearDownClass()
+        shutil.rmtree(tmp_path)
 
     def test_minimum_requirements (self):
-        fn = self.f + "minimum.hdf5"
+        fn = tmp_path + "minimum.hdf5"
         f = h5py.File(fn, "w")
         #no type
         self.assertRaises(ValueError, gtsdf.load, fn)
@@ -37,35 +42,37 @@ class Test_gsdf(unittest.TestCase):
         #no data
         self.assertRaises(ValueError, gtsdf.load, fn)
         b.create_dataset("data", data=np.empty((0, 0)))
+        f.close()
         gtsdf.load(fn)
 
+
     def test_save_no_hdf5_ext(self):
-        fn = self.f + "no_hdf5_ext"
+        fn = tmp_path + "no_hdf5_ext"
         gtsdf.save(fn, np.arange(12).reshape(4, 3))
         _, _, info = gtsdf.load(fn + ".hdf5")
         self.assertEqual(info['name'], 'no_hdf5_ext')
 
     def test_load_filename(self):
-        fn = self.f + "filename.hdf5"
+        fn = tmp_path + "filename.hdf5"
         gtsdf.save(fn, np.arange(12).reshape(4, 3))
         _, _, info = gtsdf.load(fn)
         self.assertEqual(info['name'], 'filename')
 
 
     def test_load_fileobject(self):
-        fn = self.f + "fileobject.hdf5"
+        fn = tmp_path + "fileobject.hdf5"
         gtsdf.save(fn, np.arange(12).reshape(4, 3))
         _, _, info = gtsdf.load(fn)
         self.assertEqual(info['name'], 'fileobject')
 
     def test_save_wrong_no_attr_info(self):
-        fn = self.f + "wrong_no_attr_info.hdf5"
+        fn = tmp_path + "wrong_no_attr_info.hdf5"
         self.assertRaises(AssertionError, gtsdf.save, fn, np.arange(12).reshape(4, 3), attribute_names=['Att1'])
         self.assertRaises(AssertionError, gtsdf.save, fn, np.arange(12).reshape(4, 3), attribute_units=['s'])
         self.assertRaises(AssertionError, gtsdf.save, fn, np.arange(12).reshape(4, 3), attribute_descriptions=['desc'])
 
     def test_info(self):
-        fn = self.f + "info.hdf5"
+        fn = tmp_path + "info.hdf5"
         gtsdf.save(fn, np.arange(12).reshape(6, 2),
                    name='datasetname',
                    description='datasetdescription',
@@ -81,39 +88,39 @@ class Test_gsdf(unittest.TestCase):
         self.assertEqual(list(info['attribute_descriptions']), ['d1', 'd2'])
 
     def test_no_time(self):
-        fn = self.f + 'time.hdf5'
+        fn = tmp_path + 'time.hdf5'
         gtsdf.save(fn, np.arange(12).reshape(6, 2))
         time, _, _ = gtsdf.load(fn)
         np.testing.assert_array_equal(time, np.arange(6))
 
     def test_int_time(self):
-        fn = self.f + 'time.hdf5'
+        fn = tmp_path + 'time.hdf5'
         gtsdf.save(fn, np.arange(12).reshape(6, 2), time=range(4, 10))
         time, _, _ = gtsdf.load(fn)
         np.testing.assert_array_equal(time, range(4, 10))
 
 
     def test_time_offset(self):
-        fn = self.f + 'time.hdf5'
+        fn = tmp_path + 'time.hdf5'
         gtsdf.save(fn, np.arange(12).reshape(6, 2), time=range(6), time_start=4)
         time, _, _ = gtsdf.load(fn)
         np.testing.assert_array_equal(time, range(4, 10))
 
 
     def test_time_gain_offset(self):
-        fn = self.f + 'time.hdf5'
+        fn = tmp_path + 'time.hdf5'
         gtsdf.save(fn, np.arange(12).reshape(6, 2), time=range(6), time_step=1 / 4, time_start=4)
         time, _, _ = gtsdf.load(fn)
         np.testing.assert_array_equal(time, np.arange(4, 5.5, .25))
 
     def test_float_time(self):
-        fn = self.f + 'time.hdf5'
+        fn = tmp_path + 'time.hdf5'
         gtsdf.save(fn, np.arange(12).reshape(6, 2), time=np.arange(4, 5.5, .25))
         time, _, _ = gtsdf.load(fn)
         np.testing.assert_array_equal(time, np.arange(4, 5.5, .25))
 
     def test_data(self):
-        fn = self.f + 'data.hdf5'
+        fn = tmp_path + 'data.hdf5'
         d = np.arange(12).reshape(6, 2)
         gtsdf.save(fn, d)
         f = h5py.File(fn)
@@ -123,7 +130,7 @@ class Test_gsdf(unittest.TestCase):
         np.testing.assert_array_almost_equal(data, np.arange(12).reshape(6, 2), 4)
 
     def test_data_float(self):
-        fn = self.f + 'time.hdf5'
+        fn = tmp_path + 'time.hdf5'
         d = np.arange(12).reshape(6, 2)
         gtsdf.save(fn, d, dtype=np.float32)
         f = h5py.File(fn)
@@ -134,7 +141,7 @@ class Test_gsdf(unittest.TestCase):
 
 
     def test_all(self):
-        fn = self.f + "all.hdf5"
+        fn = tmp_path + "all.hdf5"
         gtsdf.save(fn, np.arange(12).reshape(6, 2),
                    name='datasetname',
                    time=range(6), time_step=1 / 4, time_start=4,
@@ -153,7 +160,7 @@ class Test_gsdf(unittest.TestCase):
         np.testing.assert_array_almost_equal(data, np.arange(12).reshape(6, 2), 4)
 
     def test_append(self):
-        fn = self.f + 'append.hdf5'
+        fn = tmp_path + 'append.hdf5'
         d = np.arange(12, dtype=np.float32).reshape(6, 2)
         d[2, 0] = np.nan
         gtsdf.save(fn, d)
@@ -166,7 +173,7 @@ class Test_gsdf(unittest.TestCase):
 
 
     def test_nan_float(self):
-        fn = self.f + 'nan.hdf5'
+        fn = tmp_path + 'nan.hdf5'
         d = np.arange(12, dtype=np.float32).reshape(6, 2)
         d[2, 0] = np.nan
         gtsdf.save(fn, d)
@@ -176,7 +183,7 @@ class Test_gsdf(unittest.TestCase):
 
 
     def test_outlier(self):
-        fn = self.f + 'outlier.hdf5'
+        fn = tmp_path + 'outlier.hdf5'
         d = np.arange(12, dtype=np.float32).reshape(6, 2)
         d[2, 0] = 10 ** 4
         d[3, 1] = 10 ** 4
@@ -184,14 +191,14 @@ class Test_gsdf(unittest.TestCase):
         _, data, _ = gtsdf.load(fn)
 
     def test_inf(self):
-        fn = self.f + 'outlier.hdf5'
+        fn = tmp_path + 'outlier.hdf5'
         d = np.arange(12, dtype=np.float32).reshape(6, 2)
         d[2, 0] = np.inf
         d[3, 1] = 10 ** 3
         self.assertRaises(ValueError, gtsdf.save, fn, d)
 
     def test_loadpandas(self):
-        fn = self.f + "all.hdf5"
+        fn = tmp_path + "all.hdf5"
         gtsdf.save(fn, np.arange(12).reshape(6, 2),
                    name='datasetname',
                    time=range(6), time_step=1 / 4, time_start=4,