diff --git a/odml/property.py b/odml/property.py
index 761375d..6c5caf0 100644
--- a/odml/property.py
+++ b/odml/property.py
@@ -688,7 +688,8 @@ class BaseProperty(base.BaseObject):
                 dtypes.infer_dtype(new_value[0]) != self.dtype:
 
             type_check = dtypes.infer_dtype(new_value[0])
-            if not (type_check == "string" and self.dtype in dtypes.special_dtypes):
+            if not (type_check == "string" and self.dtype in dtypes.special_dtypes) \
+                    and not self.dtype.endswith("-tuple"):
                 msg = "odml.Property.extend: passed value data type found "
                 msg += "(\"%s\") does not match expected dtype \"%s\"!" % (type_check,
                                                                            self._dtype)
@@ -724,7 +725,8 @@ class BaseProperty(base.BaseObject):
                 dtypes.infer_dtype(new_value[0]) != self.dtype:
 
             type_check = dtypes.infer_dtype(new_value[0])
-            if not (type_check == "string" and self.dtype in dtypes.special_dtypes):
+            if not (type_check == "string" and self.dtype in dtypes.special_dtypes) \
+                    and not self.dtype.endswith("-tuple"):
                 msg = "odml.Property.append: passed value data type found "
                 msg += "(\"%s\") does not match expected dtype \"%s\"!" % (type_check,
                                                                            self._dtype)
diff --git a/odml/validation.py b/odml/validation.py
index 7ea1492..eb2fd05 100644
--- a/odml/validation.py
+++ b/odml/validation.py
@@ -134,7 +134,7 @@ def object_required_attributes(obj):
     for arg in args:
         if arg[1] == 1:
             if not hasattr(obj, arg[0]):
-                msg = "Missing attribute %s for %s" % (obj.format().name.capitalize(), arg[0])
+                msg = "Missing attribute %s for %s" % (arg[0], obj.format().name.capitalize())
                 yield ValidationError(obj, msg, LABEL_ERROR)
                 continue
             obj_arg = getattr(obj, arg[0])
@@ -308,6 +308,20 @@ Validation.register_handler('section', section_unique_name_type)
 Validation.register_handler('section', property_unique_names)
 
 
