diff --git a/.gitignore b/.gitignore
index 9ff496e3428d2a19629d842d0717833b3d4a08f1..e0ab10ba31fde3e4e91541a077fd4b31a3b2b490 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,3 @@
 /build/
+
 /example/data/
\ No newline at end of file
diff --git a/rq_controller/common/io/writer.py b/rq_controller/common/io/writer.py
index be86283acb84da1848a374ea17062636b51a13cb..f9475c382156f875f56cb9093a9e83a24eab8c25 100644
--- a/rq_controller/common/io/writer.py
+++ b/rq_controller/common/io/writer.py
@@ -29,7 +29,8 @@ class BaseDataWriter():
     
     def write_region_of_intrest(self, save_path: Path, region_of_intrest: PyRegionOfIntrest):
         raise NotImplementedError
-    def write_volume(save_path: Path, region_of_intrest: PyRegionOfIntrest):
+    
+    def write_volume(self, save_path: Path, volume: PyVolume):
         raise NotImplementedError()
     
     def get_next_projection_save_path(self, save_folder: Path) -> Path:
diff --git a/test/__pycache__/test_base_loader.cpython-38-pytest-8.2.2.pyc b/test/__pycache__/test_base_loader.cpython-38-pytest-8.2.2.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..279c0db1aec0f0f5b456424894890499d32a6041
Binary files /dev/null and b/test/__pycache__/test_base_loader.cpython-38-pytest-8.2.2.pyc differ
diff --git a/test/__pycache__/test_base_writer.cpython-38-pytest-8.2.2.pyc b/test/__pycache__/test_base_writer.cpython-38-pytest-8.2.2.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..29e343a89d1a629bacda3ebb8b0f24f419a5fc0e
Binary files /dev/null and b/test/__pycache__/test_base_writer.cpython-38-pytest-8.2.2.pyc differ
diff --git a/test/__pycache__/test_rq_json_loader.cpython-38-pytest-8.2.2.pyc b/test/__pycache__/test_rq_json_loader.cpython-38-pytest-8.2.2.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..08c125f59602b7c18da451bf09f26e6439e0abfd
Binary files /dev/null and b/test/__pycache__/test_rq_json_loader.cpython-38-pytest-8.2.2.pyc differ
diff --git a/test/test_base_loader.py b/test/test_base_loader.py
new file mode 100644
index 0000000000000000000000000000000000000000..eb1c071d7ddd30b4e84083f32e5dd780461146e0
--- /dev/null
+++ b/test/test_base_loader.py
@@ -0,0 +1,34 @@
+import pytest
+from rq_controller.common.io.loader import BaseDataLoader
+from pathlib import Path
+
+@pytest.fixture
+def base_data_loader():
+    return BaseDataLoader(
+        porjection_geometry_suffix="geometry_suffix",
+        projection_suffix="projection_suffix",
+        region_of_intrest_suffix="roi_suffix",
+        volume_suffix="volume_suffix"
+    )
+
+def test_initialization(base_data_loader: BaseDataLoader):
+    assert base_data_loader.porjection_geometry_suffix == "geometry_suffix"
+    assert base_data_loader.projection_suffix == "projection_suffix"
+    assert base_data_loader.region_of_intrest_suffix == "roi_suffix"
+    assert base_data_loader.volume_suffix == "volume_suffix"
+
+def test_load_projection_geometry_not_implemented(base_data_loader: BaseDataLoader):
+    with pytest.raises(NotImplementedError):
+        base_data_loader.load_projection_geometry(Path("/fake/path"))
+
+def test_load_projection_not_implemented(base_data_loader: BaseDataLoader):
+    with pytest.raises(NotImplementedError):
+        base_data_loader.load_projection(Path("/fake/path"))
+
+def test_load_region_of_intrest_not_implemented(base_data_loader: BaseDataLoader):
+    with pytest.raises(NotImplementedError):
+        base_data_loader.load_region_of_intrest(Path("/fake/path"))
+
+def test_load_volume_not_implemented(base_data_loader: BaseDataLoader):
+    with pytest.raises(NotImplementedError):
+        base_data_loader.load_volume(Path("/fake/path"))
\ No newline at end of file
diff --git a/test/test_base_writer.py b/test/test_base_writer.py
new file mode 100644
index 0000000000000000000000000000000000000000..3d41a2d95c8b45bda06cfa681c1dbc0286420aad
--- /dev/null
+++ b/test/test_base_writer.py
@@ -0,0 +1,91 @@
+import pytest
+from pathlib import Path
+from rq_controller.common import PyProjection, PyProjectionGeometry, PyRegionOfIntrest, PyVolume
+from rq_controller.common.io.writer import BaseDataWriter
+
+@pytest.fixture
+def base_data_writer():
+    return BaseDataWriter(
+        porjection_geometry_suffix=".geom",
+        projection_suffix=".proj",
+        region_of_intrest_suffix=".roi",
+        volume_suffix=".vol"
+    )
+
+def test_initialization(base_data_writer):
+    assert base_data_writer.porjection_geometry_suffix == ".geom"
+    assert base_data_writer.projection_suffix == ".proj"
+    assert base_data_writer.region_of_intrest_suffix == ".roi"
+    assert base_data_writer.volume_suffix == ".vol"
+
+def test_write_projection_geometry_not_implemented(base_data_writer):
+    with pytest.raises(NotImplementedError):
+        base_data_writer.write_projection_geometry(Path("/fake/path"), PyProjectionGeometry.dummy())
+
+def test_write_projection_not_implemented(base_data_writer):
+    with pytest.raises(NotImplementedError):
+        base_data_writer.write_projection(Path("/fake/path"), PyProjection.dummy())
+
+def test_write_region_of_intrest_not_implemented(base_data_writer):
+    with pytest.raises(NotImplementedError):
+        base_data_writer.write_region_of_intrest(Path("/fake/path"), PyRegionOfIntrest.dummy())
+
+def test_write_volume_not_implemented(base_data_writer):
+    with pytest.raises(NotImplementedError):
+        base_data_writer.write_volume(Path("/fake/path"), PyVolume.dummy())
+
+def test_get_next_projection_save_path(base_data_writer, tmp_path):
+    (tmp_path / "projection_00001.proj").touch()
+    expected_path = tmp_path / "projection_00002.proj"
+    assert base_data_writer.get_next_projection_save_path(tmp_path) == expected_path
+
+def test_get_projection_save_path_i(base_data_writer, tmp_path):
+    expected_path = tmp_path / "projection_00005.proj"
+    assert base_data_writer.get_projection_save_path_i(tmp_path, 5) == expected_path
+
+def test_get_next_projection_geometry_save_path(base_data_writer, tmp_path):
+    (tmp_path / "geometry_00001.geom").touch()
+    expected_path = tmp_path / "geometry_00002.geom"
+    assert base_data_writer.get_next_projection_geometry_save_path(tmp_path) == expected_path
+
+def test_get_projection_geometry_save_path_i(base_data_writer, tmp_path):
+    expected_path = tmp_path / "geometry_00005.geom"
+    assert base_data_writer.get_projection_geometry_save_path_i(tmp_path, 5) == expected_path
+
+def test_get_next_region_of_intrest_save_path(base_data_writer, tmp_path):
+    (tmp_path / "roi_00001.roi").touch()
+    expected_path = tmp_path / "roi_00002.roi"
+    assert base_data_writer.get_next_region_of_intrest_save_path(tmp_path) == expected_path
+
+def test_get_region_of_intrest_save_path_i(base_data_writer, tmp_path):
+    expected_path = tmp_path / "roi_00005.roi"
+    assert base_data_writer.get_region_of_intrest_save_path_i(tmp_path, 5) == expected_path
+
+def test_get_next_volume_save_path(base_data_writer, tmp_path):
+    (tmp_path / "volume_00001.vol").touch()
+    expected_path = tmp_path / "volume_00002.vol"
+    assert base_data_writer.get_next_volume_save_path(tmp_path) == expected_path
+
+def test_get_volume_save_path_i(base_data_writer, tmp_path):
+    expected_path = tmp_path / "volume_00005.vol"
+    assert base_data_writer.get_volume_save_path_i(tmp_path, 5) == expected_path
+
+def test_number_of_projection_geometries(base_data_writer, tmp_path):
+    (tmp_path / "geometry_00001.geom").touch()
+    (tmp_path / "geometry_00002.geom").touch()
+    assert base_data_writer.number_of_projection_geometries(tmp_path) == 2
+
+def test_number_of_projections(base_data_writer, tmp_path):
+    (tmp_path / "projection_00001.proj").touch()
+    (tmp_path / "projection_00002.proj").touch()
+    assert base_data_writer.number_of_projections(tmp_path) == 2
+
+def test_number_of_region_of_intrests(base_data_writer, tmp_path):
+    (tmp_path / "roi_00001.roi").touch()
+    (tmp_path / "roi_00002.roi").touch()
+    assert base_data_writer.number_of_region_of_intrests(tmp_path) == 2
+
+def test_number_of_volumes(base_data_writer, tmp_path):
+    (tmp_path / "volume_00001.vol").touch()
+    (tmp_path / "volume_00002.vol").touch()
+    assert base_data_writer.number_of_volumes(tmp_path) == 2
\ No newline at end of file