File refactor-unittest-to-pytest.diff of Package cobbler

Index: cobbler-3.0.0+git20190222.9e502a9d/.dockerignore
===================================================================
--- /dev/null
+++ cobbler-3.0.0+git20190222.9e502a9d/.dockerignore
@@ -0,0 +1,13 @@
+# Created by .ignore support plugin (hsz.mobi)
+# Idea settings
+.idea/
+
+# Python venvs
+venv/
+venv3/
+
+# Coverage
+covhtml/
+
+# Python stuff
+**/__pycache__
Index: cobbler-3.0.0+git20190222.9e502a9d/Dockerfile
===================================================================
--- cobbler-3.0.0+git20190222.9e502a9d.orig/Dockerfile
+++ cobbler-3.0.0+git20190222.9e502a9d/Dockerfile
@@ -9,7 +9,7 @@ COPY . /test_dir
 
 VOLUME [ "/sys/fs/cgroup" ]
 
-RUN tests/setup-test-docker.sh
+RUN ["/bin/bash", "-c", "tests/setup-test-docker.sh"]
 
 # Set this as an entrypoint
 CMD ["/usr/lib/systemd/systemd", "--system"]
Index: cobbler-3.0.0+git20190222.9e502a9d/cobbler/remote.py
===================================================================
--- cobbler-3.0.0+git20190222.9e502a9d.orig/cobbler/remote.py
+++ cobbler-3.0.0+git20190222.9e502a9d/cobbler/remote.py
@@ -724,28 +724,28 @@ class CobblerXMLRPCInterface(object):
         self.api.remove_item(what, name, delete=True, with_triggers=True, recursive=recursive, logger=self.logger)
         return True
 
-    def remove_distro(self, name, token, recursive=1):
+    def remove_distro(self, name, token, recursive=True):
         return self.remove_item("distro", name, token, recursive)
 
-    def remove_profile(self, name, token, recursive=1):
+    def remove_profile(self, name, token, recursive=True):
         return self.remove_item("profile", name, token, recursive)
 
-    def remove_system(self, name, token, recursive=1):
+    def remove_system(self, name, token, recursive=True):
         return self.remove_item("system", name, token, recursive)
 
-    def remove_repo(self, name, token, recursive=1):
+    def remove_repo(self, name, token, recursive=True):
         return self.remove_item("repo", name, token, recursive)
 
-    def remove_image(self, name, token, recursive=1):
+    def remove_image(self, name, token, recursive=True):
         return self.remove_item("image", name, token, recursive)
 
-    def remove_mgmtclass(self, name, token, recursive=1):
+    def remove_mgmtclass(self, name, token, recursive=True):
         return self.remove_item("mgmtclass", name, token, recursive)
 
-    def remove_package(self, name, token, recursive=1):
+    def remove_package(self, name, token, recursive=True):
         return self.remove_item("package", name, token, recursive)
 
-    def remove_file(self, name, token, recursive=1):
+    def remove_file(self, name, token, recursive=True):
         return self.remove_item("file", name, token, recursive)
 
     def copy_item(self, what, object_id, newname, token=None):
Index: cobbler-3.0.0+git20190222.9e502a9d/setup.py
===================================================================
--- cobbler-3.0.0+git20190222.9e502a9d.orig/setup.py
+++ cobbler-3.0.0+git20190222.9e502a9d/setup.py
@@ -20,7 +20,6 @@ from distutils.command.build import buil
 from configparser import ConfigParser
 
 import codecs
-import unittest
 from coverage import Coverage
 import pwd
 import shutil
@@ -396,14 +395,13 @@ class test_command(Command):
         pass
 
     def run(self):
-        tests = unittest.TestLoader().discover("tests", pattern="*[t|T]est*.py")
-        runner = unittest.TextTestRunner(verbosity=1)
+        import pytest
 
         cov = Coverage()
         cov.erase()
         cov.start()
 
-        result = runner.run(tests)
+        result = pytest.main()
 
         cov.stop()
         cov.save()
Index: cobbler-3.0.0+git20190222.9e502a9d/tests/cli/cobbler_cli_direct_test.py
===================================================================
--- cobbler-3.0.0+git20190222.9e502a9d.orig/tests/cli/cobbler_cli_direct_test.py
+++ cobbler-3.0.0+git20190222.9e502a9d/tests/cli/cobbler_cli_direct_test.py
@@ -1,7 +1,7 @@
 import os
 import re
 import shlex
-import unittest
+import pytest
 from cobbler import utils
 
 dummy_file_path = "/root/dummy"
@@ -32,57 +32,45 @@ def get_last_line(lines):
     return lines[i]
 
 
-class CobblerCliTestDirect(unittest.TestCase):
+class CobblerCliTestDirect:
     """
     Tests Cobbler CLI direct commands
     """
 
-    def setUp(self):
-        """
-        Set up
-        """
-        return
-
-    def tearDown(self):
-        """
-        Cleanup here
-        """
-        return
-
     def test_cobbler_version(self):
         """Runs 'cobbler version'"""
         output = run_cmd("cobbler version")
         line = output.split("\n")[0]
         match_obj = re.match(r"Cobbler \d+\.\d+\.\d+", line)
-        self.assertTrue(match_obj is not None)
+        assert match_obj is not None
 
     def test_cobbler_status(self):
         """Runs 'cobbler status'"""
         output = run_cmd("cobbler status")
         lines = output.split("\n")
         match_obj = re.match(r"ip\s+|target\s+|start\s+|state\s+", lines[0])
-        self.assertTrue(match_obj is not None)
+        assert match_obj is not None
 
     def test_cobbler_sync(self):
         """Runs 'cobbler sync'"""
         output = run_cmd("cobbler sync")
         lines = output.split("\n")
-        self.assertEqual("*** TASK COMPLETE ***", get_last_line(lines))
+        assert "*** TASK COMPLETE ***" == get_last_line(lines)
 
     def test_cobbler_signature_report(self):
         """Runs 'cobbler signature report'"""
         output = run_cmd("cobbler signature report")
         lines = output.split("\n")
-        self.assertTrue("Currently loaded signatures:" == lines[0])
+        assert "Currently loaded signatures:" == lines[0]
         expected_output = r"\d+ breeds with \d+ total signatures loaded"
         match_obj = re.match(expected_output, get_last_line(lines))
-        self.assertTrue(match_obj is not None)
+        assert match_obj is not None
 
     def test_cobbler_signature_update(self):
         """Runs 'cobbler signature update'"""
         output = run_cmd("cobbler signature update")
         lines = output.split("\n")
-        self.assertEqual("*** TASK COMPLETE ***", get_last_line(lines))
+        assert "*** TASK COMPLETE ***" == get_last_line(lines)
 
     def test_cobbler_acl_adduser(self):
         """Runs 'cobbler aclsetup --adduser'"""