+def object_name_readable(obj):
+    """
+    Tests if object name is easily readable, so not equal to id.
+
+    :param obj: odml.Section or odml.Property.
+    """
+    if obj.name == obj.id:
+        yield ValidationError(obj, 'Name should be readable', LABEL_WARNING)
+
+
+Validation.register_handler('section', object_name_readable)
+Validation.register_handler('property', object_name_readable)
+
+
 def property_terminology_check(prop):
     """
     1. warn, if there are properties that do not occur in the terminology.

[Property] Exception on x-tuple Property extend or append
When trying to append or extend an x-tuple Property value, a ValueError occurs.

e.g.

```
prop = odml.Property(name="tuple-test")
prop.dtype = "3-tuple"
prop.values = "(7; 8; 9)"
prop.values = ["(1; 2; 3)", "(4; 5; 6)"]       # reassignment works
prop.append("(7; 8; 9)")                          # append fails
prop.extend(["(7; 8; 9)", "(10; 11; 12)"])  # extend fails
```

diff --git a/test/test_fileio.py b/test/test_fileio.py
index 02c4ab5..c89ecc8 100644
--- a/test/test_fileio.py
+++ b/test/test_fileio.py
@@ -13,7 +13,8 @@ class TestTypes(unittest.TestCase):
     # TODO :- Write tests for JSONParser once it's completed.
 
     def setUp(self):
-        self.file = 'doc/example_odMLs/THGTTG.odml'
+        self.dir_path = os.path.dirname(os.path.realpath(__file__))
+        self.file = os.path.join(self.dir_path, 'resources', 'example.odml')
         # Do not allow anything to be printed on STDOUT
         self.captured_stdout = StringIO()
         sys.stdout = self.captured_stdout
diff --git a/test/test_property.py b/test/test_property.py
index 95048f1..ac9dd96 100644
--- a/test/test_property.py
+++ b/test/test_property.py
@@ -231,6 +231,11 @@ class TestProperty(unittest.TestCase):
         self.assertRaises(ValueError, p8.append, 1.3)
         self.assertRaises(ValueError, p8.append, True)
 
+        prop = Property(name="tuple-test", dtype="3-tuple", values="(1; 2; 3)")
+        prop.append("(7; 8; 9)")
+        self.assertEqual(len(prop), 2)
+        self.assertRaises(ValueError, prop.append, "(10; 11)")
+
     def test_value_extend(self):
         prop = Property(name="extend")
 
@@ -274,7 +279,7 @@ class TestProperty(unittest.TestCase):
         prop.extend(ext_prop)
         self.assertEqual(prop.values, ["a", "b", "c", "d", "e"])
 
-        ext_prop = Property(name="value extend", value=[1, 2 ,3])
+        ext_prop = Property(name="value extend", value=[1, 2, 3])
         with self.assertRaises(ValueError):
             prop.extend(ext_prop)
         self.assertEqual(prop.values, ["a", "b", "c", "d", "e"])
@@ -318,16 +323,21 @@ class TestProperty(unittest.TestCase):
         p2 = Property(name="prop", value=["https://en.wikipedia.org/wiki/Earth"], dtype=DType.url)
         p2.extend("https://en.wikipedia.org/wiki/Mars")
         self.assertEqual(len(p2), 2)
-        self.assertRaises(ValueError, p2.append, 1)
-        self.assertRaises(ValueError, p2.append, 1.3)
-        self.assertRaises(ValueError, p2.append, True)
+        self.assertRaises(ValueError, p2.extend, 1)
+        self.assertRaises(ValueError, p2.extend, 1.3)
+        self.assertRaises(ValueError, p2.extend, True)
 
         p3 = Property(name="prop", value=["Earth is No. 3."], dtype=DType.text)
         p3.extend("Mars is No. 4.")
         self.assertEqual(len(p3), 2)
-        self.assertRaises(ValueError, p3.append, 1)
-        self.assertRaises(ValueError, p3.append, 1.3)
-        self.assertRaises(ValueError, p3.append, True)
+        self.assertRaises(ValueError, p3.extend, 1)
+        self.assertRaises(ValueError, p3.extend, 1.3)
+        self.assertRaises(ValueError, p3.extend, True)
+
+        prop = Property(name="tuple-test", dtype="3-tuple", values="(1; 2; 3)")
+        prop.extend(["(7; 8; 9)", "(10; 11; 12)"])
+        self.assertEqual(len(prop), 3)
+        self.assertRaises(ValueError, prop.extend, "(10; 11)")
 
     def test_get_set_value(self):
         values = [1, 2, 3, 4, 5]
@@ -736,12 +746,12 @@ class TestProperty(unittest.TestCase):
         p_val = ["a", "b"]
 
         prop_a = Property(name=p_name, value_origin=p_origin, unit=p_unit,
-                        uncertainty=p_uncertainty, reference=p_ref, definition=p_def,
-                        dependency=p_dep, dependency_value=p_dep_val, value=p_val)
+                          uncertainty=p_uncertainty, reference=p_ref, definition=p_def,
+                          dependency=p_dep, dependency_value=p_dep_val, value=p_val)
 
         prop_b = Property(name=p_name, value_origin=p_origin, unit=p_unit,
-                        uncertainty=p_uncertainty, reference=p_ref, definition=p_def,
-                        dependency=p_dep, dependency_value=p_dep_val, value=p_val)
+                          uncertainty=p_uncertainty, reference=p_ref, definition=p_def,
+                          dependency=p_dep, dependency_value=p_dep_val, value=p_val)
 
         self.assertEqual(prop_a, prop_b)
 
diff --git a/test/test_validation.py b/test/test_validation.py
index 7f4a170..1dc8a33 100644
--- a/test/test_validation.py
+++ b/test/test_validation.py
@@ -1,10 +1,16 @@
 import unittest
 import odml
 import os
+import sys
 import odml.validation
 import odml.terminology
 from . import test_samplefile as samplefile
 
+try:
+    from StringIO import StringIO
+except ImportError:
+    from io import StringIO
+
 validate = odml.validation.Validation
 
 
@@ -129,6 +135,27 @@ class TestValidation(unittest.TestCase):
         res = validate(doc)
         self.assertError(res, "Duplicate id in Section")
 
+    def test_section_name_readable(self):
+        """
+        Test if section name is not uuid and thus more readable.
+        """
+        doc = odml.Document()
+        sec = odml.Section("sec", parent=doc)
+        sec.name = sec.id
+        res = validate(doc)
+        self.assertError(res, "Name should be readable")
+
+    def test_property_name_readable(self):
+        """
+        Test if property name is not uuid and thus more readable.
+        """
+        doc = odml.Document()
+        sec = odml.Section("sec", parent=doc)
+        prop = odml.Property("prop", parent=sec)
+        prop.name = prop.id
+        res = validate(doc)
+        self.assertError(res, "Name should be readable")
+
     def test_standalone_section(self):
         """
         Test if standalone section does not return errors if required attributes are correct.
