diff --git a/tests/validation/UNIT/TensorInfo.cpp b/tests/validation/UNIT/TensorInfo.cpp
new file mode 100644
index 0000000..2a6c336
--- /dev/null
+++ b/tests/validation/UNIT/TensorInfo.cpp
@@ -0,0 +1,89 @@
+/*
+ * Copyright (c) 2017 ARM Limited.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#include "arm_compute/core/TensorInfo.h"
+#include "arm_compute/core/Types.h"
+#include "tests/framework/Asserts.h"
+#include "tests/framework/Macros.h"
+#include "tests/framework/datasets/Datasets.h"
+#include "tests/validation/Validation.h"
+#include "utils/TypePrinter.h"
+
+namespace arm_compute
+{
+namespace test
+{
+namespace validation
+{
+TEST_SUITE(UNIT)
+TEST_SUITE(TensorInfoValidation)
+
+// *INDENT-OFF*
+// clang-format off
+DATA_TEST_CASE(AutoPadding, framework::DatasetMode::ALL, zip(zip(zip(
+               framework::dataset::make("TensorShape", {
+               TensorShape{},
+               TensorShape{ 10U },
+               TensorShape{ 10U, 10U },
+               TensorShape{ 10U, 10U, 10U },
+               TensorShape{ 10U, 10U, 10U, 10U },
+               TensorShape{ 10U, 10U, 10U, 10U, 10U },
+               TensorShape{ 10U, 10U, 10U, 10U, 10U, 10U }}),
+               framework::dataset::make("PaddingSize", {
+               PaddingSize{ 0, 0, 0, 0 },
+               PaddingSize{ 0, 36, 0, 4 },
+               PaddingSize{ 4, 36, 4, 4 },
+               PaddingSize{ 4, 36, 4, 4 },
+               PaddingSize{ 4, 36, 4, 4 },
+               PaddingSize{ 4, 36, 4, 4 },
+               PaddingSize{ 4, 36, 4, 4 }})),
+               framework::dataset::make("Strides", {
+               Strides{},
+               Strides{ 1U, 50U },
+               Strides{ 1U, 50U },
+               Strides{ 1U, 50U, 900U },
+               Strides{ 1U, 50U, 900U, 9000U },
+               Strides{ 1U, 50U, 900U, 9000U, 90000U },
+               Strides{ 1U, 50U, 900U, 9000U, 90000U, 900000U }})),
+               framework::dataset::make("Offset", { 0U, 4U, 204U, 204U, 204U, 204U, 204U })),
+               shape, auto_padding, strides, offset)
+{
+    TensorInfo info{ shape, Format::U8 };
+
+    ARM_COMPUTE_EXPECT(!info.has_padding(), framework::LogLevel::ERRORS);
+
+    info.auto_padding();
+
+    validate(info.padding(), auto_padding);
+
+    ARM_COMPUTE_EXPECT(compare_dimensions(info.strides_in_bytes(), strides), framework::LogLevel::ERRORS);
+    ARM_COMPUTE_EXPECT(info.offset_first_element_in_bytes() == offset, framework::LogLevel::ERRORS);
+}
+// clang-format on
+// *INDENT-ON*
+
+TEST_SUITE_END() // TensorInfoValidation
+TEST_SUITE_END()
+} // namespace validation
+} // namespace test
+} // namespace arm_compute
diff --git a/tests/validation/UNIT/TensorShape.cpp b/tests/validation/UNIT/TensorShape.cpp
new file mode 100644
index 0000000..31f95e3
--- /dev/null
+++ b/tests/validation/UNIT/TensorShape.cpp
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 2017 ARM Limited.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#include "tests/framework/Macros.h"
+#include "tests/framework/datasets/Datasets.h"
+#include "tests/validation/Validation.h"
+
+namespace arm_compute
+{
+namespace test
+{
+namespace validation
+{
+TEST_SUITE(UNIT)
+TEST_SUITE(TensorShapeValidation)
+
+// *INDENT-OFF*
+// clang-format off
+DATA_TEST_CASE(Construction, framework::DatasetMode::ALL, zip(zip(
+               framework::dataset::make("TensorShape", {
+               TensorShape{},
+               TensorShape{ 1U },
+               TensorShape{ 2U },
+               TensorShape{ 2U, 3U },
+               TensorShape{ 2U, 3U, 5U },
+               TensorShape{ 2U, 3U, 5U, 7U },
+               TensorShape{ 2U, 3U, 5U, 7U, 11U },
+               TensorShape{ 2U, 3U, 5U, 7U, 11U, 13U }}),
+               framework::dataset::make("NumDimensions", { 0U, 1U, 1U, 2U, 3U, 4U, 5U, 6U })),
+               framework::dataset::make("TotalSize", { 0U, 1U, 2U, 6U, 30U, 210U, 2310U, 30030U })),
+               shape, num_dimensions, total_size)
+{
+    ARM_COMPUTE_EXPECT(shape.num_dimensions() == num_dimensions, framework::LogLevel::ERRORS);
+    ARM_COMPUTE_EXPECT(shape.total_size() == total_size, framework::LogLevel::ERRORS);
+}
+// clang-format on
+// *INDENT-ON*
+
+DATA_TEST_CASE(SetEmpty, framework::DatasetMode::ALL, framework::dataset::make("Dimension", { 0U, 1U, 2U, 3U, 4U, 5U }), dimension)
+{
+    TensorShape shape;
+
+    shape.set(dimension, 10);
+
+    ARM_COMPUTE_EXPECT(shape.num_dimensions() == dimension + 1, framework::LogLevel::ERRORS);
+    ARM_COMPUTE_EXPECT(shape.total_size() == 10, framework::LogLevel::ERRORS);
+}
+
+TEST_SUITE_END() // TensorShapeValidation
+TEST_SUITE_END()
+} // namespace validation
+} // namespace test
+} // namespace arm_compute
diff --git a/tests/validation_old/UNIT/TensorInfo.cpp b/tests/validation_old/UNIT/TensorInfo.cpp
deleted file mode 100644
index ec1db42..0000000
--- a/tests/validation_old/UNIT/TensorInfo.cpp
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Copyright (c) 2017 ARM Limited.
- *
- * SPDX-License-Identifier: MIT
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to
- * deal in the Software without restriction, including without limitation the
- * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
- * sell copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-#include "tests/validation_old/Validation.h"
-#include "utils/TypePrinter.h"
-
-#include "arm_compute/core/TensorInfo.h"
-#include "arm_compute/core/Types.h"
-
-#include "tests/validation_old/boost_wrapper.h"
-
-using namespace arm_compute;
-using namespace arm_compute::test;
-using namespace arm_compute::test::validation;
-
-#ifndef DOXYGEN_SKIP_THIS
-BOOST_AUTO_TEST_SUITE(UNIT)
-BOOST_AUTO_TEST_SUITE(TensorInfoValidation)
-
-BOOST_TEST_DECORATOR(*boost::unit_test::label("precommit") * boost::unit_test::label("nightly"))
-BOOST_DATA_TEST_CASE(AutoPadding,
-                     boost::unit_test::data::make({ TensorShape{},
-                                                    TensorShape{ 10U },
-                                                    TensorShape{ 10U, 10U },
-                                                    TensorShape{ 10U, 10U, 10U },
-                                                    TensorShape{ 10U, 10U, 10U, 10U },
-                                                    TensorShape{ 10U, 10U, 10U, 10U, 10U },
-                                                    TensorShape{ 10U, 10U, 10U, 10U, 10U, 10U }
-                                                  })
-                     ^ boost::unit_test::data::make({ PaddingSize{ 0, 0, 0, 0 },
-                                                      PaddingSize{ 0, 36, 0, 4 },
-                                                      PaddingSize{ 4, 36, 4, 4 },
-                                                      PaddingSize{ 4, 36, 4, 4 },
-                                                      PaddingSize{ 4, 36, 4, 4 },
-                                                      PaddingSize{ 4, 36, 4, 4 },
-                                                      PaddingSize{ 4, 36, 4, 4 }
-                                                    })
-                     ^ boost::unit_test::data::make({ Strides{},
-                                                      Strides{ 1U, 50U },
-                                                      Strides{ 1U, 50U },
-                                                      Strides{ 1U, 50U, 900U },
-                                                      Strides{ 1U, 50U, 900U, 9000U },
-                                                      Strides{ 1U, 50U, 900U, 9000U, 90000U },
-                                                      Strides{ 1U, 50U, 900U, 9000U, 90000U, 900000U }
-                                                    })
-                     ^ boost::unit_test::data::make(
-{
-    0,
-    4,
-    204,
-    204,
-    204,
-    204,
-    204,
-}),
-shape, auto_padding, strides, offset)
-{
-    TensorInfo info{ shape, Format::U8 };
-
-    BOOST_TEST(!info.has_padding());
-
-    info.auto_padding();
-
-    validate(info.padding(), auto_padding);
-    BOOST_TEST(compare_dimensions(info.strides_in_bytes(), strides));
-    BOOST_TEST(info.offset_first_element_in_bytes() == offset);
-}
-
-BOOST_AUTO_TEST_SUITE_END()
-BOOST_AUTO_TEST_SUITE_END()
-#endif /* DOXYGEN_SKIP_THIS */
diff --git a/tests/validation_old/UNIT/TensorShape.cpp b/tests/validation_old/UNIT/TensorShape.cpp
deleted file mode 100644
index ef888b2..0000000
--- a/tests/validation_old/UNIT/TensorShape.cpp
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright (c) 2017 ARM Limited.
- *
- * SPDX-License-Identifier: MIT
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to
- * deal in the Software without restriction, including without limitation the
- * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
- * sell copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-#include "tests/validation_old/Validation.h"
-#include "utils/TypePrinter.h"
-
-#include "arm_compute/core/TensorShape.h"
-
-#include "tests/validation_old/boost_wrapper.h"
-
-using namespace arm_compute;
-using namespace arm_compute::test;
-using namespace arm_compute::test::validation;
-
-#ifndef DOXYGEN_SKIP_THIS
-BOOST_AUTO_TEST_SUITE(UNIT)
-BOOST_AUTO_TEST_SUITE(TensorShapeValidation)
-
-BOOST_TEST_DECORATOR(*boost::unit_test::label("precommit") * boost::unit_test::label("nightly"))
-BOOST_DATA_TEST_CASE(Construction,
-                     boost::unit_test::data::make({ TensorShape{},
-                                                    TensorShape{ 1U },
-                                                    TensorShape{ 2U },
-                                                    TensorShape{ 2U, 3U },
-                                                    TensorShape{ 2U, 3U, 5U },
-                                                    TensorShape{ 2U, 3U, 5U, 7U },
-                                                    TensorShape{ 2U, 3U, 5U, 7U, 11U },
-                                                    TensorShape{ 2U, 3U, 5U, 7U, 11U, 13U }
-                                                  })
-                     ^ boost::unit_test::data::make({ 0, 1, 1, 2, 3, 4, 5, 6 }) ^ boost::unit_test::data::make({ 0, 1, 2, 6, 30, 210, 2310, 30030 }),
-                     shape, num_dimensions, total_size)
-{
-    BOOST_TEST(shape.num_dimensions() == num_dimensions);
-    BOOST_TEST(shape.total_size() == total_size);
-}
-
-BOOST_TEST_DECORATOR(*boost::unit_test::label("precommit") * boost::unit_test::label("nightly"))
-BOOST_DATA_TEST_CASE(SetEmpty, boost::unit_test::data::make({ 0, 1, 2, 3, 4, 5 }), dimension)
-{
-    TensorShape shape;
-
-    shape.set(dimension, 10);
-
-    BOOST_TEST(shape.num_dimensions() == dimension + 1);
-    BOOST_TEST(shape.total_size() == 10);
-}
-
-BOOST_AUTO_TEST_SUITE_END()
-BOOST_AUTO_TEST_SUITE_END()
-#endif /* DOXYGEN_SKIP_THIS */