@@ -115,13 +103,13 @@ class CobblerCliTestDirect(unittest.Test
 
         output = run_cmd("cobbler buildiso")
         lines = output.split("\n")
-        self.assertEqual("*** TASK COMPLETE ***", get_last_line(lines))
-        self.assertTrue(os.path.isfile("/root/generated.iso"))
+        assert "*** TASK COMPLETE ***" == get_last_line(lines)
+        assert os.path.isfile("/root/generated.iso")
 
     def _assert_list_section(self, lines, start_line, section_name):
 
         i = start_line
-        self.assertEqual(lines[i], "%s:" % section_name)
+        assert lines[i] == "%s:" % section_name
         i += 1
         while lines[i] != "":
             i += 1
@@ -146,10 +134,10 @@ class CobblerCliTestDirect(unittest.Test
     def _assert_report_section(self, lines, start_line, section_name):
 
         i = start_line
-        self.assertEqual(lines[i], "%s:" % section_name)
+        assert lines[i] == "%s:" % section_name
         i += 1
         match_obj = re.match(r"=+$", lines[i].strip())
-        self.assertTrue(match_obj is not None)
+        assert match_obj is not None
         i += 1
         while i < len(lines) - 1 and re.match(r"=+$", lines[i + 1]) is None:
             while i < len(lines) and lines[i] != "":
@@ -175,7 +163,7 @@ class CobblerCliTestDirect(unittest.Test
     def test_cobbler_getloaders(self):
         output = run_cmd("cobbler get-loaders")
         lines = output.split("\n")
-        self.assertEqual("*** TASK COMPLETE ***", get_last_line(lines))
+        assert "*** TASK COMPLETE ***" == get_last_line(lines)
 
     def test_cobbler_hardlink(self):
         # TODO: test cobbler hardlink
@@ -188,7 +176,3 @@ class CobblerCliTestDirect(unittest.Test
     def test_cobbler_validate_autoinstalls(self):
         # TODO: test cobbler validateks
         raise NotImplementedError()
-
-
-if __name__ == '__main__':
-    unittest.main()
Index: cobbler-3.0.0+git20190222.9e502a9d/tests/cli/cobbler_cli_object_test.py
===================================================================
--- cobbler-3.0.0+git20190222.9e502a9d.orig/tests/cli/cobbler_cli_object_test.py
+++ cobbler-3.0.0+git20190222.9e502a9d/tests/cli/cobbler_cli_object_test.py
@@ -1,7 +1,7 @@
 import os
 import re
 import shlex
-import unittest
+import pytest
 
 from cobbler import utils
 
@@ -49,32 +49,38 @@ def get_last_line(lines):
     return lines[i]
 
 
-class CobblerCliTestObject(unittest.TestCase):
+@pytest.fixture(scope="class")
+def setup():
     """
-    Test CLI commands on objects
+    Initializes testcase
     """
 
-    def setUp(self):
-        """
-        Initializes testcase
-        """
+    # create files if necessary
+    if not os.path.exists(dummy_file_path):
+        open(dummy_file_path, 'w').close()
 
-        # create files if necessary
-        if not os.path.exists(dummy_file_path):
-            open(dummy_file_path, 'w').close()
-
-        # @TODO: delete objects which will be added if they exist
-        #        currently, if tests fail, tester may have to delete objects
-        #        manually before running tests again
+    # TODO: delete objects which will be added if they exist
+    #        currently, if tests fail, tester may have to delete objects
+    #        manually before running tests again
 
-    def tearDown(self):
-        """
-        Cleans up testcase
-        """
 
-        # remove files
-        if os.path.exists(dummy_file_path):
-            os.remove(dummy_file_path)
+@pytest.fixture(scope="class")
+def teardown():
+    """
+    Cleans up testcase
+    """
+
+    yield
+    # remove files
+    if os.path.exists(dummy_file_path):
+        os.remove(dummy_file_path)
+
+
+@pytest.mark.usefixtures("setup", "teardown")
+class CobblerCliTestObject:
+    """
+    Test CLI commands on objects
+    """
 
     def list_objects(self, object_type):
         """
@@ -120,7 +126,7 @@ class CobblerCliTestObject(unittest.Test
                 cur_object = match_obj.group(1)
                 self.assertTrue(match_obj.group(1) in objects)
                 found_objects[cur_object] = True
-        self.assertTrue(False not in found_objects.values())
+        assert False not in found_objects.values()
 
         # cobbler <type> report <name>
         output = run_cmd("cobbler %s report --name=%s" % (object_type, name))
@@ -130,7 +136,7 @@ class CobblerCliTestObject(unittest.Test
         for line in lines:
             if re.match(regex, line):
                 found = True
-        self.assertTrue(found)
+        assert found
 
         # cobbler <type> edit
         cmd = "cobbler %s edit --name=%s --%s='%s'" % (object_type, name, attr["name"], attr["value"])
@@ -143,19 +149,19 @@ class CobblerCliTestObject(unittest.Test
         for line in lines:
             if re.match(regex, line):
                 found = True
-        self.assertTrue(found)
+        assert found
 
         # cobbler <type> find
         cmd = "cobbler %s find --%s='%s'" % (object_type, attr["name"], attr["value"])
         output = run_cmd(cmd)
         lines = output.split("\n")
-        self.assertTrue(len(lines) >= 1)
+        assert len(lines) >= 1
 
         # cobbler <type> copy
         run_cmd("cobbler %s copy --name=%s --newname=%s" % (object_type, name, "%s-copy" % name))
 
         new_objects = self.list_objects(object_type)
-        self.assertTrue(len(new_objects) == len(objects) + 1)
+        assert len(new_objects) == len(objects) + 1
 
         # cobbler <type> rename
         cmd = "cobbler %s rename --name=%s --newname=%s" % (object_type, name, new_name)
@@ -167,7 +173,7 @@ class CobblerCliTestObject(unittest.Test
         run_cmd("cobbler %s remove --name=%s-copy" % (object_type, name))
 
         new_objects = self.list_objects(object_type)
-        self.assertTrue(len(new_objects) == len(objects))
+        assert len(new_objects) == len(objects)
 
     def test_distro(self, remove):
 
@@ -186,7 +192,7 @@ class CobblerCliTestObject(unittest.Test
         output = run_cmd(cmd)
 
         new_distros = self.list_objects(item_type)
-        self.assertTrue(len(new_distros) == len(distros) + 1)
+        assert len(new_distros) == len(distros) + 1
 
         self.test_generic_commands(item_type, distro_name, attr, new_distros)
 
@@ -210,7 +216,7 @@ class CobblerCliTestObject(unittest.Test
         run_cmd(cmd)
 
         new_profiles = self.list_objects(item_type)
-        self.assertTrue(len(new_profiles) == len(profiles) + 1)
+        assert len(new_profiles) == len(profiles) + 1
 
         self.test_generic_commands(item_type, profile_name, attr, new_profiles)
 
@@ -234,7 +240,7 @@ class CobblerCliTestObject(unittest.Test
         run_cmd(cmd)
 
         new_systems = self.list_objects(item_type)
-        self.assertTrue(len(new_systems) == len(systems) + 1)
+        assert len(new_systems) == len(systems) + 1
 
         self.test_generic_commands(item_type, system_name, attr, new_systems)
 
@@ -257,7 +263,7 @@ class CobblerCliTestObject(unittest.Test
         output = run_cmd(cmd)
 
         new_images = self.list_objects(item_type)
-        self.assertTrue(len(new_images) == len(images) + 1)
+        assert len(new_images) == len(images) + 1
 
         self.test_generic_commands(item_type, image_name, attr, new_images)
 
@@ -280,7 +286,7 @@ class CobblerCliTestObject(unittest.Test
         output = run_cmd(cmd)
 
         new_repos = self.list_objects(item_type)
-        self.assertTrue(len(new_repos) == len(repos) + 1)
+        assert len(new_repos) == len(repos) + 1
 
         self.test_generic_commands(item_type, repo_name, attr, new_repos)
 
@@ -303,7 +309,7 @@ class CobblerCliTestObject(unittest.Test
         output = run_cmd(cmd)
 
         new_mgmt_classes = self.list_objects(item_type)
-        self.assertTrue(len(new_mgmt_classes) == len(mgmt_classes) + 1)
+        assert len(new_mgmt_classes) == len(mgmt_classes) + 1
 
         self.test_generic_commands(item_type, mgmtclass_name, attr, new_mgmt_classes)
 
@@ -326,13 +332,9 @@ class CobblerCliTestObject(unittest.Test
         output = run_cmd(cmd)
 
         new_packages = self.list_objects(item_type)
-        self.assertTrue(len(new_packages) == len(packages) + 1)
+        assert len(new_packages) == len(packages) + 1
 
         self.test_generic_commands(item_type, package_name, attr, new_packages)
 
         # cobbler <type> remove
         run_cmd("cobbler %s remove --name=%s" % (item_type, package_name))
-
-
-if __name__ == '__main__':
-    unittest.main()
Index: cobbler-3.0.0+git20190222.9e502a9d/tests/cli/imports/conftest.py
===================================================================
--- /dev/null
+++ cobbler-3.0.0+git20190222.9e502a9d/tests/cli/imports/conftest.py
@@ -0,0 +1,68 @@
+import pytest
+
+from cobbler import utils
+
+
+# TODO: scan output of import to build list of imported distros/profiles
+#       and compare to expected list. Then use that list to run reports
+#       and for later cleanup
+
+
+@pytest.fixture(scope="class")
+def setup():
+    """
+    Setup the import tests. Currently just "pass".
+    """
+    pass
+
+
+@pytest.fixture(scope="class")
+def teardown():
+    """
+    Teardown the import tests. Currently just "pass".
+    """
+    yield
+    pass
+
+
+@pytest.fixture()
+def import_distro(name, path):
+    """
+    Imports a distribution with the cobbler cli-command into a running system.
+    :param name: Name of the distro.
+    :param path: Path to the distro.
+    :return: A touple of the data which is returned by the cobbler-cli-client and the status.
+    """
+    return utils.subprocess_sp(None, ["cobbler", "import", "--name=test-%s" % name, "--path=%s" % path],
+                               shell=False)
+
+
+@pytest.fixture()
+def report_distro(name):
+    """
+    Asks the cobbler cli about a report for the given distribution.
+    :param name: Name of the distribution.
+    :return: A touple of the data which is returned by the cobbler-cli-client and the status.
+    """
+    return utils.subprocess_sp(None, ["cobbler", "distro", "report", "--name=test-%s" % name], shell=False)
+
+
+@pytest.fixture()
+def report_profile(name):
+    """
+    Asks the cobbler cli about a report for a given profile.
+    :param name: Name of the profile.
+    :return: A touple of the data which is returned by the cobbler-cli-client and the status.
+    """
+    return utils.subprocess_sp(None, ["cobbler", "profile", "report", "--name=test-%s" % name], shell=False)
+
+
+@pytest.fixture()
+def remove_distro(name):
+    """
+    Performs a remove for a distribution via the cobbler-cli for a given distribution.
+    :param name: Name of the distribution.
+    :return: A touple of the data which is returned by the cobbler-cli-client and the status.
+    """
+    return utils.subprocess_sp(None, ["cobbler", "distro", "remove", "--recursive", "--name=test-%s" % name],
+                               shell=False)
Index: cobbler-3.0.0+git20190222.9e502a9d/tests/cli/imports/debian_import_test.py
===================================================================
--- /dev/null
+++ cobbler-3.0.0+git20190222.9e502a9d/tests/cli/imports/debian_import_test.py
@@ -0,0 +1,23 @@
+import pytest
+
+class Test_Debian_Imports():
+    """
+    Tests imports of various distros
+    """
+
+    distros = [
+        {"name": "debian_6.0.5-x86_64", "desc": "Debian Sarge (6.0.5) amd64",
+         "path": "/vagrant/distros/debian_6.0.5_amd64"},
+    ]
+
+    @pytest.mark.skip(reason="Not fixed!")
+    @pytest.mark.parametrize("name, desc, path", distros)
+    def test_debian_import(self, name, desc, path, import_distro, report_distro, report_profile, remove_distro):
+        (data, rc) = import_distro(name, path)
+        assert rc == 0
+        (data, rc) = remove_distro(name)
+        assert rc == 0
+        (data, rc) = report_profile(name)
+        assert rc == 0
+        (data, rc) = remove_distro(name)
+        assert rc == 0
Index: cobbler-3.0.0+git20190222.9e502a9d/tests/cli/imports/freebsd_import_test.py
===================================================================
--- /dev/null
+++ cobbler-3.0.0+git20190222.9e502a9d/tests/cli/imports/freebsd_import_test.py
@@ -0,0 +1,25 @@
+import pytest
+
+
+class Test_FreeBSD_Imports():
+    """
+    Tests imports of various distros
+    """
+    distros = [
+        {"name": "freebsd8.2-x86_64", "desc": "FreeBSD 8.2 amd64", "path": "/vagrant/distros/freebsd8.2_amd64"},
+        {"name": "freebsd8.3-x86_64", "desc": "FreeBSD 8.3 amd64", "path": "/vagrant/distros/freebsd8.3_amd64"},
+        {"name": "freebsd9.0-i386", "desc": "FreeBSD 9.0 i386", "path": "/vagrant/distros/freebsd9.0_i386"},
+        {"name": "freebsd9.0-x86_64", "desc": "FreeBSD 9.0 amd64", "path": "/vagrant/distros/freebsd9.0_amd64"},
+    ]
+
+    @pytest.mark.skip(reason="Not fixed!")
+    @pytest.mark.parametrize("name, desc, path", distros)
+    def test_freebsd_import(self, name, desc, path, import_distro, report_distro, report_profile, remove_distro):
+        (data, rc) = import_distro(name, path)
+        assert rc == 0
+        (data, rc) = remove_distro(name)
+        assert rc == 0
+        (data, rc) = report_profile(name)
+        assert rc == 0
+        (data, rc) = remove_distro(name)
+        assert rc == 0
Index: cobbler-3.0.0+git20190222.9e502a9d/tests/cli/imports/import_base.py
===================================================================
--- cobbler-3.0.0+git20190222.9e502a9d.orig/tests/cli/imports/import_base.py
+++ /dev/null
@@ -1,51 +0,0 @@
-import unittest
-
-from cobbler import utils
-
-
-class CobblerImportTest(unittest.TestCase):
-    imported_distros = []
-
-    def setUp(self):
-        """
-        Set up, mounts NFS share
-        """
-
-    def tearDown(self):
-        """
-        Cleanup here
-        """
-        for d in self.imported_distros:
-            try:
-                (data, rc) = utils.subprocess_sp(None, ["cobbler", "distro", "remove", "--recursive", "--name=%s" % d],
-                                                 shell=False)
-            except:
-                print("Failed to remove distro '%s' during cleanup" % d)
-
-
-def create_import_func(data):
-    name = data["name"]
-    desc = data["desc"]
-    path = data["path"]
-
-    def do_import(self):
-        print("doing import, name=%s, desc=%s, path=%s" % (name, desc, path))
-        (data, rc) = utils.subprocess_sp(None, ["cobbler", "import", "--name=test-%s" % name, "--path=%s" % path],
-                                         shell=False)
-        print(data)
-        self.assertEqual(rc, 0)
-        # TODO: scan output of import to build list of imported distros/profiles
-        #       and compare to expected list. Then use that list to run reports
-        #       and for later cleanup
-        (data, rc) = utils.subprocess_sp(None, ["cobbler", "distro", "report", "--name=test-%s" % name], shell=False)
-        print(data)
-        self.assertEqual(rc, 0)
-        (data, rc) = utils.subprocess_sp(None, ["cobbler", "profile", "report", "--name=test-%s" % name], shell=False)
-        print(data)
-        self.assertEqual(rc, 0)
-        (data, rc) = utils.subprocess_sp(None, ["cobbler", "distro", "remove", "--recursive", "--name=test-%s" % name],
-                                         shell=False)
-        print(data)
-        self.assertEqual(rc, 0)
-
-    return do_import
Index: cobbler-3.0.0+git20190222.9e502a9d/tests/cli/imports/redhat_import_test.py
===================================================================
--- /dev/null
+++ cobbler-3.0.0+git20190222.9e502a9d/tests/cli/imports/redhat_import_test.py
@@ -0,0 +1,27 @@
+import pytest
+
+class Test_RedHat_Imports():
+    """
+    Tests imports of various distros
+    """
+    distros = [
+        {"name": "rhel58-x86_64", "desc": "RHEL 5.8 x86_64", "path": "/vagrant/distros/rhel58_x86_64"},
+        {"name": "rhel63-x86_64", "desc": "RHEL 6.3 x86_64", "path": "/vagrant/distros/rhel63_x86_64"},
+        {"name": "centos63-x86_64", "desc": "CentOS 6.3 x86_64", "path": "/vagrant/distros/centos63_x86_64"},
+        {"name": "sl62-x86_64", "desc": "Scientific Linux 6.2 x86_64", "path": "/vagrant/distros/sl62_x86_64"},
+        {"name": "f16-x86_64", "desc": "Fedora 16 x86_64", "path": "/vagrant/distros/f16_x86_64"},
+        {"name": "f17-x86_64", "desc": "Fedora 17 x86_64", "path": "/vagrant/distros/f17_x86_64"},
+        {"name": "f18-x86_64", "desc": "Fedora 18 x86_64", "path": "/vagrant/distros/f18_x86_64"},
+    ]
+
+    @pytest.mark.skip(reason="Not fixed!")
+    @pytest.mark.parametrize("name, desc, path", distros)
+    def test_redhat_import(self, name, desc, path, import_distro, report_distro, report_profile, remove_distro):
+        (data, rc) = import_distro(name, path)
+        assert rc == 0
+        (data, rc) = remove_distro(name)
+        assert rc == 0
+        (data, rc) = report_profile(name)
+        assert rc == 0
+        (data, rc) = remove_distro(name)
+        assert rc == 0
Index: cobbler-3.0.0+git20190222.9e502a9d/tests/cli/imports/suse_import_test.py
===================================================================
--- /dev/null
+++ cobbler-3.0.0+git20190222.9e502a9d/tests/cli/imports/suse_import_test.py
@@ -0,0 +1,36 @@
+import pytest
+
+
+class Test_Suse_Imports():
+    """
+    Tests imports of various distros
+    """
+    distros = [
+        {"name": "opensuse11.3-i386", "desc": "OpenSuSE 11.3 i586", "path": "/vagrant/distros/opensuse11.3_i586"},
+        {"name": "opensuse11.4-x86_64", "desc": "OpenSuSE 11.4 x86_64", "path": "/vagrant/distros/opensuse11.4_x86_64"},
+        {"name": "opensuse12.1-x86_64", "desc": "OpenSuSE 12.1 x86_64", "path": "/vagrant/distros/opensuse12.1_x86_64"},
+        {"name": "opensuse12.2-i386", "desc": "OpenSuSE 12.2 i586", "path": "/vagrant/distros/opensuse12.2_i586"},
+        {"name": "opensuse12.2-x86_64", "desc": "OpenSuSE 12.2 x86_64", "path": "/vagrant/distros/opensuse12.2_x86_64"},
+        {"name": "opensuse12.3-i386", "desc": "OpenSuSE 12.3 i586", "path": "/vagrant/distros/opensuse12.3_i586"},
+        {"name": "opensuse12.3-x86_64", "desc": "OpenSuSE 12.3 x86_64", "path": "/vagrant/distros/opensuse12.3_x86_64"},
+        {"name": "opensuse13.1-i386", "desc": "OpenSuSE 13.1 i586", "path": "/vagrant/distros/opensuse13.1_i586"},
+        {"name": "opensuse13.1-x86_64", "desc": "OpenSuSE 13.1 x86_64", "path": "/vagrant/distros/opensuse13.1_x86_64"},
+        {"name": "sles11_sp2-i386", "desc": "SLES 11 SP2 i586", "path": "/vagrant/distros/sles11_sp2_i586"},
+        {"name": "sles11_sp2-x86_64", "desc": "SLES 11 SP2 x86_64", "path": "/vagrant/distros/sles11_sp2_x86_64"},
+        {"name": "sles11_sp2-ppc64", "desc": "SLES 11 SP2 ppc64", "path": "/vagrant/distros/sles11_sp2_ppc64"},
+        {"name": "sles11_sp3-i386", "desc": "SLES 11 SP3 i586", "path": "/vagrant/distros/sles11_sp3_i586"},
+        {"name": "sles11_sp3-x86_64", "desc": "SLES 11 SP3 x86_64", "path": "/vagrant/distros/sles11_sp3_x86_64"},
+        {"name": "sles11_sp3-ppc64", "desc": "SLES 11 SP3 ppc64", "path": "/vagrant/distros/sles11_sp3_ppc64"},
+    ]
+
+    @pytest.mark.skip(reason="Not fixed!")
+    @pytest.mark.parametrize("name, desc, path", distros)
+    def test_suse_import(self, name, desc, path, import_distro, report_distro, report_profile, remove_distro):
+        (data, rc) = import_distro(name, path)
+        assert rc == 0
+        (data, rc) = remove_distro(name)
+        assert rc == 0
+        (data, rc) = report_profile(name)
+        assert rc == 0
+        (data, rc) = remove_distro(name)
+        assert rc == 0
Index: cobbler-3.0.0+git20190222.9e502a9d/tests/cli/imports/test_debian/debian_import_test.py
===================================================================
--- cobbler-3.0.0+git20190222.9e502a9d.orig/tests/cli/imports/test_debian/debian_import_test.py
+++ /dev/null
@@ -1,22 +0,0 @@
-from tests.cli.imports.import_base import CobblerImportTest
-from tests.cli.imports.import_base import create_import_func
-
-
-class Test_Debian_Imports(CobblerImportTest):
-    """
-    Tests imports of various distros
-    """
-    pass
-
-
-distros = [
-    {"name": "debian_6.0.5-x86_64", "desc": "Debian Sarge (6.0.5) amd64",
-     "path": "/vagrant/distros/debian_6.0.5_amd64"},
-]
-
-for i in range(0, len(distros)):
-    test_func = create_import_func(distros[i])
-    test_func.__name__ = 'test_debian_%02d_import_%s' % (i, distros[i]["name"])
-    test_func.__doc__ = "Import of %s" % distros[i]["desc"]
-    setattr(Test_Debian_Imports, test_func.__name__, test_func)
-    del test_func
Index: cobbler-3.0.0+git20190222.9e502a9d/tests/cli/imports/test_freebsd/freebsd_import_test.py
===================================================================
--- cobbler-3.0.0+git20190222.9e502a9d.orig/tests/cli/imports/test_freebsd/freebsd_import_test.py
+++ /dev/null
@@ -1,24 +0,0 @@
-from tests.cli.imports.import_base import CobblerImportTest
-from tests.cli.imports.import_base import create_import_func
-
-
-class Test_FreeBSD_Imports(CobblerImportTest):
-    """
-    Tests imports of various distros
-    """
-    pass
-
-
-distros = [
-    {"name": "freebsd8.2-x86_64", "desc": "FreeBSD 8.2 amd64", "path": "/vagrant/distros/freebsd8.2_amd64"},
-    {"name": "freebsd8.3-x86_64", "desc": "FreeBSD 8.3 amd64", "path": "/vagrant/distros/freebsd8.3_amd64"},
-    {"name": "freebsd9.0-i386", "desc": "FreeBSD 9.0 i386", "path": "/vagrant/distros/freebsd9.0_i386"},
-    {"name": "freebsd9.0-x86_64", "desc": "FreeBSD 9.0 amd64", "path": "/vagrant/distros/freebsd9.0_amd64"},
-]
-
-for i in range(0, len(distros)):
-    test_func = create_import_func(distros[i])
-    test_func.__name__ = 'test_freebsd_%02d_import_%s' % (i, distros[i]["name"])
-    test_func.__doc__ = "Import of %s" % distros[i]["desc"]
-    setattr(Test_FreeBSD_Imports, test_func.__name__, test_func)
-    del test_func
Index: cobbler-3.0.0+git20190222.9e502a9d/tests/cli/imports/test_redhat/redhat_import_test.py
===================================================================
--- cobbler-3.0.0+git20190222.9e502a9d.orig/tests/cli/imports/test_redhat/redhat_import_test.py
+++ /dev/null
@@ -1,27 +0,0 @@
-from tests.cli.imports.import_base import CobblerImportTest
-from tests.cli.imports.import_base import create_import_func
-
-
-class Test_RedHat_Imports(CobblerImportTest):
-    """
-    Tests imports of various distros
-    """
-    pass
-
-
-distros = [
-    {"name": "rhel58-x86_64", "desc": "RHEL 5.8 x86_64", "path": "/vagrant/distros/rhel58_x86_64"},
-    {"name": "rhel63-x86_64", "desc": "RHEL 6.3 x86_64", "path": "/vagrant/distros/rhel63_x86_64"},
-    {"name": "centos63-x86_64", "desc": "CentOS 6.3 x86_64", "path": "/vagrant/distros/centos63_x86_64"},
-    {"name": "sl62-x86_64", "desc": "Scientific Linux 6.2 x86_64", "path": "/vagrant/distros/sl62_x86_64"},
-    {"name": "f16-x86_64", "desc": "Fedora 16 x86_64", "path": "/vagrant/distros/f16_x86_64"},
-    {"name": "f17-x86_64", "desc": "Fedora 17 x86_64", "path": "/vagrant/distros/f17_x86_64"},
-    {"name": "f18-x86_64", "desc": "Fedora 18 x86_64", "path": "/vagrant/distros/f18_x86_64"},
-]
-
-for i in range(0, len(distros)):
-    test_func = create_import_func(distros[i])
-    test_func.__name__ = 'test_redhat_%02d_import_%s' % (i, distros[i]["name"])
-    test_func.__doc__ = "Import of %s" % distros[i]["desc"]
-    setattr(Test_RedHat_Imports, test_func.__name__, test_func)
-    del test_func
Index: cobbler-3.0.0+git20190222.9e502a9d/tests/cli/imports/test_suse/suse_import_test.py
===================================================================
--- cobbler-3.0.0+git20190222.9e502a9d.orig/tests/cli/imports/test_suse/suse_import_test.py
+++ /dev/null
@@ -1,35 +0,0 @@
-from tests.cli.imports.import_base import CobblerImportTest
-from tests.cli.imports.import_base import create_import_func
-
-
-class Test_Suse_Imports(CobblerImportTest):
-    """
-    Tests imports of various distros
-    """
-    pass
-
-
-distros = [
-    {"name": "opensuse11.3-i386", "desc": "OpenSuSE 11.3 i586", "path": "/vagrant/distros/opensuse11.3_i586"},
-    {"name": "opensuse11.4-x86_64", "desc": "OpenSuSE 11.4 x86_64", "path": "/vagrant/distros/opensuse11.4_x86_64"},
-    {"name": "opensuse12.1-x86_64", "desc": "OpenSuSE 12.1 x86_64", "path": "/vagrant/distros/opensuse12.1_x86_64"},
-    {"name": "opensuse12.2-i386", "desc": "OpenSuSE 12.2 i586", "path": "/vagrant/distros/opensuse12.2_i586"},
-    {"name": "opensuse12.2-x86_64", "desc": "OpenSuSE 12.2 x86_64", "path": "/vagrant/distros/opensuse12.2_x86_64"},
-    {"name": "opensuse12.3-i386", "desc": "OpenSuSE 12.3 i586", "path": "/vagrant/distros/opensuse12.3_i586"},
-    {"name": "opensuse12.3-x86_64", "desc": "OpenSuSE 12.3 x86_64", "path": "/vagrant/distros/opensuse12.3_x86_64"},
-    {"name": "opensuse13.1-i386", "desc": "OpenSuSE 13.1 i586", "path": "/vagrant/distros/opensuse13.1_i586"},
-    {"name": "opensuse13.1-x86_64", "desc": "OpenSuSE 13.1 x86_64", "path": "/vagrant/distros/opensuse13.1_x86_64"},
-    {"name": "sles11_sp2-i386", "desc": "SLES 11 SP2 i586", "path": "/vagrant/distros/sles11_sp2_i586"},
-    {"name": "sles11_sp2-x86_64", "desc": "SLES 11 SP2 x86_64", "path": "/vagrant/distros/sles11_sp2_x86_64"},
-    {"name": "sles11_sp2-ppc64", "desc": "SLES 11 SP2 ppc64", "path": "/vagrant/distros/sles11_sp2_ppc64"},
-    {"name": "sles11_sp3-i386", "desc": "SLES 11 SP3 i586", "path": "/vagrant/distros/sles11_sp3_i586"},
-    {"name": "sles11_sp3-x86_64", "desc": "SLES 11 SP3 x86_64", "path": "/vagrant/distros/sles11_sp3_x86_64"},
-    {"name": "sles11_sp3-ppc64", "desc": "SLES 11 SP3 ppc64", "path": "/vagrant/distros/sles11_sp3_ppc64"},
-]
-
-for i in range(0, len(distros)):
-    test_func = create_import_func(distros[i])
-    test_func.__name__ = 'test_suse_%02d_import_%s' % (i, distros[i]["name"])
-    test_func.__doc__ = "Import of %s" % distros[i]["desc"]
-    setattr(Test_Suse_Imports, test_func.__name__, test_func)
-    del test_func
Index: cobbler-3.0.0+git20190222.9e502a9d/tests/cli/imports/test_ubuntu/ubuntu_import_test.py
===================================================================
--- cobbler-3.0.0+git20190222.9e502a9d.orig/tests/cli/imports/test_ubuntu/ubuntu_import_test.py
+++ /dev/null
@@ -1,28 +0,0 @@
-from tests.cli.imports.import_base import CobblerImportTest
-from tests.cli.imports.import_base import create_import_func
-
-
-class Test_Ubuntu_Imports(CobblerImportTest):
-    """
-    Tests imports of various distros
-    """
-    pass
-
-
-distros = [
-    {"name": "ubuntu12.04-server-x86_64", "desc": "Ubuntu Precise (12.04) Server amd64",
-     "path": "/vagrant/distros/ubuntu_1204_server_amd64"},
-    {"name": "ubuntu12.04.1-server-i386", "desc": "Ubuntu Precise (12.04.1) Server i386",
-     "path": "/vagrant/distros/ubuntu_1204_1_server_i386"},
-    {"name": "ubuntu12.10-server-x86_64", "desc": "Ubuntu Quantal (12.10) Server amd64",
-     "path": "/vagrant/distros/ubuntu_1210_server_amd64"},
-    {"name": "ubuntu12.10-server-i386", "desc": "Ubuntu Quantal (12.10) Server i386",
-     "path": "/vagrant/distros/ubuntu_1210_server_i386"},
-]
-
-for i in range(0, len(distros)):
-    test_func = create_import_func(distros[i])
-    test_func.__name__ = 'test_ubuntu_%02d_import_%s' % (i, distros[i]["name"])
-    test_func.__doc__ = "Import of %s" % distros[i]["desc"]
-    setattr(Test_Ubuntu_Imports, test_func.__name__, test_func)
-    del test_func
Index: cobbler-3.0.0+git20190222.9e502a9d/tests/cli/imports/test_vmware/vmware_import_test.py
===================================================================
--- cobbler-3.0.0+git20190222.9e502a9d.orig/tests/cli/imports/test_vmware/vmware_import_test.py
+++ /dev/null
@@ -1,30 +0,0 @@
-from tests.cli.imports.import_base import CobblerImportTest
-from tests.cli.imports.import_base import create_import_func
-
-
-class Test_VMWare_Imports(CobblerImportTest):
-    """
-    Tests imports of various distros
-    """
-    pass
-
-
-distros = [
-    {"name": "vmware_esx_4.0_u1-x86_64", "desc": "VMware ESX 4.0 update1",
-     "path": "/vagrant/distros/vmware_esx_4.0_u1_208167_x86_64"},
-    {"name": "vmware_esx_4.0_u2-x86_64", "desc": "VMware ESX 4.0 update2",
-     "path": "/vagrant/distros/vmware_esx_4.0_u2_261974_x86_64"},
-    {"name": "vmware_esxi4.1-x86_64", "desc": "VMware ESXi 4.1",
-     "path": "/vagrant/distros/vmware_esxi4.1_348481_x86_64"},
-    {"name": "vmware_esxi5.0-x86_64", "desc": "VMware ESXi 5.0",
-     "path": "/vagrant/distros/vmware_esxi5.0_469512_x86_64"},
-    {"name": "vmware_esxi5.1-x86_64", "desc": "VMware ESXi 5.1",
-     "path": "/vagrant/distros/vmware_esxi5.1_799733_x86_64"},
-]
-
-for i in range(0, len(distros)):
-    test_func = create_import_func(distros[i])
-    test_func.__name__ = 'test_vmware_%02d_import_%s' % (i, distros[i]["name"])
-    test_func.__doc__ = "Import of %s" % distros[i]["desc"]
-    setattr(Test_VMWare_Imports, test_func.__name__, test_func)
-    del test_func
Index: cobbler-3.0.0+git20190222.9e502a9d/tests/cli/imports/ubuntu_import_test.py
===================================================================
--- /dev/null
+++ cobbler-3.0.0+git20190222.9e502a9d/tests/cli/imports/ubuntu_import_test.py
@@ -0,0 +1,29 @@
+import pytest
+
+
+class Test_Ubuntu_Imports():
+    """
+    Tests imports of various distros
+    """
+    distros = [
+        {"name": "ubuntu12.04-server-x86_64", "desc": "Ubuntu Precise (12.04) Server amd64",
+         "path": "/vagrant/distros/ubuntu_1204_server_amd64"},
+        {"name": "ubuntu12.04.1-server-i386", "desc": "Ubuntu Precise (12.04.1) Server i386",
+         "path": "/vagrant/distros/ubuntu_1204_1_server_i386"},
+        {"name": "ubuntu12.10-server-x86_64", "desc": "Ubuntu Quantal (12.10) Server amd64",
+         "path": "/vagrant/distros/ubuntu_1210_server_amd64"},
+        {"name": "ubuntu12.10-server-i386", "desc": "Ubuntu Quantal (12.10) Server i386",
+         "path": "/vagrant/distros/ubuntu_1210_server_i386"},
+    ]
+
+    @pytest.mark.skip(reason="Not fixed!")
+    @pytest.mark.parametrize("name, desc, path", distros)
+    def test_ubuntu_import(self, name, desc, path, import_distro, report_distro, report_profile, remove_distro):
+        (data, rc) = import_distro(name, path)
+        assert rc == 0
+        (data, rc) = remove_distro(name)
+        assert rc == 0
+        (data, rc) = report_profile(name)
+        assert rc == 0
+        (data, rc) = remove_distro(name)
+        assert rc == 0
Index: cobbler-3.0.0+git20190222.9e502a9d/tests/cli/imports/vmware_import_test.py
===================================================================
--- /dev/null
+++ cobbler-3.0.0+git20190222.9e502a9d/tests/cli/imports/vmware_import_test.py
@@ -0,0 +1,32 @@
+import pytest
+
+
+class Test_VMWare_Imports:
+    """
+    Tests imports of various distros
+    """
+
+    distros = [
+        {"name": "vmware_esx_4.0_u1-x86_64", "desc": "VMware ESX 4.0 update1",
+         "path": "/vagrant/distros/vmware_esx_4.0_u1_208167_x86_64"},
+        {"name": "vmware_esx_4.0_u2-x86_64", "desc": "VMware ESX 4.0 update2",
+         "path": "/vagrant/distros/vmware_esx_4.0_u2_261974_x86_64"},
+        {"name": "vmware_esxi4.1-x86_64", "desc": "VMware ESXi 4.1",
+         "path": "/vagrant/distros/vmware_esxi4.1_348481_x86_64"},
+        {"name": "vmware_esxi5.0-x86_64", "desc": "VMware ESXi 5.0",
+         "path": "/vagrant/distros/vmware_esxi5.0_469512_x86_64"},
+        {"name": "vmware_esxi5.1-x86_64", "desc": "VMware ESXi 5.1",
+         "path": "/vagrant/distros/vmware_esxi5.1_799733_x86_64"},
+    ]
+
+    @pytest.mark.skip(reason="Not fixed!")
+    @pytest.mark.parametrize("name, desc, path", distros)
+    def test_vmware_import(self, name, desc, path, import_distro, report_distro, report_profile, remove_distro):
+        (data, rc) = import_distro(name, path)
+        assert rc == 0
+        (data, rc) = remove_distro(name)
+        assert rc == 0
+        (data, rc) = report_profile(name)
+        assert rc == 0
+        (data, rc) = remove_distro(name)
+        assert rc == 0
Index: cobbler-3.0.0+git20190222.9e502a9d/tests/conftest.py
===================================================================
--- /dev/null
+++ cobbler-3.0.0+git20190222.9e502a9d/tests/conftest.py
@@ -0,0 +1,58 @@
+import logging
+import sys
+import xmlrpc.client as xmlrpcclient
+
+import pytest
+
+from cobbler.utils import local_get_cobbler_api_url, get_shared_secret
+
+# "import xmlrpc.client" does currently not work. No explanation found anywhere.
+
+
+def pytest_addoption(parser):
+    parser.addoption("-E", action="store", metavar="NAME", help="only run tests matching the environment NAME.")
+
+
+def pytest_configure(config):
+    # register an additional marker
+    config.addinivalue_line("markers", "env(name): mark test to run only on named environment")
+
+
+@pytest.fixture(scope="session")
+def remote(cobbler_xmlrpc_base):
+    """
+
+    :param cobbler_xmlrpc_base:
+    :return:
+    """
+    return cobbler_xmlrpc_base[0]
+
+
+@pytest.fixture(scope="session")
+def token(cobbler_xmlrpc_base):
+    """
+
+    :param cobbler_xmlrpc_base:
+    :return:
+    """
+    return cobbler_xmlrpc_base[1]
+
+
+@pytest.fixture(scope="session")
+def cobbler_xmlrpc_base():
+    """
+    Initialises the api object and makes it available to the test.
+    """
+    # create logger
+    logging.basicConfig(stream=sys.stderr)
+    logger = logging.getLogger("xobbler_xmlrpc_base")
+    logger.setLevel(logging.DEBUG)
+
+    # create XML-RPC client and connect to server
+    api_url = local_get_cobbler_api_url()
+    remote = xmlrpcclient.Server(api_url, allow_none=True)
+    shared_secret = get_shared_secret()
+    token = remote.login("", shared_secret)
+    if not token:
+        sys.exit(1)
+    yield (remote, token)
Index: cobbler-3.0.0+git20190222.9e502a9d/tests/misc/create_kvm_guest.py
===================================================================
--- cobbler-3.0.0+git20190222.9e502a9d.orig/tests/misc/create_kvm_guest.py
+++ cobbler-3.0.0+git20190222.9e502a9d/tests/misc/create_kvm_guest.py
@@ -99,7 +99,7 @@ def create_kvm_guest(guest_name, num_vir
     @param str os_tree_location path/URL of Linux OS tree
             This parameter and os_iso_path are mutually exclusive.
     @param str autoinstall_file_location path/URL of automatic installation file
-            (autoyast / kickstart / preseed). This parameter and os_tree_location
+            (autoyast / autoinstall / preseed). This parameter and os_tree_location
              must be used together
     @param str kernel_args extra kernel command line arguments
     @raise Exception if unable to create the KVM guest
Index: cobbler-3.0.0+git20190222.9e502a9d/tests/setup-test-docker.sh
===================================================================
--- cobbler-3.0.0+git20190222.9e502a9d.orig/tests/setup-test-docker.sh
+++ cobbler-3.0.0+git20190222.9e502a9d/tests/setup-test-docker.sh
@@ -1,4 +1,4 @@
-#!/usr/bin/bash
+#!/bin/bash
 
 # SystemD stuff (needs insserv additionally)
 zypper -n install systemd insserv; zypper clean
Index: cobbler-3.0.0+git20190222.9e502a9d/tests/xmlrpcapi/background_test.py
===================================================================
--- cobbler-3.0.0+git20190222.9e502a9d.orig/tests/xmlrpcapi/background_test.py
+++ cobbler-3.0.0+git20190222.9e502a9d/tests/xmlrpcapi/background_test.py
@@ -1,44 +1,48 @@
-import unittest
-from .cobbler_xmlrpc_base_test import CobblerXmlRpcBaseTest
+import pytest
 
 
-class TestBackground(CobblerXmlRpcBaseTest):
+@pytest.mark.usefixtures("cobbler_xmlrpc_base")
+class TestBackground:
     """
     Class to test various background jobs
     """
 
+    @pytest.mark.skip(reason="Not Implemented!")
     def test_background_acletup(self):
         # TODO: test remote.background_aclsetup()
         raise NotImplementedError()
 
+    @pytest.mark.skip(reason="Not Implemented!")
     def test_background_buildiso(self):
         # TODO: test remote.background_buildiso()
         raise NotImplementedError()
 
+    @pytest.mark.skip(reason="Not Implemented!")
     def test_background_dlccontent(self):
         # TODO: test remote.background_dlcontent()
         raise NotImplementedError()
 
+    @pytest.mark.skip(reason="Not Implemented!")
     def test_background_hardlink(self):
         # TODO: test remote.background_hardlink()
         raise NotImplementedError()
 
+    @pytest.mark.skip(reason="Not Implemented!")
     def test_background_import(self):
         # TODO: test remote.background_import()
         raise NotImplementedError()
 
+    @pytest.mark.skip(reason="Not Implemented!")
     def test_background_replicate(self):
         # TODO: test remote.background_replicate()
         raise NotImplementedError()
 
+    @pytest.mark.skip(reason="Not Implemented!")
     def test_background_reposync(self):
         # TODO: test remote.background_reposync()
         raise NotImplementedError()
 
+    @pytest.mark.skip(reason="Not Implemented!")
     def test_background_validate_autoinstall_files(self):
         # TODO: test remote.background_validate_autoinstall_files()
         raise NotImplementedError()
-
-
-if __name__ == '__main__':
-    unittest.main()
Index: cobbler-3.0.0+git20190222.9e502a9d/tests/xmlrpcapi/cobbler_xmlrpc_base_test.py
===================================================================
--- cobbler-3.0.0+git20190222.9e502a9d.orig/tests/xmlrpcapi/cobbler_xmlrpc_base_test.py
+++ /dev/null
@@ -1,38 +0,0 @@
-import unittest
-import logging
-import sys
-import xmlrpc.client as xmlrpcclient
-from cobbler.utils import local_get_cobbler_api_url, get_shared_secret
-
-# "import xmlrpc.client" does currently not work. No explanation found anywhere.
-
-
-class CobblerXmlRpcBaseTest(unittest.TestCase):
-
-    def setUp(self):
-        """
-        Setup Cobbler XML-RPC connection and login
-        """
-
-        # create logger
-        logging.basicConfig(stream=sys.stderr)
-        self.logger = logging.getLogger(self.__class__.__name__)
-        self.logger.setLevel(logging.DEBUG)
-
-        # create XML-RPC client and connect to server
-        api_url = local_get_cobbler_api_url()
-        self.remote = xmlrpcclient.Server(api_url, allow_none=True)
-        shared_secret = get_shared_secret()
-        self.token = self.remote.login("", shared_secret)
-        if not self.token:
-            sys.exit(1)
-
-    def tearDown(self):
-        """
-        Cleanup here
-        """
-        return
-
-
-if __name__ == '__main__':
-    unittest.main()
Index: cobbler-3.0.0+git20190222.9e502a9d/tests/xmlrpcapi/distro_profile_system_test.py
===================================================================
--- cobbler-3.0.0+git20190222.9e502a9d.orig/tests/xmlrpcapi/distro_profile_system_test.py
+++ cobbler-3.0.0+git20190222.9e502a9d/tests/xmlrpcapi/distro_profile_system_test.py
@@ -1,6 +1,6 @@
-import pytest
 import os
-from .cobbler_xmlrpc_base_test import CobblerXmlRpcBaseTest
+
+import pytest
 
 FAKE_INITRD = "initrd1.img"
 FAKE_INITRD2 = "initrd2.img"
@@ -13,211 +13,415 @@ TEST_SYSTEM = ""
 cleanup_dirs = []
 
 
-"""
-Order is currently important:
-self._get_distros()
-self._create_distro()
-self._get_distro()
-self._find_distro()
-self._copy_distro()
-self._rename_distro()
-
-self._get_profiles()
-self._create_profile()
-self._create_subprofile()
-self._get_profile()
-self._find_profile()
-self._copy_profile()
-self._rename_profile()
-self._get_repo_config_for_profile()
-
-self._get_systems()
-self._create_system()
-self._get_system()
-self._find_system()
-self._copy_system()
-self._rename_system()
-self._get_repo_config_for_system()
-
-self._remove_system()
-self._remove_profile()
-self._remove_distro()
-"""
+@pytest.fixture(scope="class")
+def distro_fields(fk_initrd, fk_kernel):
+    """
+
+    :param fk_initrd:
+    :param fk_kernel:
+    :return:
+    """
+    return [
+        # field format: field_name, good value(s), bad value(s)
+        # field order is the order in which they will be set
+        # TODO: include fields with dependencies: fetchable files, boot files, etc.
+        ["arch", ["i386", "x86_64", "ppc", "ppc64"], ["badarch"]],
+        # generic must be last breed to be set so os_version test below will work
+        ["breed", ["debian", "freebsd", "redhat", "suse", "ubuntu", "unix", "vmware", "windows", "xen", "generic"],
+         ["badbreed"]],
+        ["comment", ["test comment", ], []],
+        ["initrd", [fk_initrd, ], ["", ]],
+        ["name", ["testdistro0"], []],
+        ["kernel", [fk_kernel, ], ["", ]],
+        ["kernel_options", ["a=1 b=2 c=3 c=4 c=5 d e", ], []],
+        ["kernel_options_post", ["a=1 b=2 c=3 c=4 c=5 d e", ], []],
+        ["autoinstall_meta", ["a=1 b=2 c=3 c=4 c=5 d e", ], []],
+        ["mgmt_classes", ["one two three", ], []],
+        ["os_version", ["generic26", ], ["bados", ]],
+        ["owners", ["user1 user2 user3", ], []],
+    ]
 
 
-class TestDistroProfileSystem(CobblerXmlRpcBaseTest):
+@pytest.fixture(scope="class")
+def profile_fields(redhat_autoinstall, suse_autoyast, ubuntu_preseed):
     """
-    Test remote calls related to distros, profiles and systems
-    These item types are tested together because they have inter-dependencies
+
+    :param redhat_autoinstall:
+    :param suse_autoyast:
+    :param ubuntu_preseed:
+    :return:
     """
+    return [
+        # field format: field_name, good value(s), bad value(s)
+        # TODO: include fields with dependencies: fetchable files, boot files,
+        #         template files, repos
+        ["comment", ["test comment"], []],
+        ["dhcp_tag", ["", "foo"], []],
+        ["distro", ["testdistro0"], ["baddistro", ]],
+        ["enable_gpxe", ["yes", "YES", "1", "0", "no"], []],
+        ["enable_menu", ["yes", "YES", "1", "0", "no"], []],
+        ["kernel_options", ["a=1 b=2 c=3 c=4 c=5 d e"], []],
+        ["kernel_options_post", ["a=1 b=2 c=3 c=4 c=5 d e"], []],
+        ["autoinstall", [redhat_autoinstall, suse_autoyast, ubuntu_preseed],
+         ["/path/to/bad/autoinstall", ]],
+        ["autoinstall_meta", ["a=1 b=2 c=3 c=4 c=5 d e", ], []],
+        ["mgmt_classes", ["one two three", ], []],
+        ["mgmt_parameters", ["<<inherit>>"], ["badyaml"]],  # needs more test cases that are valid yaml
+        ["name", ["testprofile0"], []],
+        ["name_servers", ["1.1.1.1 1.1.1.2 1.1.1.3"], []],
+        ["name_servers_search", ["example.com foo.bar.com"], []],
+        ["owners", ["user1 user2 user3"], []],
+        ["proxy", ["testproxy"], []],
+        ["server", ["1.1.1.1"], []],
+        ["virt_auto_boot", ["1", "0"], ["yes", "no"]],
+        ["virt_bridge", ["<<inherit>>", "br0", "virbr0", "xenbr0"], []],
+        ["virt_cpus", ["<<inherit>>", "1", "2"], ["a"]],
+        ["virt_disk_driver", ["<<inherit>>", "raw", "qcow2", "vmdk"], []],
+        ["virt_file_size", ["<<inherit>>", "5", "10"], ["a"]],
+        ["virt_path", ["<<inherit>>", "/path/to/test", ], []],
+        ["virt_ram", ["<<inherit>>", "256", "1024"], ["a", ]],
+        ["virt_type", ["<<inherit>>", "xenpv", "xenfv", "qemu", "kvm", "vmware", "openvz"], ["bad", ]],
+    ]
 
-    @pytest.fixture
-    def removeTestdistro(self):
-        yield
-        if not self.remote.get_distro("testdistro0") == "~":
-            self.remote.remove_distro("testdistro0", self.token)
-
-    def setUp(self):
-
-        super(TestDistroProfileSystem, self).setUp()
-
-        # Create temp dir
-        self.topdir = "/dev/shm/cobbler_test"
-        try:
-            os.makedirs(self.topdir)
-        except:
-            pass
-
-        # create temp files
-        self.fk_initrd = os.path.join(self.topdir, FAKE_INITRD)
-        self.fk_initrd2 = os.path.join(self.topdir, FAKE_INITRD2)
-        self.fk_initrd3 = os.path.join(self.topdir, FAKE_INITRD3)
-        self.fk_kernel = os.path.join(self.topdir, FAKE_KERNEL)
-        self.fk_kernel2 = os.path.join(self.topdir, FAKE_KERNEL2)
-        self.fk_kernel3 = os.path.join(self.topdir, FAKE_KERNEL3)
-        self.redhat_kickstart = os.path.join(self.topdir, "test.ks")
-        self.suse_autoyast = os.path.join(self.topdir, "test.xml")
-        self.ubuntu_preseed = os.path.join(self.topdir, "test.seed")
-        self.files_create = [
-            self.fk_initrd, self.fk_initrd2, self.fk_initrd3,
-            self.fk_kernel, self.fk_kernel2, self.fk_kernel3,
-            self.redhat_kickstart, self.suse_autoyast, self.ubuntu_preseed
-        ]
-        for fn in self.files_create:
-            f = open(fn, "w+")
-            f.close()
-
-        self.distro_fields = [
-            # field format: field_name, good value(s), bad value(s)
-            # field order is the order in which they will be set
-            # TODO: include fields with dependencies: fetchable files, boot files, etc.
-            ["arch", ["i386", "x86_64", "ppc", "ppc64"], ["badarch"]],
-            # generic must be last breed to be set so os_version test below will work
-            ["breed", ["debian", "freebsd", "redhat", "suse", "ubuntu", "unix", "vmware", "windows", "xen", "generic"],
-             ["badbreed"]],
-            ["comment", ["test comment", ], []],
-            ["initrd", [self.fk_initrd, ], ["", ]],
-            ["name", ["testdistro0"], []],
-            ["kernel", [self.fk_kernel, ], ["", ]],
-            ["kernel_options", ["a=1 b=2 c=3 c=4 c=5 d e", ], []],
-            ["kernel_options_post", ["a=1 b=2 c=3 c=4 c=5 d e", ], []],
-            ["autoinstall_meta", ["a=1 b=2 c=3 c=4 c=5 d e", ], []],
-            ["mgmt_classes", ["one two three", ], []],
-            ["os_version", ["generic26", ], ["bados", ]],
-            ["owners", ["user1 user2 user3", ], []],
-        ]
-
-        self.profile_fields = [
-            # field format: field_name, good value(s), bad value(s)
-            # TODO: include fields with dependencies: fetchable files, boot files,
-            #         template files, repos
-            ["comment", ["test comment"], []],
-            ["dhcp_tag", ["", "foo"], []],
-            ["distro", ["testdistro0"], ["baddistro", ]],
-            ["enable_gpxe", ["yes", "YES", "1", "0", "no"], []],
-            ["enable_menu", ["yes", "YES", "1", "0", "no"], []],
-            ["kernel_options", ["a=1 b=2 c=3 c=4 c=5 d e"], []],
-            ["kernel_options_post", ["a=1 b=2 c=3 c=4 c=5 d e"], []],
-            ["kickstart", [self.redhat_kickstart, self.suse_autoyast, self.ubuntu_preseed],
-             ["/path/to/bad/kickstart", ]],
-            ["autoinstall_meta", ["a=1 b=2 c=3 c=4 c=5 d e", ], []],
-            ["mgmt_classes", ["one two three", ], []],
-            ["mgmt_parameters", ["<<inherit>>"], ["badyaml"]],  # needs more test cases that are valid yaml
-            ["name", ["testprofile0"], []],
-            ["name_servers", ["1.1.1.1 1.1.1.2 1.1.1.3"], []],
-            ["name_servers_search", ["example.com foo.bar.com"], []],
-            ["owners", ["user1 user2 user3"], []],
-            ["proxy", ["testproxy"], []],
-            ["server", ["1.1.1.1"], []],
-            ["virt_auto_boot", ["1", "0"], ["yes", "no"]],
-            ["virt_bridge", ["<<inherit>>", "br0", "virbr0", "xenbr0"], []],
-            ["virt_cpus", ["<<inherit>>", "1", "2"], ["a"]],
-            ["virt_disk_driver", ["<<inherit>>", "raw", "qcow2", "vmdk"], []],
-            ["virt_file_size", ["<<inherit>>", "5", "10"], ["a"]],
-            ["virt_path", ["<<inherit>>", "/path/to/test", ], []],
-            ["virt_ram", ["<<inherit>>", "256", "1024"], ["a", ]],
-            ["virt_type", ["<<inherit>>", "xenpv", "xenfv", "qemu", "kvm", "vmware", "openvz"], ["bad", ]],
-        ]
-
-        self.system_fields = [
-            # field format: field_name, good value(s), bad value(s)
-            # TODO: include fields with dependencies: fetchable files, boot files,
-            #         template files, images
-            ["comment", ["test comment"], []],
-            ["enable_gpxe", ["yes", "YES", "1", "0", "no"], []],
-            ["kernel_options", ["a=1 b=2 c=3 c=4 c=5 d e"], []],
-            ["kernel_options_post", ["a=1 b=2 c=3 c=4 c=5 d e"], []],
-            ["kickstart", [self.redhat_kickstart, self.suse_autoyast, self.ubuntu_preseed],
-             ["/path/to/bad/kickstart", ]],
-            ["autoinstall_meta", ["a=1 b=2 c=3 c=4 c=5 d e", ], []],
-            ["mgmt_classes", ["one two three", ], []],
-            ["mgmt_parameters", ["<<inherit>>"], ["badyaml"]],  # needs more test cases that are valid yaml
-            ["name", ["testsystem0"], []],
-            ["netboot_enabled", ["yes", "YES", "1", "0", "no"], []],
-            ["owners", ["user1 user2 user3"], []],
-            ["profile", ["testprofile0"], ["badprofile", ]],
-            ["repos_enabled", [], []],
-            ["status", ["development", "testing", "acceptance", "production"], []],
-            ["proxy", ["testproxy"], []],
-            ["server", ["1.1.1.1"], []],
-            ["virt_auto_boot", ["1", "0"], ["yes", "no"]],
-            ["virt_cpus", ["<<inherit>>", "1", "2"], ["a"]],
-            ["virt_file_size", ["<<inherit>>", "5", "10"], ["a"]],
-            ["virt_disk_driver", ["<<inherit>>", "raw", "qcow2", "vmdk"], []],
-            ["virt_ram", ["<<inherit>>", "256", "1024"], ["a", ]],
-            ["virt_type", ["<<inherit>>", "xenpv", "xenfv", "qemu", "kvm", "vmware", "openvz"], ["bad", ]],
-            ["virt_path", ["<<inherit>>", "/path/to/test", ], []],
-            ["virt_pxe_boot", ["1", "0"], []],
-
-            # network
-            ["gateway", [], []],
-            ["hostname", ["test"], []],
-            ["ipv6_autoconfiguration", [], []],
-            ["ipv6_default_device", [], []],
-            ["name_servers", ["9.1.1.3"], []],
-            ["name_servers_search", [], []],
-
-            # network - network interface specific
-            # TODO: test these fields
-            ["bonding_opts-eth0", [], []],
-            ["bridge_opts-eth0", [], []],
-            ["cnames-eth0", [], []],
-            ["dhcp_tag-eth0", [], []],
-            ["dns_name-eth0", [], []],
-            ["if_gateway-eth0", [], []],
-            ["interface_type-eth0", [], []],
-            ["interface_master-eth0", [], []],
-            ["ip_address-eth0", [], []],
-            ["ipv6_address-eth0", [], []],
-            ["ipv6_secondaries-eth0", [], []],
-            ["ipv6_mtu-eth0", [], []],
-            ["ipv6_static_routes-eth0", [], []],
-            ["ipv6_default_gateway-eth0", [], []],
-            ["mac_address-eth0", [], []],
-            ["mtu-eth0", [], []],
-            ["management-eth0", [], []],
-            ["netmask-eth0", [], []],
-            ["static-eth0", [], []],
-            ["static_routes-eth0", [], []],
-            ["virt_bridge-eth0", [], []],
-
-            # power management
-            ["power_type", ["lpar"], ["bla"]],
-            ["power_address", ["127.0.0.1"], []],
-            ["power_id", ["pmachine:lpar1"], []],
-            ["power_pass", ["pass"], []],
-            ["power_user", ["user"], []]
-
-        ]
 
-    def tearDown(self):
+@pytest.fixture(scope="class")
+def system_fields(redhat_autoinstall, suse_autoyast, ubuntu_preseed):
+    """
 
-        super(TestDistroProfileSystem, self).tearDown()
+    :param redhat_autoinstall:
+    :param suse_autoyast:
+    :param ubuntu_preseed:
+    :return:
+    """
+    return [
+        # field format: field_name, good value(s), bad value(s)
+        # TODO: include fields with dependencies: fetchable files, boot files,
+        #         template files, images
+        ["comment", ["test comment"], []],
+        ["enable_gpxe", ["yes", "YES", "1", "0", "no"], []],
+        ["kernel_options", ["a=1 b=2 c=3 c=4 c=5 d e"], []],
+        ["kernel_options_post", ["a=1 b=2 c=3 c=4 c=5 d e"], []],
+        ["autoinstall", [redhat_autoinstall, suse_autoyast, ubuntu_preseed],
+         ["/path/to/bad/autoinstall", ]],
+        ["autoinstall_meta", ["a=1 b=2 c=3 c=4 c=5 d e", ], []],
+        ["mgmt_classes", ["one two three", ], []],
+        ["mgmt_parameters", ["<<inherit>>"], ["badyaml"]],  # needs more test cases that are valid yaml
+        ["name", ["testsystem0"], []],
+        ["netboot_enabled", ["yes", "YES", "1", "0", "no"], []],
+        ["owners", ["user1 user2 user3"], []],
+        ["profile", ["testprofile0"], ["badprofile", ]],
+        ["repos_enabled", [], []],
+        ["status", ["development", "testing", "acceptance", "production"], []],
+        ["proxy", ["testproxy"], []],
+        ["server", ["1.1.1.1"], []],
+        ["virt_auto_boot", ["1", "0"], ["yes", "no"]],
+        ["virt_cpus", ["<<inherit>>", "1", "2"], ["a"]],
+        ["virt_file_size", ["<<inherit>>", "5", "10"], ["a"]],
+        ["virt_disk_driver", ["<<inherit>>", "raw", "qcow2", "vmdk"], []],
+        ["virt_ram", ["<<inherit>>", "256", "1024"], ["a", ]],
+        ["virt_type", ["<<inherit>>", "xenpv", "xenfv", "qemu", "kvm", "vmware", "openvz"], ["bad", ]],
+        ["virt_path", ["<<inherit>>", "/path/to/test", ], []],
+        ["virt_pxe_boot", ["1", "0"], []],
+
+        # network
+        ["gateway", [], []],
+        ["hostname", ["test"], []],
+        ["ipv6_autoconfiguration", [], []],
+        ["ipv6_default_device", [], []],
+        ["name_servers", ["9.1.1.3"], []],
+        ["name_servers_search", [], []],
+
+        # network - network interface specific
+        # TODO: test these fields
+        ["bonding_opts-eth0", [], []],
+        ["bridge_opts-eth0", [], []],
+        ["cnames-eth0", [], []],
+        ["dhcp_tag-eth0", [], []],
+        ["dns_name-eth0", [], []],
+        ["if_gateway-eth0", [], []],
+        ["interface_type-eth0", [], []],
+        ["interface_master-eth0", [], []],
+        ["ip_address-eth0", [], []],
+        ["ipv6_address-eth0", [], []],
+        ["ipv6_secondaries-eth0", [], []],
+        ["ipv6_mtu-eth0", [], []],
+        ["ipv6_static_routes-eth0", [], []],
+        ["ipv6_default_gateway-eth0", [], []],
+        ["mac_address-eth0", [], []],
+        ["mtu-eth0", [], []],
+        ["management-eth0", [], []],
+        ["netmask-eth0", [], []],
+        ["static-eth0", [], []],
+        ["static_routes-eth0", [], []],
+        ["virt_bridge-eth0", [], []],
+
+        # power management
+        ["power_type", ["lpar"], ["bla"]],
+        ["power_address", ["127.0.0.1"], []],
+        ["power_id", ["pmachine:lpar1"], []],
+        ["power_pass", ["pass"], []],
+        ["power_user", ["user"], []]
+    ]
 
-        for fn in self.files_create:
-            os.remove(fn)
 
-    def test_get_distros(self):
+@pytest.fixture(scope="class")
+def topdir():
+    """
+    The path to the directory of the fake test files.
+    """
+    return "/dev/shm/cobbler_test"
+
+
+@pytest.fixture(scope="class")
+def create_tempdir(topdir):
+    """
+    Creates the top-directory for the tests.
+    :param topdir: See the corresponding fixture.
+    """
+    # Create temp dir
+    try:
+        os.makedirs(topdir)
+    except OSError:
+        pass
+
+
+@pytest.fixture(scope="class")
+def fk_initrd(topdir):
+    """
+    The path to the first fake initrd.
+    :param topdir: See the corresponding fixture.
+    :return: A path as a string.
+    """
+    return os.path.join(topdir, FAKE_INITRD)
+
+
+@pytest.fixture(scope="class")
+def fk_initrd2(topdir):
+    """
+    The path to the second fake initrd.
+    :param topdir: See the corresponding fixture.
+    :return: A path as a string.
+    """
+    return os.path.join(topdir, FAKE_INITRD2)
+
+
+@pytest.fixture(scope="class")
+def fk_initrd3(topdir):
+    """
+    The path to the third fake initrd.
+    :param topdir: See the corresponding fixture.
+    :return: A path as a string.
+    """
+    return os.path.join(topdir, FAKE_INITRD3)
+
+
+@pytest.fixture(scope="class")
+def fk_kernel(topdir):
+    """
+    The path to the first fake kernel.
+    :param topdir: See the corresponding fixture.
+    :return: A path as a string.
+    """
+    return os.path.join(topdir, FAKE_KERNEL)
+
+
+@pytest.fixture(scope="class")
+def fk_kernel2(topdir):
+    """
+    The path to the second fake kernel.
+    :param topdir: See the corresponding fixture.
+    :return: A path as a string.
+    """
+    return os.path.join(topdir, FAKE_KERNEL2)
+
+
+@pytest.fixture(scope="class")
+def fk_kernel3(topdir):
+    """
+    The path to the third fake kernel.
+    :param topdir: See the corresponding fixture.
+    :return: A path as a string.
+    """
+    return os.path.join(topdir, FAKE_KERNEL3)
+
+
+@pytest.fixture(scope="class")
+def redhat_autoinstall():
+    """
+    The path to the test.ks file for redhat autoinstall.
+    :return: A path as a string.
+    """
+    return os.path.join("", "test.ks")
+
+
+@pytest.fixture(scope="class")
+def suse_autoyast():
+    """
+    The path to the suse autoyast xml-file.
+    :return: A path as a string.
+    """
+    return os.path.join("", "test.xml")
+
+
+@pytest.fixture(scope="class")
+def ubuntu_preseed():
+    """
+    The path to the ubuntu preseed file.
+    :return: A path as a string.
+    """
+    return os.path.join("", "test.seed")
+
+
+@pytest.fixture(scope="class")
+def fake_files(fk_initrd, fk_initrd2, fk_initrd3, fk_kernel, fk_kernel2, fk_kernel3, redhat_autoinstall, suse_autoyast,
+               ubuntu_preseed):
+    """
+    This fixture has an array of all the paths to the generated fake files.
+    :param fk_initrd: See the corresponding fixture.
+    :param fk_initrd2: See the corresponding fixture.
+    :param fk_initrd3: See the corresponding fixture.
+    :param fk_kernel: See the corresponding fixture.
+    :param fk_kernel2: See the corresponding fixture.
+    :param fk_kernel3: See the corresponding fixture.
+    :param redhat_autoinstall: See the corresponding fixture.
+    :param suse_autoyast: See the corresponding fixture.
+    :param ubuntu_preseed: See the corresponding fixture.
+    :return: An array which contains all paths to the corresponding fake files.
+    """
+    return [fk_initrd, fk_initrd2, fk_initrd3, fk_kernel, fk_kernel2, fk_kernel3, redhat_autoinstall,
+            suse_autoyast, ubuntu_preseed]
+
+
+@pytest.fixture(scope="class")
+def files_create(create_tempdir, fake_files, redhat_autoinstall, suse_autoyast, ubuntu_preseed):
+    """
+    This creates all the fake files which need to be present for the tests.
+    :param ubuntu_preseed: See the corresponding fixture.
+    :param suse_autoyast: See the corresponding fixture.
+    :param redhat_autoinstall: See the corresponding fixture.
+    :param create_tempdir: See the corresponding fixture.
+    :param fake_files: See the corresponding fixture.
+    """
+    base = "/var/lib/cobbler/templates/"
+    f = open(base + redhat_autoinstall, "w+")
+    f.close()
+    f = open(base + suse_autoyast, "w+")
+    f.close()
+    f = open(base + ubuntu_preseed, "w+")
+    f.close()
+
+    for fn in fake_files:
+        f = open(fn, "w+")
+        f.close()
+
+
+@pytest.fixture(scope="class")
+def remove_fakefiles(files_create, fake_files, redhat_autoinstall, suse_autoyast, ubuntu_preseed):
+    """
+    This represents the init and teardown of the TestDistroProfileSystem class.
+    :param ubuntu_preseed: See the corresponding fixture.
+    :param suse_autoyast: See the corresponding fixture.
+    :param redhat_autoinstall: See the corresponding fixture.
+    :param files_create: See the corresponding fixture.
+    :param fake_files: See the corresponding fixture.
+    """
+    yield
+
+    base = "/var/lib/cobbler/templates/"
+    os.remove(base + redhat_autoinstall)
+    os.remove(base + suse_autoyast)
+    os.remove(base + ubuntu_preseed)
+    for fn in fake_files:
+        os.remove(fn)
+
+
+@pytest.fixture()
+def create_profile(remote, token):
+    """
+    Create a profile with the name "testprofile0"
+    :param remote: See the corresponding fixture.
+    :param token: See the corresponding fixture.
+    """
+    profile = remote.new_profile(token)
+    remote.modify_profile(profile, "name", "testprofile0", token)
+    remote.modify_profile(profile, "distro", "testdistro0", token)
+    remote.modify_profile(profile, "kernel_options", "a=1 b=2 c=3 c=4 c=5 d e", token)
+    remote.save_profile(profile, token)
+
+
+@pytest.fixture()
+def remove_testprofile(remote, token):
+    """
+    Removes the profile with the name "testprofile0".
+    :param remote: See the corresponding fixture.
+    :param token: See the corresponding fixture.
+    """
+    yield
+    remote.remove_profile("testprofile0", token)
+
+
+@pytest.fixture()
+def remove_testdistro(remote, token):
+    """
+    Removes the distro "testdistro0" from the running cobbler after the test.
+    :param remote: See the corresponding fixture.
+    :param token: See the corresponding fixture.
+    """
+    yield
+    remote.remove_distro("testdistro0", token, False)
+
+
+@pytest.fixture()
+def create_testdistro(remote, token, fk_kernel, fk_initrd):
+    """
+    Creates a distro "testdistro0" with the architecture "x86_64", breed "suse" and the fixtures which are setting the
+    fake kernel and initrd.
+    :param remote: See the corresponding fixture.
+    :param token: See the corresponding fixture.
+    :param fk_kernel: See the corresponding fixture.
+    :param fk_initrd: See the corresponding fixture.
+    """
+    distro = remote.new_distro(token)
+    remote.modify_distro(distro, "name", "testdistro0", token)
+    remote.modify_distro(distro, "arch", "x86_64", token)
+    remote.modify_distro(distro, "breed", "suse", token)
+    remote.modify_distro(distro, "kernel", fk_kernel, token)
+    remote.modify_distro(distro, "initrd", fk_initrd, token)
+    remote.save_distro(distro, token)
+
+
+@pytest.fixture()
+def create_testsystem(remote, token):
+    """
+    Add a system with the name "testsystem0", the system is assigend to the profile "testprofile0".
+    :param remote: See the corresponding fixture.
+    :param token: See the corresponding fixture.
+    """
+    system = remote.new_system(token)
+    remote.modify_system(system, "name", "testsystem0", token)
+    remote.modify_system(system, "profile", "testprofile0", token)
+    remote.save_system(system, token)
+
+
+@pytest.fixture()
+def remove_testsystem(remote, token):
+    """
+    Remove a system "testsystem0".
+    :param remote: See the corresponding fixture.
+    :param token: See the corresponding fixture.
+    """
+    yield
+    remote.remove_system("testsystem0", token, False)
+
+
+@pytest.mark.usefixtures("cobbler_xmlrpc_base", "remove_fakefiles")
+class TestDistroProfileSystem:
+    """
+    Test remote calls related to distros, profiles and systems
+    These item types are tested together because they have inter-dependencies
+    """
+
+    def test_get_distros(self, remote, token):
         """
         Test: get distros
         """
@@ -225,12 +429,12 @@ class TestDistroProfileSystem(CobblerXml
         # Arrange --> Nothing to arrange
 
         # Act
-        result = self.remote.get_distros(self.token)
+        result = remote.get_distros(token)
 
         # Assert
         assert result == []
 
-    def test_get_profiles(self):
+    def test_get_profiles(self, remote, token):
         """
         Test: get profiles
         """
@@ -238,12 +442,12 @@ class TestDistroProfileSystem(CobblerXml
         # Arrange --> Nothing to arrange
 
         # Act
-        result = self.remote.get_profiles(self.token)
+        result = remote.get_profiles(token)
 
         # Assert
         assert result == []
 
-    def test_get_systems(self):
+    def test_get_systems(self, remote, token):
         """
         Test: get systems
         """
@@ -251,13 +455,13 @@ class TestDistroProfileSystem(CobblerXml
         # Arrange --> Nothing to arrange
 
         # Act
-        result = self.remote.get_systems(self.token)
+        result = remote.get_systems(token)
 
         # Assert
         assert result == []
 
-    @pytest.mark.usefixtures("removeTestdistro")
-    def test_create_distro_positive(self):
+    @pytest.mark.usefixtures("remove_testdistro")
+    def test_create_distro_positive(self, remote, token, distro_fields):
         """
         Test: create/edit a distro with valid values
         """
@@ -265,21 +469,21 @@ class TestDistroProfileSystem(CobblerXml
         # Arrange --> Nothing to do.
 
         # Act
-        distro = self.remote.new_distro(self.token)
-        self.remote.modify_distro(distro, "name", "testdistro", self.token)
+        distro = remote.new_distro(token)
+        remote.modify_distro(distro, "name", "testdistro", token)
 
         # Assert
-        for field in self.distro_fields:
+        for field in distro_fields:
             (fname, fgood, fbad) = field
             for fg in fgood:
                 try:
-                    result = self.remote.modify_distro(distro, fname, fg, self.token)
-                    self.assertTrue(result)
+                    result = remote.modify_distro(distro, fname, fg, token)
+                    assert result
                 except Exception as e:
-                    self.fail("good field (%s=%s) raised exception: %s" % (fname, fg, str(e)))
+                    pytest.fail("good field (%s=%s) raised exception: %s" % (fname, fg, str(e)))
 
-        result_save_success = self.remote.save_distro(distro, self.token)
-        self.assertTrue(result_save_success)
+        result_save_success = remote.save_distro(distro, token)
+        assert result_save_success
 
         # FIXME: if field in item_<type>.FIELDS defines possible values,
         # test all of them. This is valid for all item types
@@ -290,10 +494,10 @@ class TestDistroProfileSystem(CobblerXml
         #            fvalue = random.choice(values)
         #        else:
         #             fvalue = "testing_" + fname
-        #        self.assertTrue(self.remote.modify_profile(subprofile,fname,fvalue,self.token))
+        #        self.assertTrue(remote.modify_profile(subprofile,fname,fvalue,token))
 
-    @pytest.mark.usefixtures("removeTestdistro")
-    def test_create_distro_negative(self):
+    @pytest.mark.usefixtures("remove_testdistro")
+    def test_create_distro_negative(self, remote, token, distro_fields, fk_kernel, fk_initrd):
         """
         Test: create/edit a distro with invalid values
         """
@@ -301,22 +505,24 @@ class TestDistroProfileSystem(CobblerXml
         # Arrange --> Nothing to do.
 
         # Act
-        distro = self.remote.new_distro(self.token)
-        self.remote.modify_distro(distro, "name", "testdistro", self.token)
+        distro = remote.new_distro(token)
+        remote.modify_distro(distro, "name", "testdistro0", token)
 
         # Assert
-        for field in self.distro_fields:
+        for field in distro_fields:
             (fname, fgood, fbad) = field
             for fb in fbad:
                 try:
-                    self.remote.modify_distro(distro, fname, fb, self.token)
+                    remote.modify_distro(distro, fname, fb, token)
                 except:
                     pass
                 else:
-                    self.fail("bad field (%s=%s) did not raise an exception" % (fname, fb))
+                    pytest.fail("bad field (%s=%s) did not raise an exception" % (fname, fb))
 
-        result_save_success = self.remote.save_distro(distro, self.token)
-        self.assertTrue(result_save_success)
+        remote.modify_distro(distro, "kernel", fk_kernel, token)
+        remote.modify_distro(distro, "initrd", fk_initrd, token)
+        result_save_success = remote.save_distro(distro, token)
+        assert result_save_success
 
         # FIXME: if field in item_<type>.FIELDS defines possible values,
         # test all of them. This is valid for all item types
@@ -327,345 +533,405 @@ class TestDistroProfileSystem(CobblerXml
         #            fvalue = random.choice(values)
         #        else:
         #             fvalue = "testing_" + fname
-        #        self.assertTrue(self.remote.modify_profile(subprofile,fname,fvalue,self.token))
+        #        self.assertTrue(remote.modify_profile(subprofile,fname,fvalue,token))
 
-    def test_create_profile(self):
+    @pytest.mark.usefixtures("create_testdistro", "remove_testdistro", "remove_testprofile")
+    def test_create_profile_positive(self, remote, token, profile_fields):
         """
         Test: create/edit a profile object
         """
 
-        # TODO: Arrange
+        # Arrange
+        profile = remote.new_profile(token)
+
+        # Act
+        for field in profile_fields:
+            (fname, fgood, _) = field
+            for fg in fgood:
+                try:
+                    assert remote.modify_profile(profile, fname, fg, token)
+                except Exception as e:
+                    pytest.fail("good field (%s=%s) raised exception: %s" % (fname, fg, str(e)))
 
-        # TODO: Act
+        remote.modify_profile(profile, "name", "testprofile0", token)
+        assert remote.save_profile(profile, token)
 
-        # TODO: Assert
+        # Assert
+        new_profiles = remote.get_profiles(token)
+        assert len(new_profiles) == 1
 
-        profiles = self.remote.get_profiles(self.token)
+    @pytest.mark.usefixtures("create_testdistro", "remove_testdistro", "remove_testprofile")
+    def test_create_profile_negative(self, remote, token, profile_fields):
+        """
+        Test: create/edit a profile object
+        """
 
-        profile = self.remote.new_profile(self.token)
+        # Arrange
+        profile = remote.new_profile(token)
 
-        for field in self.profile_fields:
-            (fname, fgood, fbad) = field
+        # Act
+        for field in profile_fields:
+            (fname, _, fbad) = field
             for fb in fbad:
                 try:
-                    self.remote.modify_profile(profile, fname, fb, self.token)
+                    remote.modify_profile(profile, fname, fb, token)
                 except:
                     pass
                 else:
-                    self.fail("bad field (%s=%s) did not raise an exception" % (fname, fb))
-            for fg in fgood:
-                try:
-                    self.assertTrue(self.remote.modify_profile(profile, fname, fg, self.token))
-                except Exception as e:
-                    self.fail("good field (%s=%s) raised exception: %s" % (fname, fg, str(e)))
+                    pytest.fail("bad field (%s=%s) did not raise an exception" % (fname, fb))
 
-        self.assertTrue(self.remote.save_profile(profile, self.token))
+        remote.modify_profile(profile, "distro", "testdistro0", token)
+        remote.modify_profile(profile, "name", "testprofile0", token)
+        assert remote.save_profile(profile, token)
 
-        new_profiles = self.remote.get_profiles(self.token)
-        self.assertTrue(len(new_profiles) == len(profiles) + 1)
-        assert 0
+        # Assert
+        new_profiles = remote.get_profiles(token)
+        assert len(new_profiles) == 1
 
-    def test_create_subprofile(self):
+    @pytest.mark.usefixtures("create_testdistro", "create_profile", "remove_testdistro", "remove_testprofile")
+    def test_create_subprofile(self, remote, token):
         """
         Test: create/edit a subprofile object
         """
 
-        # TODO: Arrange
-
-        # TODO: Act
-
-        # TODO: Assert
+        # Arrange
+        profiles = remote.get_profiles(token)
 
-        profiles = self.remote.get_profiles(self.token)
-
-        subprofile = self.remote.new_subprofile(self.token)
+        # Act
+        subprofile = remote.new_subprofile(token)
 
-        self.assertTrue(self.remote.modify_profile(subprofile, "name", "testsubprofile0", self.token))
-        self.assertTrue(self.remote.modify_profile(subprofile, "parent", "testprofile0", self.token))
+        # Assert
+        assert remote.modify_profile(subprofile, "name", "testsubprofile0", token)
+        assert remote.modify_profile(subprofile, "parent", "testprofile0", token)
 
-        self.assertTrue(self.remote.save_profile(subprofile, self.token))
+        assert remote.save_profile(subprofile, token)
 
-        new_profiles = self.remote.get_profiles(self.token)
-        self.assertTrue(len(new_profiles) == len(profiles) + 1)
-        assert 0
+        new_profiles = remote.get_profiles(token)
+        assert len(new_profiles) == len(profiles) + 1
 
-    def test_create_system(self):
+    @pytest.mark.usefixtures("create_testdistro", "create_profile", "remove_testdistro", "remove_testprofile",
+                             "remove_testsystem")
+    def test_create_system_positive(self, system_fields, remote, token):
         """
         Test: create/edit a system object
         """
 
-        # TODO: Arrange
+        # Arrange
+        systems = remote.get_systems(token)
+
+        # Act
+        system = remote.new_system(token)
+
+        # Assert
+        assert remote.modify_system(system, "name", "testsystem0", token)
+        assert remote.modify_system(system, "profile", "testprofile0", token)
+        for field in system_fields:
+            (fname, fgood, _) = field
+            for fg in fgood:
+                try:
+                    assert remote.modify_system(system, fname, fg, token)
+                except Exception as e:
+                    pytest.fail("good field (%s=%s) raised exception: %s" % (fname, fg, str(e)))
+
+        assert remote.save_system(system, token)
 
-        # TODO: Act
+        new_systems = remote.get_systems(token)
+        assert len(new_systems) == len(systems) + 1
 
-        # TODO: Assert
+    @pytest.mark.usefixtures("create_testdistro", "create_profile", "remove_testdistro", "remove_testprofile",
+                             "remove_testsystem")
+    def test_create_system_negative(self, system_fields, remote, token):
+        """
+        Test: create/edit a system object
+        """
 
-        systems = self.remote.get_systems(self.token)
+        # Arrange
+        systems = remote.get_systems(token)
 
-        system = self.remote.new_system(self.token)
+        # Act
+        system = remote.new_system(token)
 
-        self.assertTrue(self.remote.modify_system(system, "name", "testsystem0", self.token))
-        self.assertTrue(self.remote.modify_system(system, "profile", "testprofile0", self.token))
-        for field in self.system_fields:
-            (fname, fgood, fbad) = field
+        # Assert
+        assert remote.modify_system(system, "name", "testsystem0", token)
+        assert remote.modify_system(system, "profile", "testprofile0", token)
+        for field in system_fields:
+            (fname, _, fbad) = field
             for fb in fbad:
                 try:
-                    self.remote.modify_system(system, fname, fb, self.token)
+                    remote.modify_system(system, fname, fb, token)
                 except:
                     pass
                 else:
-                    self.fail("bad field (%s=%s) did not raise an exception" % (fname, fb))
-            for fg in fgood:
-                try:
-                    self.assertTrue(self.remote.modify_system(system, fname, fg, self.token))
-                except Exception as e:
-                    self.fail("good field (%s=%s) raised exception: %s" % (fname, fg, str(e)))
+                    pytest.fail("bad field (%s=%s) did not raise an exception" % (fname, fb))
 
-        self.assertTrue(self.remote.save_system(system, self.token))
+        assert remote.save_system(system, token)
 
-        new_systems = self.remote.get_systems(self.token)
-        self.assertTrue(len(new_systems) == len(systems) + 1)
-        assert 0
+        new_systems = remote.get_systems(token)
+        assert len(new_systems) == len(systems) + 1
 
-    def test_get_distro(self):
+    @pytest.mark.usefixtures("create_testdistro", "remove_testdistro")
+    def test_get_distro(self, remote, fk_initrd, fk_kernel):
+        """
+        Test: get a distro object
         """
-        Test: get a distro object"""
 
-        # TODO: Arrange
+        # Arrange --> Done in fixture
 
         # Act
-        distro = self.remote.get_distro("testdistro0")
+        distro = remote.get_distro("testdistro0")
 
-        # TODO: Assert
-        assert 0
+        # Assert
+        assert distro.get("name") == "testdistro0"
+        assert distro.get("initrd") == fk_initrd
+        assert distro.get("kernel") == fk_kernel
 
-    def test_get_profile(self):
+    @pytest.mark.usefixtures("create_testdistro", "create_profile", "remove_testdistro", "remove_testprofile")
+    def test_get_profile(self, remote):
         """
         Test: get a profile object
         """
 
-        # TODO: Arrange
+        # Arrange --> Done in fixture.
 
         # Act
-        profile = self.remote.get_profile("testprofile0")
+        profile = remote.get_profile("testprofile0")
 
-        # TODO: Assert
-        assert 0
+        # Assert
+        assert profile.get("name") == "testprofile0"
+        assert profile.get("distro") == "testdistro0"
+        assert profile.get("kernel_options") == {'a': '1', 'b': '2', 'c': ['3', '4', '5'], 'd': '~', 'e': '~'}
 
-    def test_get_system(self):
+    def test_get_system(self, remote):
         """
         Test: get a system object
         """
 
-        # TODO: Arrange
+        # Arrange --> There should be no system present. --> Nothing to Init.
 
         # Act
-        system = self.remote.get_system("testsystem0")
+        system = remote.get_system("testsystem0")
 
-        # TODO: Assert
-        assert 0
+        # Assert
+        assert system is "~"
 
-    def test_find_distro(self):
+    def test_find_distro(self, remote, token):
         """
         Test: find a distro object
         """
 
-        # TODO: Arrange
+        # Arrange --> No distros means no setup
 
         # Act
-        result = self.remote.find_distro({"name": "testdistro0"}, self.token)
+        result = remote.find_distro({"name": "testdistro0"}, token)
 
-        # TODO: Assert
-        self.assertTrue(result)
-        assert 0
+        # Assert
+        assert result == []
 
-    def test_find_profile(self):
+    @pytest.mark.usefixtures("create_testdistro", "create_profile", "remove_testdistro", "remove_testprofile")
+    def test_find_profile(self, remote, token):
         """
         Test: find a profile object
         """
 
-        # TODO: Arrange
+        # Arrange --> Done in fixtures
 
         # Act
-        result = self.remote.find_profile({"name": "testprofile0"}, self.token)
+        result = remote.find_profile({"name": "testprofile0"}, token)
 
-        # TODO: Assert
-        self.assertTrue(result)
-        assert 0
+        # Assert
+        assert len(result) == 1
+        assert result[0].get("name") == "testprofile0"
 
-    def test_find_system(self):
+    def test_find_system(self, remote, token):
         """
         Test: find a system object
         """
 
-        # TODO: Arrange
+        # Arrange --> Nothing to arrange
 
         # Act
-        result = self.remote.find_system({"name": "testsystem0"}, self.token)
+        result = remote.find_system({"name": "notexisting"}, token)
 
-        # TODO: Assert
-        self.assertTrue(result)
-        assert 0
+        # Assert --> A not exiting system returns an empty list
+        assert result == []
 
-    def test_copy_distro(self):
+    @pytest.mark.usefixtures("create_testdistro", "remove_testdistro")
+    def test_copy_distro(self, remote, token):
         """
         Test: copy a distro object
         """
 
-        # TODO: Arrange
+        # Arrange --> Done in the fixture
 
         # Act
-        distro = self.remote.get_item_handle("distro", "testdistro0", self.token)
+        distro = remote.get_item_handle("distro", "testdistro0", token)
+        result = remote.copy_distro(distro, "testdistrocopy", token)
 
-        # TODO: Assert
-        self.assertTrue(self.remote.copy_distro(distro, "testdistrocopy", self.token))
-        assert 0
+        # Assert
+        assert result
 
-    def test_copy_profile(self):
+        # Cleanup --> Plus fixture
+        remote.remove_distro("testdistrocopy", token)
+
+    @pytest.mark.usefixtures("create_testdistro", "create_profile", "remove_testdistro", "remove_testprofile")
+    def test_copy_profile(self, remote, token):
         """
         Test: copy a profile object
         """
 
-        # TODO: Arrange
+        # Arrange --> Done in fixtures
 
         # Act
-        profile = self.remote.get_item_handle("profile", "testprofile0", self.token)
+        profile = remote.get_item_handle("profile", "testprofile0", token)
+        result = remote.copy_profile(profile, "testprofilecopy", token)
+
+        # Assert
+        assert result
 
-        # TODO: Assert
-        self.assertTrue(self.remote.copy_profile(profile, "testprofilecopy", self.token))
-        assert 0
+        # Cleanup
+        remote.remove_profile("testprofilecopy", token)
 
-    def test_copy_system(self):
+    @pytest.mark.usefixtures("create_testdistro", "create_profile", "create_testsystem", "remove_testdistro",
+                             "remove_testprofile", "remove_testsystem")
+    def test_copy_system(self, remote, token):
         """
         Test: copy a system object
         """
 
-        # TODO: Arrange
+        # Arrange
+        system = remote.get_item_handle("system", "testsystem0", token)
 
         # Act
-        system = self.remote.get_item_handle("system", "testsystem0", self.token)
+        result = remote.copy_system(system, "testsystemcopy", token)
+
+        # Assert
+        assert result
 
-        # TODO: Assert
-        self.assertTrue(self.remote.copy_system(system, "testsystemcopy", self.token))
-        assert 0
+        # Cleanup
+        remote.remove_system("testsytemcopy", token)
 
-    def test_rename_distro(self):
+    @pytest.mark.usefixtures("create_testdistro")
+    def test_rename_distro(self, remote, token):
         """
         Test: rename a distro object
         """
 
-        # TODO: Arrange
-        distro = self.remote.get_item_handle("distro", "testdistrocopy", self.token)
+        # Arrange
+        distro = remote.get_item_handle("distro", "testdistro0", token)
 
         # Act
-        result = self.remote.rename_distro(distro, "testdistro1", self.token)
+        result = remote.rename_distro(distro, "testdistro1", token)
+
+        # Assert
+        assert result
 
-        # TODO: Assert
-        self.assertTrue(result)
-        assert 0
+        # Cleanup
+        remote.remove_distro("testdistro1", token)
 
-    def test_rename_profile(self):
+    @pytest.mark.usefixtures("create_testdistro", "create_profile", "remove_testprofile", "remove_testdistro")
+    def test_rename_profile(self, remote, token):
         """
         Test: rename a profile object
         """
 
-        # TODO: Arrange
-        profile = self.remote.get_item_handle("profile", "testprofilecopy", self.token)
+        # Arrange
+        profile = remote.get_item_handle("profile", "testprofile0", token)
 
         # Act
-        result = self.remote.rename_profile(profile, "testprofile1", self.token)
+        result = remote.rename_profile(profile, "testprofile1", token)
 
-        # TODO: Assert
-        self.assertTrue(result)
-        assert 0
+        # Assert
+        assert result
+
+        # Cleanup
+        remote.remove_profile("testprofile1", token)
 
-    def test_rename_system(self):
+    @pytest.mark.usefixtures("create_testdistro", "create_profile", "create_testsystem", "remove_testdistro",
+                             "remove_testprofile", "remove_testsystem")
+    def test_rename_system(self, remote, token):
         """
         Test: rename a system object
         """
 
-        # TODO: Arrange
-        # Create System
-        # Get Object-ID
-        system = self.remote.get_item_handle("system", "testsystemcopy", self.token)
+        # Arrange --> Done in fixtures also.
+        system = remote.get_item_handle("system", "testsystem0", token)
 
         # Act
-        result = self.remote.rename_system(system, "testsystem1", self.token)
+        result = remote.rename_system(system, "testsystem1", token)
 
-        # TODO: Assert
-        self.assertTrue(result)
-        assert 0
+        # Assert
+        assert result
 
-    def test_remove_distro(self):
+        # Cleanup
+        remote.remove_system("testsystem1", token)
+
+    def test_remove_distro(self, remote, token):
         """
         Test: remove a distro object
         """
 
-        # TODO: Arrange
+        # Arrange
+        # TODO: Verify why the test passes without the fixture for creating the distro!
 
         # Act
-        result = self.remote.remove_distro("testdistro0", self.token)
+        result = remote.remove_distro("testdistro0", token)
 
-        # TODO: Assert
-        self.assertTrue(result)
-        assert 0
+        # Assert
+        assert result
 
-    def test_remove_profile(self):
+    def test_remove_profile(self, remote, token):
         """
         Test: remove a profile object
         """
 
-        # TODO: Arrange
+        # Arrange
+        # TODO: Verify why the test passes without the fixture for creating the profile!
 
         # Act
-        result_subprofile_remove = self.remote.remove_profile("testsubprofile0", self.token)
-        result_profile_remove = self.remote.remove_profile("testprofile0", self.token)
+        # TODO: Why does the subprofile call return true? There shouldn't be one.
+        result_subprofile_remove = remote.remove_profile("testsubprofile0", token)
+        result_profile_remove = remote.remove_profile("testprofile0", token)
 
-        # TODO: Assert
-        self.assertTrue(result_subprofile_remove)
-        self.assertTrue(result_profile_remove)
-        assert 0
+        # Assert
+        assert result_subprofile_remove
+        assert result_profile_remove
 
-    def test_remove_system(self):
+    def test_remove_system(self, remote, token):
         """
         Test: remove a system object
         """
 
-        # TODO: Arrange
+        # Arrange
+        # TODO: Verify why the test passes without the fixture for creating the system!
 
         # Act
-        result = self.remote.remove_system("testsystem0", self.token)
+        result = remote.remove_system("testsystem0", token)
 
-        # TODO: Assert
-        self.assertTrue(result)
-        assert 0
+        # Assert
+        assert result
 
-    def test_get_repo_config_for_profile(self):
+    def test_get_repo_config_for_profile(self, remote):
         """
         Test: get repository configuration of a profile
         """
 
-        # TODO: Arrange
+        # Arrange --> There is nothing to be arranged
 
         # Act
-        result = self.remote.get_repo_config_for_profile("testprofile0")
+        result = remote.get_repo_config_for_profile("testprofile0")
 
-        # TODO: Assert
-        assert 0
+        # Assert --> Let the test pass if the call is okay.
+        assert True
 
-    def test_get_repo_config_for_system(self):
+    def test_get_repo_config_for_system(self, remote):
         """
         Test: get repository configuration of a system
         """
 
-        # TODO: Arrange
-
-        # TODO: Act
-        result = self.remote.get_repo_config_for_system("testprofile0")
-
-        # TODO: Assert
-        assert 0
+        # Arrange --> There is nothing to be arranged
 
+        # Act
+        result = remote.get_repo_config_for_system("testprofile0")
 
-if __name__ == '__main__':
-    pytest.main()
+        # Assert --> Let the test pass if the call is okay.
+        assert True
Index: cobbler-3.0.0+git20190222.9e502a9d/tests/xmlrpcapi/file_test.py
===================================================================
--- cobbler-3.0.0+git20190222.9e502a9d.orig/tests/xmlrpcapi/file_test.py
+++ cobbler-3.0.0+git20190222.9e502a9d/tests/xmlrpcapi/file_test.py
@@ -1,5 +1,4 @@
-import unittest
-from .cobbler_xmlrpc_base_test import CobblerXmlRpcBaseTest
+import pytest
 
 
 """
@@ -14,76 +13,73 @@ test_remove_file()
 """
 
 
-class TestFile(CobblerXmlRpcBaseTest):
+@pytest.mark.usefixtures("cobbler_xmlrpc_base")
+class TestFile:
     """
     Test remote calls related to files
     """
 
-    def test_create_file(self):
-        files = self.remote.get_files(self.token)
+    def test_create_file(self, remote, token):
+        files = remote.get_files(token)
 
-        file_id = self.remote.new_file(self.token)
+        file_id = remote.new_file(token)
 
-        self.remote.modify_file(file_id, "name", "testfile0", self.token)
-        self.remote.modify_file(file_id, "is_directory", "False", self.token)
-        self.remote.modify_file(file_id, "action", "create", self.token)
-        self.remote.modify_file(file_id, "group", "root", self.token)
-        self.remote.modify_file(file_id, "mode", "0644", self.token)
-        self.remote.modify_file(file_id, "owner", "root", self.token)
-        self.remote.modify_file(file_id, "path", "/root/testfile0", self.token)
-        self.remote.modify_file(file_id, "template", "testtemplate0", self.token)
+        remote.modify_file(file_id, "name", "testfile0", token)
+        remote.modify_file(file_id, "is_directory", "False", token)
+        remote.modify_file(file_id, "action", "create", token)
+        remote.modify_file(file_id, "group", "root", token)
+        remote.modify_file(file_id, "mode", "0644", token)
+        remote.modify_file(file_id, "owner", "root", token)
+        remote.modify_file(file_id, "path", "/root/testfile0", token)
+        remote.modify_file(file_id, "template", "testtemplate0", token)
 
-        self.remote.save_file(file_id, self.token)
+        remote.save_file(file_id, token)
 
-        new_files = self.remote.get_files(self.token)
-        self.assertTrue(len(new_files) == len(files) + 1)
+        new_files = remote.get_files(token)
+        assert len(new_files) == len(files) + 1
 
-    def test_get_files(self):
+    def test_get_files(self, remote, token):
         """
         Test: get files
         """
 
-        self.remote.get_files(self.token)
+        remote.get_files(token)
 
-    def test_get_file(self):
+    def test_get_file(self, remote):
         """
         Test: Get a file object
         """
 
-        file = self.remote.get_file("testfile0")
+        file = remote.get_file("testfile0")
 
-    def test_find_file(self):
+    def test_find_file(self, remote, token):
         """
         Test: find a file object
         """
 
-        result = self.remote.find_file({"name": "testfile0"}, self.token)
-        self.assertTrue(result)
+        result = remote.find_file({"name": "testfile0"}, token)
+        assert result
 
-    def test_copy_file(self):
+    def test_copy_file(self, remote, token):
         """
         Test: copy a file object
         """
 
-        file = self.remote.get_item_handle("file", "testfile0", self.token)
-        self.assertTrue(self.remote.copy_file(file, "testfilecopy", self.token))
+        file = remote.get_item_handle("file", "testfile0", token)
+        assert remote.copy_file(file, "testfilecopy", token)
 
-    def test_rename_file(self):
+    def test_rename_file(self, remote, token):
         """
         Test: rename a file object
         """
 
-        file = self.remote.get_item_handle("file", "testfilecopy", self.token)
-        self.assertTrue(self.remote.rename_file(file, "testfile1", self.token))
+        file = remote.get_item_handle("file", "testfilecopy", token)
+        assert remote.rename_file(file, "testfile1", token)
 
-    def test_remove_file(self):
+    def test_remove_file(self, remote, token):
         """
         Test: remove a file object
         """
 
-        self.assertTrue(self.remote.remove_file("testfile0", self.token))
-        self.assertTrue(self.remote.remove_file("testfile1", self.token))
-
-
-if __name__ == '__main__':
-    unittest.main()
+        assert remote.remove_file("testfile0", token)
+        assert remote.remove_file("testfile1", token)
Index: cobbler-3.0.0+git20190222.9e502a9d/tests/xmlrpcapi/image_test.py
===================================================================
--- cobbler-3.0.0+git20190222.9e502a9d.orig/tests/xmlrpcapi/image_test.py
+++ cobbler-3.0.0+git20190222.9e502a9d/tests/xmlrpcapi/image_test.py
@@ -1,5 +1,4 @@
-import unittest
-from .cobbler_xmlrpc_base_test import CobblerXmlRpcBaseTest
+import pytest
 
 
 def tprint(call_name):
@@ -12,85 +11,83 @@ def tprint(call_name):
     print("test remote call: %s()" % call_name)
 
 
-class TestImage(CobblerXmlRpcBaseTest):
+@pytest.mark.usefixtures("cobbler_xmlrpc_base")
+class TestImage:
 
-    def _create_image(self):
+    def _create_image(self, remote, token):
         """
         Test: create/edit of an image object"""
 
-        images = self.remote.get_images(self.token)
+        images = remote.get_images(token)
 
         tprint("new_image")
-        image = self.remote.new_image(self.token)
+        image = remote.new_image(token)
 
         tprint("modify_image")
-        self.assertTrue(self.remote.modify_image(image, "name", "testimage0", self.token))
+        assert remote.modify_image(image, "name", "testimage0", token)
 
         tprint("save_image")
-        self.assertTrue(self.remote.save_image(image, self.token))
+        assert remote.save_image(image, token)
 
-        new_images = self.remote.get_images(self.token)
-        self.assertTrue(len(new_images) == len(images) + 1)
+        new_images = remote.get_images(token)
+        assert len(new_images) == len(images) + 1
 
-    def _get_images(self):
+    def _get_images(self, remote):
         """
         Test: get images
         """
         tprint("get_images")
-        self.remote.get_images()
+        remote.get_images()
 
-    def _get_image(self):
+    def _get_image(self, remote):
         """
         Test: Get an image object
         """
 
         tprint("get_image")
-        image = self.remote.get_image("testimage0")
+        image = remote.get_image("testimage0")
 
-    def _find_image(self):
+    def _find_image(self, remote, token):
         """
         Test: Find an image object
         """
 
         tprint("find_image")
-        result = self.remote.find_image({"name": "testimage0"}, self.token)
-        self.assertTrue(result)
+        result = remote.find_image({"name": "testimage0"}, token)
+        assert result
 
-    def _copy_image(self):
+    def _copy_image(self, remote, token):
         """
         Test: Copy an image object
         """
 
         tprint("find_image")
-        image = self.remote.get_item_handle("image", "testimage0", self.token)
-        self.assertTrue(self.remote.copy_image(image, "testimagecopy", self.token))
+        image = remote.get_item_handle("image", "testimage0", token)
+        assert remote.copy_image(image, "testimagecopy", token)
 
-    def _rename_image(self):
+    def _rename_image(self, remote, token):
         """
         Test: Rename an image object
         """
 
         tprint("rename_image")
-        image = self.remote.get_item_handle("image", "testimagecopy", self.token)
-        self.assertTrue(self.remote.rename_image(image, "testimage1", self.token))
+        image = remote.get_item_handle("image", "testimagecopy", token)
+        assert remote.rename_image(image, "testimage1", token)
 
-    def _remove_image(self):
+    def _remove_image(self, remote, token):
         """
         Test: remove an image object
         """
 
         tprint("remove_image")
-        self.assertTrue(self.remote.remove_image("testimage0", self.token))
-        self.assertTrue(self.remote.remove_image("testimage1", self.token))
+        assert remote.remove_image("testimage0", token)
+        assert remote.remove_image("testimage1", token)
 
-    def test_image(self):
-        self._get_images()
-        self._create_image()
-        self._get_image()
-        self._find_image()
-        self._copy_image()
-        self._rename_image()
-        self._remove_image()
-
-if __name__ == '__main__':
-    unittest.main()
+    def test_image(self, remote, token):
+        self._get_images(remote)
+        self._create_image(remote, token)
+        self._get_image(remote)
+        self._find_image(remote, token)
+        self._copy_image(remote, token)
+        self._rename_image(remote, token)
+        self._remove_image(remote, token)
Index: cobbler-3.0.0+git20190222.9e502a9d/tests/xmlrpcapi/item_test.py
===================================================================
--- cobbler-3.0.0+git20190222.9e502a9d.orig/tests/xmlrpcapi/item_test.py
+++ cobbler-3.0.0+git20190222.9e502a9d/tests/xmlrpcapi/item_test.py
@@ -1,5 +1,4 @@
-import unittest
-from .cobbler_xmlrpc_base_test import CobblerXmlRpcBaseTest
+import pytest
 
 
 def tprint(call_name):
@@ -12,12 +11,13 @@ def tprint(call_name):
     print("test remote call: %s()" % call_name)
 
 
-class TestItem(CobblerXmlRpcBaseTest):
+@pytest.mark.usefixtures("cobbler_xmlrpc_base")
+class TestItem:
     """
     Test item
     """
 
-    def _get_item(self, type):
+    def _get_item(self, type, remote):
         """
         Test: get a generic item
 
@@ -25,9 +25,9 @@ class TestItem(CobblerXmlRpcBaseTest):
         """
 
         tprint("get_item")
-        item = self.remote.get_item(type, "test%s2" % type)
+        item = remote.get_item(type, "test%s2" % type)
 
-    def _find_item(self, type):
+    def _find_item(self, type, remote):
         """
         Test: find a generic item
 
@@ -35,10 +35,10 @@ class TestItem(CobblerXmlRpcBaseTest):
         """
 
         tprint("find_items")
-        result = self.remote.find_items(type, {"name": "test%s2" % type}, None, False)
-        self.assertTrue(len(result) > 0)
+        result = remote.find_items(type, {"name": "test%s2" % type}, None, False)
+        assert len(result) > 0
 
-    def _copy_item(self, type):
+    def _copy_item(self, type, remote, token):
         """
         Test: copy a generic item
 
@@ -46,11 +46,11 @@ class TestItem(CobblerXmlRpcBaseTest):
         """
 
         tprint("copy_item")
-        item_id = self.remote.get_item_handle(type, "test%s2" % type, self.token)
-        result = self.remote.copy_item(type, item_id, "test%scopy" % type, self.token)
-        self.assertTrue(result)
+        item_id = remote.get_item_handle(type, "test%s2" % type, token)
+        result = remote.copy_item(type, item_id, "test%scopy" % type, token)
+        assert result
 
-    def _has_item(self, type):
+    def _has_item(self, type, remote, token):
         """
         Test: check if an item is in a item collection
 
@@ -58,10 +58,10 @@ class TestItem(CobblerXmlRpcBaseTest):
         """
 
         tprint("has_item")
-        result = self.remote.has_item(type, "test%s2" % type, self.token)
-        self.assertTrue(result)
+        result = remote.has_item(type, "test%s2" % type, token)
+        assert result
 
-    def _rename_item(self, type):
+    def _rename_item(self, type, remote, token):
         """
         Test: rename a generic item
 
@@ -69,11 +69,11 @@ class TestItem(CobblerXmlRpcBaseTest):
         """
 
         tprint("rename_item")
-        item_id = self.remote.get_item_handle(type, "test%scopy" % type, self.token)
-        result = self.remote.rename_item(type, item_id, "test%s3" % type, self.token)
-        self.assertTrue(result)
+        item_id = remote.get_item_handle(type, "test%scopy" % type, token)
+        result = remote.rename_item(type, item_id, "test%s3" % type, token)
+        assert result
 
-    def _remove_item(self, type):
+    def _remove_item(self, type, remote, token):
         """
         Test: remove a generic item
 
@@ -81,33 +81,30 @@ class TestItem(CobblerXmlRpcBaseTest):
         """
 
         tprint("remove_item")
-        self.assertTrue(self.remote.remove_item(type, "test%s2" % type, self.token))
-        self.assertTrue(self.remote.remove_item(type, "test%s3" % type, self.token))
+        assert remote.remove_item(type, "test%s2" % type, token)
+        assert remote.remove_item(type, "test%s3" % type, token)
 
-    def test_item(self):
+    def test_item(self, remote, token):
         type = "mgmtclass"
 
         tprint("get_item_names")
-        items_names = self.remote.get_item_names(type)
+        items_names = remote.get_item_names(type)
 
         # create an item of the type defined above
-        item_id = self.remote.new_mgmtclass(self.token)
+        item_id = remote.new_mgmtclass(token)
 
-        self.remote.modify_item(type, item_id, "name", "test%s2" % type, self.token)
-        result = self.remote.save_item(type, item_id, self.token)
-        self.assertTrue(result)
-
-        new_items_names = self.remote.get_item_names(type)
-        self.assertTrue(len(new_items_names) == len(items_names) + 1)
-
-        self._get_item(type)
-        self._find_item(type)
-        self._copy_item(type)
-        self._rename_item(type)
-        self._remove_item(type)
+        remote.modify_item(type, item_id, "name", "test%s2" % type, token)
+        result = remote.save_item(type, item_id, token)
+        assert result
+
+        new_items_names = remote.get_item_names(type)
+        assert len(new_items_names) == len(items_names) + 1
+
+        self._get_item(type, remote)
+        self._find_item(type, remote)
+        self._copy_item(type, remote, token)
+        self._rename_item(type, remote, token)
+        self._remove_item(type, remote, token)
 
-        new_items_names = self.remote.get_item_names(type)
-        self.assertTrue(len(new_items_names) == len(items_names))
-
-if __name__ == '__main__':
-    unittest.main()
+        new_items_names = remote.get_item_names(type)
+        assert len(new_items_names) == len(items_names)
Index: cobbler-3.0.0+git20190222.9e502a9d/tests/xmlrpcapi/mgmt_class_test.py
===================================================================
--- cobbler-3.0.0+git20190222.9e502a9d.orig/tests/xmlrpcapi/mgmt_class_test.py
+++ cobbler-3.0.0+git20190222.9e502a9d/tests/xmlrpcapi/mgmt_class_test.py
@@ -1,5 +1,4 @@
-import unittest
-from .cobbler_xmlrpc_base_test import CobblerXmlRpcBaseTest
+import pytest
 
 
 def tprint(call_name):
@@ -12,87 +11,85 @@ def tprint(call_name):
     print("test remote call: %s()" % call_name)
 
 
-class TestMgmtClass(CobblerXmlRpcBaseTest):
+@pytest.mark.usefixtures("cobbler_xmlrpc_base")
+class TestMgmtClass:
 
-    def _create_mgmtclass(self):
+    def _create_mgmtclass(self, remote, token):
         """
         Test: create/edit a mgmtclass object
         """
 
-        mgmtclasses = self.remote.get_mgmtclasses(self.token)
+        mgmtclasses = remote.get_mgmtclasses(token)
 
         tprint("new_mgmtclass")
-        mgmtclass = self.remote.new_mgmtclass(self.token)
+        mgmtclass = remote.new_mgmtclass(token)
 
         tprint("modify_mgmtclass")
-        self.assertTrue(self.remote.modify_mgmtclass(mgmtclass, "name", "testmgmtclass0", self.token))
+        assert remote.modify_mgmtclass(mgmtclass, "name", "testmgmtclass0", token)
 
         tprint("save_mgmtclass")
-        self.assertTrue(self.remote.save_mgmtclass(mgmtclass, self.token))
+        assert remote.save_mgmtclass(mgmtclass, token)
 
-        new_mgmtclasses = self.remote.get_mgmtclasses(self.token)
-        self.assertTrue(len(new_mgmtclasses) == len(mgmtclasses) + 1)
+        new_mgmtclasses = remote.get_mgmtclasses(token)
+        assert len(new_mgmtclasses) == len(mgmtclasses) + 1
 
-    def _get_mgmtclasses(self):
+    def _get_mgmtclasses(self, remote):
         """
         Test: Get mgmtclasses objects
         """
 
         tprint("get_mgmtclasses")
-        self.remote.get_mgmtclasses()
+        remote.get_mgmtclasses()
 
-    def _get_mgmtclass(self):
+    def _get_mgmtclass(self, remote):
         """
         Test: get a mgmtclass object
         """
 
         tprint("get_mgmtclass")
-        mgmtclass = self.remote.get_mgmtclass("testmgmtclass0")
+        mgmtclass = remote.get_mgmtclass("testmgmtclass0")
 
-    def _find_mgmtclass(self):
+    def _find_mgmtclass(self, remote, token):
         """
         Test: find a mgmtclass object
         """
 
         tprint("find_mgmtclass")
-        result = self.remote.find_mgmtclass({"name": "testmgmtclass0"}, self.token)
-        self.assertTrue(result)
+        result = remote.find_mgmtclass({"name": "testmgmtclass0"}, token)
+        assert result
 
-    def _copy_mgmtclass(self):
+    def _copy_mgmtclass(self, remote, token):
         """
         Test: copy a mgmtclass object
         """
 
         tprint("copy_mgmtclass")
-        mgmtclass = self.remote.get_item_handle("mgmtclass", "testmgmtclass0", self.token)
-        self.assertTrue(self.remote.copy_mgmtclass(mgmtclass, "testmgmtclasscopy", self.token))
+        mgmtclass = remote.get_item_handle("mgmtclass", "testmgmtclass0", token)
+        assert remote.copy_mgmtclass(mgmtclass, "testmgmtclasscopy", token)
 
-    def _rename_mgmtclass(self):
+    def _rename_mgmtclass(self, remote, token):
         """
         Test: rename a mgmtclass object
         """
 
         tprint("rename_mgmtclass")
-        mgmtclass = self.remote.get_item_handle("mgmtclass", "testmgmtclasscopy", self.token)
-        self.assertTrue(self.remote.rename_mgmtclass(mgmtclass, "testmgmtclass1", self.token))
+        mgmtclass = remote.get_item_handle("mgmtclass", "testmgmtclasscopy", token)
+        assert remote.rename_mgmtclass(mgmtclass, "testmgmtclass1", token)
 
-    def _remove_mgmtclass(self):
+    def _remove_mgmtclass(self, remote, token):
         """
         Test: remove a mgmtclass object
         """
 
         tprint("remove_mgmtclass")
-        self.assertTrue(self.remote.remove_mgmtclass("testmgmtclass0", self.token))
-        self.assertTrue(self.remote.remove_mgmtclass("testmgmtclass1", self.token))
+        assert remote.remove_mgmtclass("testmgmtclass0", token)
+        assert remote.remove_mgmtclass("testmgmtclass1", token)
 
-    def test_mgmtclass(self):
-        self._get_mgmtclasses()
-        self._create_mgmtclass()
-        self._get_mgmtclass()
-        self._find_mgmtclass()
-        self._copy_mgmtclass()
-        self._rename_mgmtclass()
-        self._remove_mgmtclass()
-
-if __name__ == '__main__':
-    unittest.main()
+    def test_mgmtclass(self, remote, token):
+        self._get_mgmtclasses(remote)
+        self._create_mgmtclass(remote, token)
+        self._get_mgmtclass(remote)
+        self._find_mgmtclass(remote, token)
+        self._copy_mgmtclass(remote, token)
+        self._rename_mgmtclass(remote, token)
+        self._remove_mgmtclass(remote, token)
Index: cobbler-3.0.0+git20190222.9e502a9d/tests/xmlrpcapi/miscellaneous_test.py
===================================================================
--- cobbler-3.0.0+git20190222.9e502a9d.orig/tests/xmlrpcapi/miscellaneous_test.py
+++ cobbler-3.0.0+git20190222.9e502a9d/tests/xmlrpcapi/miscellaneous_test.py
@@ -1,104 +1,133 @@
-import unittest
-from .cobbler_xmlrpc_base_test import CobblerXmlRpcBaseTest
+import pytest
 
 
-class TestMiscellaneous(CobblerXmlRpcBaseTest):
+@pytest.mark.usefixtures("cobbler_xmlrpc_base")
+class TestMiscellaneous:
     """
     Class to test remote calls to cobbler which do not belong into a specific category.
     """
 
+    @pytest.mark.skip(reason="Not Implemented!")
     def test_clear_system_logs(self):
         # TODO: test remote.clear_system_logs()
         raise NotImplementedError()
 
+    @pytest.mark.skip(reason="Not Implemented!")
     def test_disable_netboot(self):
         # TODO: test remote.disable_netboot()
         raise NotImplementedError()
 
+    @pytest.mark.skip(reason="Not Implemented!")
     def test_extended_version(self):
         # TODO: test remote.extended_version()
         raise NotImplementedError()
 
+    @pytest.mark.skip(reason="Not Implemented!")
     def test_find_items_paged(self):
         # TODO: test remote.find_items_paged()
         raise NotImplementedError()
 
+    @pytest.mark.skip(reason="Not Implemented!")
     def test_find_system_by_dns_name(self):
         # TODO: test remote.find_system_by_dns_name()
         raise NotImplementedError()
 
+    @pytest.mark.skip(reason="Not Implemented!")
     def test_generatescript(self):
         # TODO: test remote.generatescript()
         raise NotImplementedError()
 
+    @pytest.mark.skip(reason="Not Implemented!")
     def test_get_item_as_rendered(self):
         # TODO: test remote.get_<item>_as_rendered()
         raise NotImplementedError()
 
+    @pytest.mark.skip(reason="Not Implemented!")
     def test_get_s_since(self):
         # TODO: test remote.get_<item>s_since()
         raise NotImplementedError()
 
+    @pytest.mark.skip(reason="Not Implemented!")
     def test_get_authn_module_name(self):
         # TODO: test remote.get_authn_module_name()
         raise NotImplementedError()
 
+    @pytest.mark.skip(reason="Not Implemented!")
     def test_get_blended_data(self):
         # TODO: test remote.get_blended_data()
         raise NotImplementedError()
 
+    @pytest.mark.skip(reason="Not Implemented!")
     def test_get_config_data(self):
         # TODO: test remote.get_config_dataa()
         raise NotImplementedError()
 
+    @pytest.mark.skip(reason="Not Implemented!")
     def test_get_repos_compatible_with_profile(self):
         # TODO: test remote.get_repos_compatible_with_profile()
         raise NotImplementedError()
 
+    @pytest.mark.skip(reason="Not Implemented!")
     def test_get_status(self):
         # TODO: test remote.get_status()
         raise NotImplementedError()
 
+    @pytest.mark.skip(reason="Not Implemented!")
     def test_get_template_file_for_profile(self):
         # TODO: test remote.get_template_file_for_profile()
         raise NotImplementedError()
 
+    @pytest.mark.skip(reason="Not Implemented!")
     def test_get_template_file_for_system(self):
         # TODO: test remote.get_template_file_for_system()
         raise NotImplementedError()
 
-    def test_is_kickstart_in_use(self):
-        # TODO: test remote.is_kickstart_in_use()
+    @pytest.mark.skip(reason="Not Implemented!")
+    def test_is_autoinstall_in_use(self):
+        # TODO: test remote.is_autoinstall_in_use()
         raise NotImplementedError()
 
+    @pytest.mark.skip(reason="Not Implemented!")
     def test_logout(self):
         # TODO: test remote.logout()
         raise NotImplementedError()
 
+    @pytest.mark.skip(reason="Not Implemented!")
     def test_modify_setting(self):
         # TODO: test remote.modify_setting()
         raise NotImplementedError()
 
-    def test_read_or_write_kickstart_template(self):
-        # TODO: test remote.read_or_write_kickstart_template()
+    @pytest.mark.skip(reason="Not Implemented!")
+    def test_read_autoinstall_template(self):
+        # TODO: test remote.read_autoinstall_template()
         raise NotImplementedError()
 
+    @pytest.mark.skip(reason="Not Implemented!")
+    def test_write_autoinstall_template(self):
+        # TODO: test remote.write_autoinstall_template()
+        raise NotImplementedError()
+
+    @pytest.mark.skip(reason="Not Implemented!")
+    def test_remove_autoinstall_template(self):
+        # TODO: test remote.remove_autoinstall_template()
+        raise NotImplementedError()
+
+    @pytest.mark.skip(reason="Not Implemented!")
     def test_read_or_write_snippet(self):
         # TODO: test remote.read_or_write_snippet()
         raise NotImplementedError()
 
+    @pytest.mark.skip(reason="Not Implemented!")
     def test_run_install_triggers(self):
         # TODO: test remote.run_install_triggers()
         raise NotImplementedError()
 
+    @pytest.mark.skip(reason="Not Implemented!")
     def test_version(self):
         # TODO: test remote.version()
         raise NotImplementedError()
 
+    @pytest.mark.skip(reason="Not Implemented!")
     def test_xapi_object_edit(self):
         # TODO: test remote.xapi_object_edit()
         raise NotImplementedError()
-
-
-if __name__ == '__main__':
-    unittest.main()
Index: cobbler-3.0.0+git20190222.9e502a9d/tests/xmlrpcapi/non_object_calls_test.py
===================================================================
--- cobbler-3.0.0+git20190222.9e502a9d.orig/tests/xmlrpcapi/non_object_calls_test.py
+++ cobbler-3.0.0+git20190222.9e502a9d/tests/xmlrpcapi/non_object_calls_test.py
@@ -1,171 +1,165 @@
-import unittest
+import pytest
 import time
 import re
-from .cobbler_xmlrpc_base_test import CobblerXmlRpcBaseTest
-from cobbler.remote import EVENT_COMPLETE
 
 TEST_POWER_MANAGEMENT = True
 TEST_SYSTEM = ""
 
 
-class TestNonObjectCalls(CobblerXmlRpcBaseTest):
+@pytest.mark.usefixtures("cobbler_xmlrpc_base")
+class TestNonObjectCalls:
 
     # TODO: Obsolete this method via a unittest method
-    def _wait_task_end(self, tid):
+    def _wait_task_end(self, tid, remote):
         """
         Wait until a task is finished
         """
 
         timeout = 0
-        while self.remote.get_task_status(tid)[2] != EVENT_COMPLETE:
-            print("task %s status: %s" % (tid, self.remote.get_task_status(tid)))
+        # "complete" is the constant: EVENT_COMPLETE from cobbler.remote
+        while remote.get_task_status(tid)[2] != "complete":
+            print("task %s status: %s" % (tid, remote.get_task_status(tid)))
             time.sleep(5)
             timeout += 5
             if timeout == 60:
                 raise Exception
 
-    def test_token(self):
+    def test_token(self, token):
         """
         Test: authentication token validation
         """
 
-        assert self.token not in ("", None)
+        assert token not in ("", None)
 
-    def test_get_user_from_token(self):
+    def test_get_user_from_token(self, remote, token):
         """
         Test: get user data from authentication token
         """
 
-        self.assertTrue(self.remote.get_user_from_token(self.token))
+        assert remote.get_user_from_token(token)
 
-    def test_check(self):
+    def test_check(self, remote, token):
         """
         Test: check Cobbler status
         """
 
-        self.assertTrue(self.remote.check(self.token))
+        assert remote.check(token)
 
-    def test_last_modified_time(self):
+    def test_last_modified_time(self, remote, token):
         """
         Test: get last modification time
         """
 
-        assert self.remote.last_modified_time(self.token) != 0
+        assert remote.last_modified_time(token) != 0
 
-    def test_power_system(self):
+    def test_power_system(self, remote, token):
         """
         Test: reboot a system
         """
 
         if TEST_SYSTEM and TEST_POWER_MANAGEMENT:
-            tid = self.remote.background_power_system({"systems": [TEST_SYSTEM],
-                                                       "power": "reboot"},
-                                                      self.token)
-            self._wait_task_end(tid)
+            tid = remote.background_power_system({"systems": [TEST_SYSTEM], "power": "reboot"}, token)
+            self._wait_task_end(tid, remote)
 
-    def test_sync(self):
+    def test_sync(self, remote, token):
         """
         Test: synchronize Cobbler internal data with managed services
         (dhcp, tftp, dns)
         """
 
-        tid = self.remote.background_sync({}, self.token)
-        events = self.remote.get_events(self.token)
+        tid = remote.background_sync({}, token)
+        events = remote.get_events(token)
 
-        self.assertTrue(len(events) > 0)
+        assert len(events) > 0
 
-        self._wait_task_end(tid)
+        self._wait_task_end(tid, remote)
 
-        event_log = self.remote.get_event_log(tid)
+        event_log = remote.get_event_log(tid)
 
-    def test_get_kickstart_templates(self):
+    def test_get_autoinstall_templates(self, remote, token):
         """
-        Test: get kickstart templates
+        Test: get autoinstall templates
         """
 
-        result = self.remote.get_kickstart_templates()
-        self.assertTrue(len(result) > 0)
+        result = remote.get_autoinstall_templates(token)
+        assert len(result) > 0
 
-    def test_get_snippets(self):
+    def test_get_autoinstall_snippets(self, remote, token):
         """
-        Test: get snippets
+        Test: get autoinstall snippets
         """
 
-        result = self.remote.get_snippets(self.token)
-        self.assertTrue(len(result) > 0)
+        result = remote.get_autoinstall_snippets(token)
+        assert len(result) > 0
 
-    def test_generate_kickstart(self):
+    def test_generate_autoinstall(self, remote):
         """
-        Test: generate kickstart content
+        Test: generate autoinstall content
         """
 
         if TEST_SYSTEM:
-            self.remote.generate_kickstart(None, TEST_SYSTEM)
+            remote.generate_autoinstall(None, TEST_SYSTEM)
 
-    def test_generate_gpxe(self):
+    def test_generate_gpxe(self, remote):
         """
         Test: generate GPXE file content
         """
 
         if TEST_SYSTEM:
-            self.remote.generate_gpxe(None, TEST_SYSTEM)
+            remote.generate_gpxe(None, TEST_SYSTEM)
 
-    def test_generate_bootcfg(self):
+    def test_generate_bootcfg(self, remote):
         """
         Test: generate boot loader configuration file content
         """
 
         if TEST_SYSTEM:
-            self.remote.generate_bootcfg(None, TEST_SYSTEM)
+            remote.generate_bootcfg(None, TEST_SYSTEM)
 
-    def test_get_settings(self):
+    def test_get_settings(self, remote, token):
         """
         Test: get settings
         """
 
-        self.remote.get_settings(self.token)
+        remote.get_settings(token)
 
-    def test_get_signatures(self):
+    def test_get_signatures(self, remote, token):
         """
         Test: get distro signatures
         """
 
-        self.remote.get_signatures(self.token)
+        remote.get_signatures(token)
 
-    def test_get_valid_breeds(self):
+    def test_get_valid_breeds(self, remote, token):
         """
         Test: get valid OS breeds
         """
 
-        breeds = self.remote.get_valid_breeds(self.token)
-        self.assertTrue(len(breeds) > 0)
+        breeds = remote.get_valid_breeds(token)
+        assert len(breeds) > 0
 
-    def test_get_valid_os_versions_for_breed(self):
+    def test_get_valid_os_versions_for_breed(self, remote, token):
         """
         Test: get valid OS versions for a OS breed
         """
 
-        versions = self.remote.get_valid_os_versions_for_breed("generic", self.token)
-        self.assertTrue(len(versions) > 0)
+        versions = remote.get_valid_os_versions_for_breed("generic", token)
+        assert len(versions) > 0
 
-    def test_get_valid_os_versions(self):
+    def test_get_valid_os_versions(self, remote, token):
         """
         Test: get valid OS versions
         """
 
-        versions = self.remote.get_valid_os_versions(self.token)
-        self.assertTrue(len(versions) > 0)
+        versions = remote.get_valid_os_versions(token)
+        assert len(versions) > 0
 
-    def test_get_random_mac(self):
+    def test_get_random_mac(self, remote, token):
         """
         Test: get a random mac for a virtual network interface
         """
 
-        mac = self.remote.get_random_mac("xen", self.token)
+        mac = remote.get_random_mac("xen", token)
         hexa = "[0-9A-Fa-f]{2}"
         match_obj = re.match("%s:%s:%s:%s:%s:%s" % (hexa, hexa, hexa, hexa, hexa, hexa), mac)
-        self.assertTrue(match_obj)
-
-
-if __name__ == '__main__':
-    unittest.main()
+        assert match_obj
Index: cobbler-3.0.0+git20190222.9e502a9d/tests/xmlrpcapi/package_test.py
===================================================================
--- cobbler-3.0.0+git20190222.9e502a9d.orig/tests/xmlrpcapi/package_test.py
+++ cobbler-3.0.0+git20190222.9e502a9d/tests/xmlrpcapi/package_test.py
@@ -1,6 +1,4 @@
-import unittest
-from .cobbler_xmlrpc_base_test import CobblerXmlRpcBaseTest
-
+import pytest
 
 """
 Order is important currently:
@@ -14,68 +12,104 @@ self._remove_package()
 """
 
 
-class TestPackage(CobblerXmlRpcBaseTest):
+@pytest.fixture()
+def create_package(remote, token):
+    """
+    Adds a "testpackage0" for a test.
+    :param remote: See the correesponding fixture.
+    :param token: See the correesponding fixture.
+    """
+    package = remote.new_package(token)
+    remote.modify_package(package, "name", "testpackage0", token)
+    remote.save_package(package, token)
+
+
+@pytest.fixture()
+def remove_package(remote, token):
+    """
+    Removes a "testpackage0" for a test.
+    :param remote: See the correesponding fixture.
+    :param token: See the correesponding fixture.
+    """
+    yield
+    remote.remove_package("testpackage0", token)
+
 
-    def test_create_package(self):
+@pytest.mark.usefixtures("cobbler_xmlrpc_base")
+class TestPackage:
+
+    @pytest.mark.usefixtures("remove_package")
+    def test_create_package(self, remote, token):
         """
         Test: create/edit a package object
         """
 
-        packages = self.remote.get_packages(self.token)
-        package = self.remote.new_package(self.token)
+        packages = remote.get_packages(token)
+        package = remote.new_package(token)
 
-        self.assertTrue(self.remote.modify_package(package, "name", "testpackage0", self.token))
-        self.assertTrue(self.remote.save_package(package, self.token))
+        assert remote.modify_package(package, "name", "testpackage0", token)
+        assert remote.save_package(package, token)
 
-        new_packages = self.remote.get_packages(self.token)
-        self.assertTrue(len(new_packages) == len(packages) + 1)
+        new_packages = remote.get_packages(token)
+        assert len(new_packages) == len(packages) + 1
 
-    def test_get_packages(self):
+    @pytest.mark.usefixtures("create_package", "remove_package")
+    def test_get_packages(self, remote, token):
         """
         Test: Get packages
         """
 
-        package = self.remote.get_packages()
+        package = remote.get_packages()
 
-    def test_get_package(self):
+    @pytest.mark.usefixtures("create_package", "remove_package")
+    def test_get_package(self, remote):
         """
         Test: Get a package object
         """
 
-        package = self.remote.get_package("testpackage0")
+        package = remote.get_package("testpackage0")
 
-    def test_find_package(self):
+    @pytest.mark.usefixtures("create_package", "remove_package")
+    def test_find_package(self, remote, token):
         """
         Test: find a package object
         """
 
-        result = self.remote.find_package({"name": "testpackage0"}, self.token)
-        self.assertTrue(result)
+        result = remote.find_package({"name": "testpackage0"}, token)
+        assert result
 
-    def test_copy_package(self):
+    @pytest.mark.usefixtures("create_package", "remove_package")
+    def test_copy_package(self, remote, token):
         """
         Test: copy a package object
         """
+        # Arrange --> Done in fixture
+
+        # Act
+        package = remote.get_item_handle("package", "testpackage0", token)
+        result = remote.copy_package(package, "testpackagecopy", token)
 
-        package = self.remote.get_item_handle("package", "testpackage0", self.token)
-        self.assertTrue(self.remote.copy_package(package, "testpackagecopy", self.token))
+        # Assert
+        assert result
 
-    def test_rename_package(self):
+        # Cleanup
+        remote.remove_package("testpackagecopy", token)
+
+    @pytest.mark.usefixtures("create_package", "remove_package")
+    def test_rename_package(self, remote, token):
         """
         Test: rename a package object
         """
 
-        package = self.remote.get_item_handle("package", "testpackagecopy", self.token)
-        self.assertTrue(self.remote.rename_package(package, "testpackage1", self.token))
+        package = remote.get_item_handle("package", "testpackage0", token)
+        assert remote.rename_package(package, "testpackage1", token)
+        package = remote.get_item_handle("package", "testpackage1", token)
+        assert remote.rename_package(package, "testpackage0", token)
 
-    def test_remove_package(self):
+    @pytest.mark.usefixtures("create_package")
+    def test_remove_package(self, remote, token):
         """
         Test: remove a package object
         """
 
-        self.assertTrue(self.remote.remove_package("testpackage0", self.token))
-        self.assertTrue(self.remote.remove_package("testpackage1", self.token))
-
-
-if __name__ == '__main__':
-    unittest.main()
+        assert remote.remove_package("testpackage0", token)
Index: cobbler-3.0.0+git20190222.9e502a9d/tests/xmlrpcapi/repo_test.py
===================================================================
--- cobbler-3.0.0+git20190222.9e502a9d.orig/tests/xmlrpcapi/repo_test.py
+++ cobbler-3.0.0+git20190222.9e502a9d/tests/xmlrpcapi/repo_test.py
@@ -1,127 +1,131 @@
-import unittest
 import pytest
 
-from .cobbler_xmlrpc_base_test import CobblerXmlRpcBaseTest
 
-
-"""
-Order is currently important:
-self._get_repos()
-self._create_repo()
-self._get_repo()
-self._find_repo()
-self._copy_repo()
-self._rename_repo()
-self._remove_repo()
-"""
-
-
-class TestRepo(CobblerXmlRpcBaseTest):
-
-    @pytest.fixture
-    def createRepo(self):
-        repo = self.remote.new_repo(self.token)
-        self.remote.modify_repo(repo, "name", "testrepo0", self.token)
-        self.remote.modify_repo(repo, "mirror", "http://www.sample.com/path/to/some/repo", self.token)
-        self.remote.modify_repo(repo, "mirror_locally", "0", self.token)
-        self.remote.save_repo(repo, self.token)
-
-    def test_create_repo(self):
+@pytest.fixture
+def create_repo(remote, token):
+    """
+    Creates a Repository "testrepo0" with a mirror "http://www.sample.com/path/to/some/repo" and the attribute
+    "mirror_locally=0".
+    """
+    repo = remote.new_repo(token)
+    remote.modify_repo(repo, "name", "testrepo0", token)
+    remote.modify_repo(repo, "mirror", "http://www.sample.com/path/to/some/repo", token)
+    remote.modify_repo(repo, "mirror_locally", "0", token)
+    remote.save_repo(repo, token)
+
+
+@pytest.mark.usefixtures("cobbler_xmlrpc_base")
+class TestRepo:
+    def test_create_repo(self, remote, token):
         """
         Test: create/edit a repo object
         """
 
-        # TODO: Arrange
+        # Arrange --> Nothing to arrange
 
-        # Act
-        repo = self.remote.new_repo(self.token)
-        self.assertTrue(self.remote.modify_repo(repo, "name", "testrepo0", self.token))
-        self.assertTrue(self.remote.modify_repo(repo, "mirror", "http://www.sample.com/path/to/some/repo", self.token))
-        self.assertTrue(self.remote.modify_repo(repo, "mirror_locally", "0", self.token))
-        self.assertTrue(self.remote.save_repo(repo, self.token))
+        # Act & Assert
+        repo = remote.new_repo(token)
+        assert remote.modify_repo(repo, "name", "testrepo0", token)
+        assert remote.modify_repo(repo, "mirror", "http://www.sample.com/path/to/some/repo", token)
+        assert remote.modify_repo(repo, "mirror_locally", "0", token)
+        assert remote.save_repo(repo, token)
 
-        # TODO: Assert
+        # Cleanup
+        remote.remove_repo("testrepo0", token)
 
-    def test_get_repos(self):
+    def test_get_repos(self, remote):
         """
         Test: Get repos
         """
 
-        # TODO: Arrange
+        # Arrange --> Nothing to do
 
         # Act
-        self.remote.get_repos()
+        result = remote.get_repos()
 
-        # TODO: Assert
+        # Assert
+        assert result == []
 
-    def test_get_repo(self):
+    @pytest.mark.usefixtures("create_repo")
+    def test_get_repo(self, remote, token):
         """
         Test: Get a repo object
         """
 
-        # TODO: Arrange --> Place file under "/var/lib/coobler/collections/repos/?"
+        # Arrange --> Done in fixture
 
         # Act
-        repo = self.remote.get_repo("testrepo0")
+        repo = remote.get_repo("testrepo0")
+
+        # Assert
+        assert repo.get("name") == "testrepo0"
 
-        # TODO: Assert
-        # TODO: Cleanup
+        # Cleanup
+        remote.remove_repo("testrepo0", token)
 
-    def test_find_repo(self, createRepo):
+    @pytest.mark.usefixtures("create_repo")
+    def test_find_repo(self, remote, token):
         """
         Test: find a repo object
         """
 
-        # TODO: Arrange
+        # Arrange --> Done in fixture
 
         # Act
-        result = self.remote.find_repo({"name": "testrepo0"}, self.token)
+        result = remote.find_repo({"name": "testrepo0"}, token)
 
         # Assert
-        self.assertTrue(result)
-        # TODO: Cleanup
+        assert result
 
-    def test_copy_repo(self, createRepo):
+        # Cleanup
+        remote.remove_repo("testrepo0", token)
+
+    @pytest.mark.usefixtures("create_repo")
+    def test_copy_repo(self, remote, token):
         """
         Test: copy a repo object
         """
 
-        # TODO: Arrange
+        # Arrange --> Done in fixture
 
         # Act
-        repo = self.remote.get_item_handle("repo", "testrepo0", self.token)
+        repo = remote.get_item_handle("repo", "testrepo0", token)
 
         # Assert
-        self.assertTrue(self.remote.copy_repo(repo, "testrepocopy", self.token))
-        # TODO: Cleanup
+        assert remote.copy_repo(repo, "testrepocopy", token)
+
+        # Cleanup
+        remote.remove_repo("testrepo0", token)
+        remote.remove_repo("testrepocopy", token)
 
-    def test_rename_repo(self, createRepo):
+    @pytest.mark.usefixtures("create_repo")
+    def test_rename_repo(self, remote, token):
         """
         Test: rename a repo object
         """
 
-        # TODO: Arrange
+        # Arrange
 
         # Act
-        repo = self.remote.get_item_handle("repo", "testrepo0", self.token)
+        repo = remote.get_item_handle("repo", "testrepo0", token)
+        result = remote.rename_repo(repo, "testrepo1", token)
 
         # Assert
-        self.assertTrue(self.remote.rename_repo(repo, "testrepo1", self.token))
-        # TODO: Cleanup
+        assert result
+
+        # Cleanup
+        remote.remove_repo("testrepo1", token)
 
-    def test_remove_repo(self, createRepo):
+    @pytest.mark.usefixtures("create_repo")
+    def test_remove_repo(self, remote, token):
         """
         Test: remove a repo object
         """
 
-        # TODO: Arrange
+        # Arrange --> Done in fixture
 
         # Act
-        result = self.remote.remove_repo("testrepo0", self.token)
+        result = remote.remove_repo("testrepo0", token)
 
-        # TODO: Assert
-        self.assertTrue(result)
-
-
-if __name__ == '__main__':
-    unittest.main()
+        # Assert
+        assert result
openSUSE Build Service is sponsored by