@@ -152,8 +179,20 @@ class TestValidation(unittest.TestCase):
         prop = odml.Property()
         prop.type = ""
 
-        for err in validate(prop).errors:
-            assert not err.is_error
+        assert len(list(filter(lambda x: x.is_error, validate(prop).errors))) == 0
+
+    def test_section_init(self):
+        """
+        Test validation errors printed to stdout on section init.
+        """
+        val_errs = StringIO()
+
+        old_stdout = sys.stdout
+        sys.stdout = val_errs
+        odml.Section(name="sec", type=None)
+        sys.stdout = old_stdout
+
+        assert "Section type undefined" in val_errs.getvalue()
 
     def test_prop_string_values(self):
         """
@@ -172,8 +211,8 @@ class TestValidation(unittest.TestCase):
 
         prop2 = odml.Property(name='potential', dtype="string",
                               values=['-4.8', '10.0', '-11.9', '-10.0', '18.0'])
-        self.assertError(validate(prop2),'Dtype of property "potential" currently is "string", '
-                                         'but might fit dtype "float"!')
+        self.assertError(validate(prop2), 'Dtype of property "potential" currently is "string", '
+                                          'but might fit dtype "float"!')
 
         prop3 = odml.Property(name='dates', dtype="string",
                               values=['1997-12-14', '00-12-14', '89-07-04'])
@@ -219,17 +258,12 @@ class TestValidation(unittest.TestCase):
         path = os.path.join(self.dir_path, "resources", "validation_section.xml")
         doc = odml.load(path)
 
-        sec_type_undefined_err = False
-        sec_type_empty_err = False
-
-        for err in validate(doc).errors:
-            if err.msg == "Section type undefined" and err.obj.name == "sec_type_undefined":
-                sec_type_undefined_err = True
-            elif err.msg == "Section type undefined" and err.obj.name == "sec_type_empty":
-                sec_type_empty_err = True
-
-        assert sec_type_undefined_err
-        assert sec_type_empty_err
+        assert len(list(filter(
+            lambda x: x.msg == "Section type undefined" and x.obj.name == "sec_type_undefined",
+            validate(doc).errors))) > 0
+        assert len(list(filter(
+            lambda x: x.msg == "Section type undefined" and x.obj.name == "sec_type_empty",
+            validate(doc).errors))) > 0
 
     def test_load_dtypes_xml(self):
         """
@@ -298,17 +332,12 @@ class TestValidation(unittest.TestCase):
         path = os.path.join(self.dir_path, "resources", "validation_section.json")
         doc = odml.load(path, "JSON")
 
-        sec_type_undefined_err = False
-        sec_type_empty_err = False
-
-        for err in validate(doc).errors:
-            if err.msg == "Section type undefined" and err.obj.name == "sec_type_undefined":
-                sec_type_undefined_err = True
-            elif err.msg == "Section type undefined" and err.obj.name == "sec_type_empty":
-                sec_type_empty_err = True
-
-        assert sec_type_undefined_err
-        assert sec_type_empty_err
+        assert len(list(filter(
+            lambda x: x.msg == "Section type undefined" and x.obj.name == "sec_type_undefined",
+            validate(doc).errors))) > 0
+        assert len(list(filter(
+            lambda x: x.msg == "Section type undefined" and x.obj.name == "sec_type_empty",
+            validate(doc).errors))) > 0
 
     def test_load_dtypes_json(self):
         """
@@ -377,17 +406,12 @@ class TestValidation(unittest.TestCase):
         path = os.path.join(self.dir_path, "resources", "validation_section.yaml")
         doc = odml.load(path, "YAML")
 
-        sec_type_undefined_err = False
-        sec_type_empty_err = False
-
-        for err in validate(doc).errors:
-            if err.msg == "Section type undefined" and err.obj.name == "sec_type_undefined":
-                sec_type_undefined_err = True
-            elif err.msg == "Section type undefined" and err.obj.name == "sec_type_empty":
-                sec_type_empty_err = True
-
-        assert sec_type_undefined_err
-        assert sec_type_empty_err
+        assert len(list(filter(
+            lambda x: x.msg == "Section type undefined" and x.obj.name == "sec_type_undefined",
+            validate(doc).errors))) > 0
+        assert len(list(filter(
+            lambda x: x.msg == "Section type undefined" and x.obj.name == "sec_type_empty",
+            validate(doc).errors))) > 0
 
     def test_load_dtypes_yaml(self):
         """

