diff --git a/python/pyarmnn/conftest.py b/python/pyarmnn/conftest.py
new file mode 100644
index 0000000..af6b8da
--- /dev/null
+++ b/python/pyarmnn/conftest.py
@@ -0,0 +1,52 @@
+# Copyright © 2020 Arm Ltd. All rights reserved.
+# SPDX-License-Identifier: MIT
+import os
+import platform
+
+import pytest
+
+ARCHITECTURES = set("x86_64 aarch64".split())
+
+
+@pytest.fixture(scope="module")
+def data_folder_per_test(request):
+    """
+        This fixture returns path to folder with test resources (one per test module)
+    """
+
+    basedir, script = request.fspath.dirname, request.fspath.basename
+    return str(os.path.join(basedir, "testdata", os.path.splitext(script)[0]))
+
+
+@pytest.fixture(scope="module")
+def shared_data_folder(request):
+    """
+        This fixture returns path to folder with shared test resources among all tests
+    """
+
+    return str(os.path.join(request.fspath.dirname, "testdata", "shared"))
+
+
+@pytest.fixture(scope="function")
+def tmpdir(tmpdir):
+    """
+        This fixture returns path to temp folder. Fixture was added for py35 compatibility
+    """
+
+    return str(tmpdir)
+
+
+def pytest_runtest_setup(item):
+    supported_architectures = ARCHITECTURES.intersection(mark.name for mark in item.iter_markers())
+    arch = platform.machine()
+    if supported_architectures and arch not in supported_architectures:
+        pytest.skip("cannot run on platform {}".format(arch))
+
+
+def pytest_configure(config):
+    config.addinivalue_line(
+        "markers", "aarch64: mark test to run only on aarch64"
+    )
+    config.addinivalue_line(
+        "markers", "x86_64: mark test to run only on x86_64"
+    )
\ No newline at end of file