pip install -e .
parse_log_pytest
requirements.txt
pytest
apt-get update apt-get install -y gcc
3.9
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
docopt==0.6.2
exceptiongroup==1.2.2
iniconfig==2.1.0
isodate==0.7.2
lxml==5.3.1
-e git+https://github.com/G-Node/python-odml.git@7e9299e3a35f05fa87abe83c25715ead698fccda#egg=odML
packaging==24.2
pathlib==1.0.1
pluggy==1.5.0
pyparsing==3.2.3
pytest==8.3.5
PyYAML==6.0.2
rdflib==7.1.4
tomli==2.2.1

name: python-odml
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=3.0.16=h5eee18b_0
  - pip=25.0=py39h06a4308_0
  - python=3.9.21=he870216_1
  - readline=8.2=h5eee18b_0
  - setuptools=75.8.0=py39h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - tzdata=2025a=h04d1e81_0
  - wheel=0.45.1=py39h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - docopt==0.6.2
      - exceptiongroup==1.2.2
      - iniconfig==2.1.0
      - isodate==0.7.2
      - lxml==5.3.1
      - packaging==24.2
      - pathlib==1.0.1
      - pluggy==1.5.0
      - pyparsing==3.2.3
      - pytest==8.3.5
      - pyyaml==6.0.2
      - rdflib==7.1.4
      - tomli==2.2.1
prefix: /opt/conda/envs/python-odml

test/test_property.py::TestProperty::test_value_append test/test_property.py::TestProperty::test_value_extend test/test_validation.py::TestValidation::test_property_name_readable test/test_validation.py::TestValidation::test_section_name_readable
test/test_fileio.py::TestTypes::test_display test/test_fileio.py::TestTypes::test_invalid_parser test/test_fileio.py::TestTypes::test_load_save test/test_property.py::TestProperty::test_bool_conversion test/test_property.py::TestProperty::test_clone test/test_property.py::TestProperty::test_comparison test/test_property.py::TestProperty::test_dtype test/test_property.py::TestProperty::test_export_leaf test/test_property.py::TestProperty::test_get_merged_equivalent test/test_property.py::TestProperty::test_get_path test/test_property.py::TestProperty::test_get_set_value test/test_property.py::TestProperty::test_id test/test_property.py::TestProperty::test_merge test/test_property.py::TestProperty::test_merge_check test/test_property.py::TestProperty::test_name test/test_property.py::TestProperty::test_new_id test/test_property.py::TestProperty::test_parent test/test_property.py::TestProperty::test_simple_attributes test/test_property.py::TestProperty::test_str_to_int_convert test/test_property.py::TestProperty::test_value test/test_validation.py::TestValidation::test_errorfree test/test_validation.py::TestValidation::test_load_dtypes_json test/test_validation.py::TestValidation::test_load_dtypes_xml test/test_validation.py::TestValidation::test_load_dtypes_yaml test/test_validation.py::TestValidation::test_load_section_json test/test_validation.py::TestValidation::test_load_section_xml test/test_validation.py::TestValidation::test_load_section_yaml test/test_validation.py::TestValidation::test_prop_string_values test/test_validation.py::TestValidation::test_property_in_terminology test/test_validation.py::TestValidation::test_property_unique_ids test/test_validation.py::TestValidation::test_property_values test/test_validation.py::TestValidation::test_section_in_terminology test/test_validation.py::TestValidation::test_section_init test/test_validation.py::TestValidation::test_section_type test/test_validation.py::TestValidation::test_section_unique_ids test/test_validation.py::TestValidation::test_standalone_property test/test_validation.py::TestValidation::test_standalone_section test/test_validation.py::TestValidation::test_uniques
odml/validation.py odml/property.py
odml/validation.py odml/property.py