[Piglit] [PATCH 40/49] unittests: Port junit_backends_tests to pytest

Dylan Baker dylan at pnwbakers.com
Fri Jul 29 18:39:26 UTC 2016


Signed-off-by: Dylan Baker <dylanx.c.baker at intel.com>
---
 .../{ => framework/backends}/schema/junit-7.xsd    |   0
 unittests/framework/backends/test_junit.py         | 255 ++++++++++++++++
 unittests/junit_backends_tests.py                  | 335 ---------------------
 3 files changed, 255 insertions(+), 335 deletions(-)
 rename unittests/{ => framework/backends}/schema/junit-7.xsd (100%)
 create mode 100644 unittests/framework/backends/test_junit.py
 delete mode 100644 unittests/junit_backends_tests.py

diff --git a/unittests/schema/junit-7.xsd b/unittests/framework/backends/schema/junit-7.xsd
similarity index 100%
rename from unittests/schema/junit-7.xsd
rename to unittests/framework/backends/schema/junit-7.xsd
diff --git a/unittests/framework/backends/test_junit.py b/unittests/framework/backends/test_junit.py
new file mode 100644
index 0000000..a8443db
--- /dev/null
+++ b/unittests/framework/backends/test_junit.py
@@ -0,0 +1,255 @@
+# Copyright (c) 2014, 2016 Intel Corporation
+
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+"""Tests for the Junit backend package."""
+
+from __future__ import (
+    absolute_import, division, print_function, unicode_literals
+)
+import os
+import textwrap
+try:
+    from lxml import etree
+except ImportError:
+    import xml.etree.cElementTree as etree
+try:
+    import mock
+except ImportError:
+    from unittest import mock
+
+import pytest
+import six
+
+from framework import backends
+from framework import grouptools
+from framework import results
+from framework import status
+
+from . import shared
+
+# pylint: disable=no-self-use
+
+JUNIT_SCHEMA = os.path.join(os.path.dirname(__file__), 'schema', 'junit-7.xsd')
+
+_XML = """\
+<?xml version='1.0' encoding='utf-8'?>
+  <testsuites>
+    <testsuite name="piglit" tests="1">
+      <testcase classname="piglit.foo.bar" name="a-test" status="pass" time="1.12345">
+        <system-out>this/is/a/command\nThis is stdout</system-out>
+        <system-err>this is stderr
+
+pid: 1934
+time start: 1.0
+time end: 4.5
+        </system-err>
+      </testcase>
+    </testsuite>
+  </testsuites>
+"""
+
+ at pytest.yield_fixture(autouse=True, scope="module")
+def mock_compression():
+    with mock.patch('framework.backends.compression.get_mode',
+                    mock.Mock(return_value='none')):
+        yield
+
+
+class TestProtectedLoad(object):
+    """Tests for the _load method."""
+
+    def test_default_name(self, tmpdir):
+        """backends.junit._load: uses 'junit result' for name as fallback."""
+        tmpdir.chdir()
+        with open('results.xml', 'w') as f:
+            f.write(_XML)
+        test = backends.junit.REGISTRY.load('results.xml', 'none')
+
+        assert test.name == 'junit result'
+
+    def test_file_name(self, tmpdir):
+        """backends.junit._load: uses the filename for name if filename !=
+        'results'
+        """
+        p = tmpdir.join('foobar.xml')
+        p.write(_XML)
+        test = backends.junit.REGISTRY.load(six.text_type(p), 'none')
+        assert test.name == 'foobar'
+
+    def test_folder_name(self, tmpdir):
+        """backends.junit._load: uses the folder name if the result is
+        'results.'
+        """
+        tmpdir.mkdir('foo')
+        p = tmpdir.join('foo', 'results.xml')
+        p.write(_XML)
+        test = backends.junit.REGISTRY.load(six.text_type(p), 'none')
+
+        assert test.name == 'foo'
+
+    class TestReturned(object):
+        """Test that the returned object is as expected."""
+
+        testname = grouptools.join('foo', 'bar', 'a-test')
+
+        @pytest.fixture
+        def result(self, tmpdir):
+            p = tmpdir.join('test.xml')
+            p.write(_XML)
+            return backends.junit._load(six.text_type(p))
+
+        def test_testrunresult(self, result):
+            """backends.junit._load: returns a TestrunResult instance."""
+            assert isinstance(result, results.TestrunResult)
+
+        def test_replace_sep(self, result):
+            """backends.junit._load: replaces '.' with grouptools.SEPARATOR."""
+            assert self.testname in result.tests
+
+        def test_testresult_instance(self, result):
+            """backends.junit._load: replaces result with TestResult instance.
+            """
+            assert isinstance(result.tests[self.testname], results.TestResult)
+
+        def test_status_instance(self, result):
+            """backends.junit._load: a status is found and loaded."""
+            assert isinstance(result.tests[self.testname].result,
+                              status.Status)
+
+        def test_time(self, result):
+            time = result.tests[self.testname].time
+            assert isinstance(time, results.TimeAttribute)
+            assert time.start == 1.0
+            assert time.end == 4.5
+
+        def test_command(self, result):
+            """backends.junit._load: command is loaded correctly."""
+            assert result.tests[self.testname].command == 'this/is/a/command'
+
+        def test_out(self, result):
+            """backends.junit._load: stdout is loaded correctly."""
+            assert result.tests[self.testname].out == 'This is stdout'
+
+        def test_err(self, result):
+            """backends.junit._load: stderr is loaded correctly."""
+            expected = textwrap.dedent("""\
+                this is stderr
+
+                pid: 1934
+                time start: 1.0
+                time end: 4.5""")
+            assert result.tests[self.testname].err.strip() == expected
+
+        def test_totals(self, result):
+            """backends.junit._load: Totals are calculated."""
+            assert bool(result)
+
+        def test_pid(self, result):
+            """backends.junit._load: pid is loaded correctly."""
+            assert result.tests[self.testname].pid == 1934
+
+
+class TestJUnitBackend(object):
+    """Tests for the JUnitBackend class."""
+
+    class TestFinalize(object):
+        """Tests for the finalize method."""
+
+        def test_skips_illformed_tests(self, tmpdir):
+            """backends.junit.JUnitBackend: skips illformed tests"""
+            result = results.TestResult()
+            result.time.end = 1.2345
+            result.result = 'pass'
+            result.out = 'this is stdout'
+            result.err = 'this is stderr'
+            result.command = 'foo'
+
+            test = backends.junit.JUnitBackend(six.text_type(tmpdir))
+            test.initialize(shared.INITIAL_METADATA)
+            with test.write_test(grouptools.join('a', 'group', 'test1')) as t:
+                t(result)
+            tmpdir.join('tests', '1.xml').write('bad data')
+
+            test.finalize()
+
+    class TestWriteTest(object):
+        """Tests for the write_test method."""
+
+        def test_junit_replace(self, tmpdir):
+            """backends.junit.JUnitBackend.write_test: grouptools.SEPARATOR is
+            replaced with '.'.
+            """
+            result = results.TestResult()
+            result.time.end = 1.2345
+            result.result = 'pass'
+            result.out = 'this is stdout'
+            result.err = 'this is stderr'
+            result.command = 'foo'
+
+            test = backends.junit.JUnitBackend(six.text_type(tmpdir))
+            test.initialize(shared.INITIAL_METADATA)
+            with test.write_test(grouptools.join('a', 'group', 'test1')) as t:
+                t(result)
+            test.finalize()
+
+            test_value = etree.parse(six.text_type(tmpdir.join('results.xml')))
+            test_value = test_value.getroot()
+
+            assert test_value.find('.//testcase').attrib['classname'] == \
+                'piglit.a.group'
+
+    class TestValid(object):
+        @pytest.fixture
+        def test_file(self, tmpdir):
+            tmpdir.mkdir('foo')
+            p = tmpdir.join('foo')
+
+            result = results.TestResult()
+            result.time.end = 1.2345
+            result.result = 'pass'
+            result.out = 'this is stdout'
+            result.err = 'this is stderr'
+            result.command = 'foo'
+            result.pid = 1034
+
+            test = backends.junit.JUnitBackend(six.text_type(p))
+            test.initialize(shared.INITIAL_METADATA)
+            with test.write_test(grouptools.join('a', 'group', 'test1')) as t:
+                t(result)
+
+            result.result = 'fail'
+            with test.write_test(grouptools.join('a', 'test', 'test1')) as t:
+                t(result)
+            test.finalize()
+
+            return six.text_type(p.join('results.xml'))
+
+        def test_xml_well_formed(self, test_file):
+            """backends.junit.JUnitBackend.write_test: produces well formed xml."""
+            etree.parse(test_file)
+
+        @pytest.mark.skipif(etree.__name__ != 'lxml.etree',
+                            reason="This test requires lxml")
+        def test_xml_valid(self, test_file):
+            """backends.junit.JUnitBackend.write_test: produces valid JUnit xml."""
+            # This XMLSchema class is unique to lxml
+            schema = etree.XMLSchema(file=JUNIT_SCHEMA)  # pylint: disable=no-member
+            with open(test_file, 'r') as f:
+                assert schema.validate(etree.parse(f))
diff --git a/unittests/junit_backends_tests.py b/unittests/junit_backends_tests.py
deleted file mode 100644
index 4e5100d..0000000
--- a/unittests/junit_backends_tests.py
+++ /dev/null
@@ -1,335 +0,0 @@
-# Copyright (c) 2014 Intel Corporation
-
-# Permission is hereby granted, free of charge, to any person obtaining a copy
-# of this software and associated documentation files (the "Software"), to deal
-# in the Software without restriction, including without limitation the rights
-# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-# copies of the Software, and to permit persons to whom the Software is
-# furnished to do so, subject to the following conditions:
-
-# The above copyright notice and this permission notice shall be included in
-# all copies or substantial portions of the Software.
-
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-# SOFTWARE.
-
-# pylint: disable=missing-docstring
-
-""" Tests for the backend package """
-
-from __future__ import (
-    absolute_import, division, print_function, unicode_literals
-)
-import os
-
-try:
-    from lxml import etree
-except ImportError:
-    import xml.etree.cElementTree as etree
-import nose.tools as nt
-
-from framework import results, backends, grouptools, status
-from . import utils
-
-BACKEND_INITIAL_META = {
-    'name': 'name',
-    'test_count': 0,
-    'env': {},
-}
-
-JUNIT_SCHEMA = os.path.join(os.path.dirname(__file__), 'schema', 'junit-7.xsd')
-
-doc_formatter = utils.nose.DocFormatter({'separator': grouptools.SEPARATOR})
-
-_XML = """\
-<?xml version='1.0' encoding='utf-8'?>
-  <testsuites>
-    <testsuite name="piglit" tests="1">
-      <testcase classname="piglit.foo.bar" name="a-test" status="pass" time="1.12345">
-        <system-out>this/is/a/command\nThis is stdout</system-out>
-        <system-err>this is stderr
-
-pid: 1934
-time start: 1.0
-time end: 4.5
-        </system-err>
-      </testcase>
-    </testsuite>
-  </testsuites>
-"""
-
-
-def setup_module():
-    utils.piglit.set_compression('none')
-
-
-def teardown_module():
-    utils.piglit.unset_compression()
-
-
-class TestJunitNoTests(utils.nose.StaticDirectory):
-    @classmethod
-    def setup_class(cls):
-        super(TestJunitNoTests, cls).setup_class()
-        test = backends.junit.JUnitBackend(cls.tdir)
-        test.initialize(BACKEND_INITIAL_META)
-        test.finalize()
-        cls.test_file = os.path.join(cls.tdir, 'results.xml')
-
-    @utils.nose.no_error
-    def test_xml_well_formed(self):
-        """backends.junit.JUnitBackend: initialize and finalize produce well formed xml
-
-        While it will produce valid XML, it cannot produc valid JUnit, since
-        JUnit requires at least one test to be valid
-
-        """
-        etree.parse(self.test_file)
-
-
-class TestJUnitSingleTest(TestJunitNoTests):
-    @classmethod
-    def setup_class(cls):
-        super(TestJUnitSingleTest, cls).setup_class()
-        cls.test_file = os.path.join(cls.tdir, 'results.xml')
-
-        result = results.TestResult()
-        result.time.end = 1.2345
-        result.result = 'pass'
-        result.out = 'this is stdout'
-        result.err = 'this is stderr'
-        result.command = 'foo'
-        result.pid = 1034
-
-        test = backends.junit.JUnitBackend(cls.tdir)
-        test.initialize(BACKEND_INITIAL_META)
-        with test.write_test(grouptools.join('a', 'test', 'group', 'test1')) as t:
-            t(result)
-        test.finalize()
-
-    def test_xml_well_formed(self):
-        """backends.junit.JUnitBackend.write_test(): (once) produces well formed xml"""
-        super(TestJUnitSingleTest, self).test_xml_well_formed()
-
-    @utils.nose.Skip.module('lxml', available=True)
-    def test_xml_valid(self):
-        """backends.junit.JUnitBackend.write_test(): (once) produces valid xml"""
-        schema = etree.XMLSchema(file=JUNIT_SCHEMA)
-        with open(self.test_file, 'r') as f:
-            nt.ok_(schema.validate(etree.parse(f)), msg='xml is not valid')
-
-
-class TestJUnitMultiTest(TestJUnitSingleTest):
-    @classmethod
-    def setup_class(cls):
-        super(TestJUnitMultiTest, cls).setup_class()
-
-        result = results.TestResult()
-        result.time.end = 1.2345
-        result.result = 'pass'
-        result.out = 'this is stdout'
-        result.err = 'this is stderr'
-        result.command = 'foo'
-        result.pid = 1034
-
-        cls.test_file = os.path.join(cls.tdir, 'results.xml')
-        test = backends.junit.JUnitBackend(cls.tdir)
-        test.initialize(BACKEND_INITIAL_META)
-        with test.write_test(grouptools.join('a', 'test', 'group', 'test1')) as t:
-            t(result)
-
-        result.result = 'fail'
-        with test.write_test(
-                grouptools.join('a', 'different', 'test', 'group', 'test2')) as t:
-            t(result)
-        test.finalize()
-
-    def test_xml_well_formed(self):
-        """backends.junit.JUnitBackend.write_test(): (twice) produces well formed xml"""
-        super(TestJUnitMultiTest, self).test_xml_well_formed()
-
-    def test_xml_valid(self):
-        """backends.junit.JUnitBackend.write_test(): (twice) produces valid xml"""
-        super(TestJUnitMultiTest, self).test_xml_valid()
-
-
- at doc_formatter
-def test_junit_replace():
-    """backends.junit.JUnitBackend.write_test(): '{separator}' is replaced with '.'"""
-    with utils.nose.tempdir() as tdir:
-        result = results.TestResult()
-        result.time.end = 1.2345
-        result.result = 'pass'
-        result.out = 'this is stdout'
-        result.err = 'this is stderr'
-        result.command = 'foo'
-
-        test = backends.junit.JUnitBackend(tdir)
-        test.initialize(BACKEND_INITIAL_META)
-        with test.write_test(grouptools.join('a', 'test', 'group', 'test1')) as t:
-            t(result)
-        test.finalize()
-
-        test_value = etree.parse(os.path.join(tdir, 'results.xml')).getroot()
-
-    nt.assert_equal(test_value.find('.//testcase').attrib['classname'],
-                    'piglit.a.test.group')
-
-
- at utils.nose.not_raises(etree.ParseError)
-def test_junit_skips_bad_tests():
-    """backends.junit.JUnitBackend: skips illformed tests"""
-    with utils.nose.tempdir() as tdir:
-        result = results.TestResult()
-        result.time.end = 1.2345
-        result.result = 'pass'
-        result.out = 'this is stdout'
-        result.err = 'this is stderr'
-        result.command = 'foo'
-
-        test = backends.junit.JUnitBackend(tdir)
-        test.initialize(BACKEND_INITIAL_META)
-        with test.write_test(grouptools.join('a', 'test', 'group', 'test1')) as t:
-            t(result)
-        with open(os.path.join(tdir, 'tests', '1.xml'), 'w') as f:
-            f.write('bad data')
-
-        test.finalize()
-
-
-class TestJUnitLoad(utils.nose.StaticDirectory):
-    """Methods that test loading JUnit results."""
-    __instance = None
-
-    @classmethod
-    def setup_class(cls):
-        super(TestJUnitLoad, cls).setup_class()
-        cls.xml_file = os.path.join(cls.tdir, 'results.xml')
-
-        with open(cls.xml_file, 'w') as f:
-            f.write(_XML)
-
-        cls.testname = grouptools.join('foo', 'bar', 'a-test')
-
-    @classmethod
-    def xml(cls):
-        if cls.__instance is None:
-            cls.__instance = backends.junit._load(cls.xml_file)
-        return cls.__instance
-
-    @utils.nose.no_error
-    def test_no_errors(self):
-        """backends.junit._load: Raises no errors for valid junit."""
-        self.xml()
-
-    def test_return_testrunresult(self):
-        """backends.junit._load: returns a TestrunResult instance"""
-        nt.assert_is_instance(self.xml(), results.TestrunResult)
-
-    @doc_formatter
-    def test_replace_sep(self):
-        """backends.junit._load: replaces '.' with '{separator}'"""
-        nt.assert_in(self.testname, self.xml().tests)
-
-    def test_testresult_instance(self):
-        """backends.junit._load: replaces result with TestResult instance."""
-        nt.assert_is_instance(self.xml().tests[self.testname], results.TestResult)
-
-    def test_status_instance(self):
-        """backends.junit._load: a status is found and loaded."""
-        nt.assert_is_instance(self.xml().tests[self.testname].result,
-                              status.Status)
-
-    def test_time_start(self):
-        """backends.junit._load: Time.start is loaded correctly."""
-        time = self.xml().tests[self.testname].time
-        nt.assert_is_instance(time, results.TimeAttribute)
-        nt.eq_(time.start, 1.0)
-
-    def test_time_end(self):
-        """backends.junit._load: Time.end is loaded correctly."""
-        time = self.xml().tests[self.testname].time
-        nt.assert_is_instance(time, results.TimeAttribute)
-        nt.eq_(time.end, 4.5)
-
-    def test_command(self):
-        """backends.junit._load: command is loaded correctly."""
-        test = self.xml().tests[self.testname].command
-        nt.assert_equal(test, 'this/is/a/command')
-
-    def test_out(self):
-        """backends.junit._load: stdout is loaded correctly."""
-        test = self.xml().tests[self.testname].out
-        nt.assert_equal(test, 'This is stdout')
-
-    def test_err(self):
-        """backends.junit._load: stderr is loaded correctly."""
-        test = self.xml().tests[self.testname].err
-        expected = ('this is stderr\n\n'
-                    'pid: 1934\n'
-                    'time start: 1.0\n'
-                    'time end: 4.5\n'
-                    '        ')
-        nt.eq_(test, expected)
-
-    def test_totals(self):
-        """backends.junit._load: Totals are calculated."""
-        nt.ok_(bool(self.xml()))
-
-    def test_pid(self):
-        """backends.junit._load: pid is loaded correctly."""
-        test = self.xml().tests[self.testname].pid
-        nt.eq_(test, 1934)
-
-
-    @utils.nose.no_error
-    def test_load_file(self):
-        """backends.junit.load: Loads a file directly"""
-        backends.junit.REGISTRY.load(self.xml_file, 'none')
-
-    @utils.nose.no_error
-    def test_load_dir(self):
-        """backends.junit.load: Loads a directory"""
-        backends.junit.REGISTRY.load(self.tdir, 'none')
-
-
-def test_load_file_name():
-    """backends.junit._load: uses the filename for name if filename != 'results'
-    """
-    with utils.nose.tempdir() as tdir:
-        filename = os.path.join(tdir, 'foobar.xml')
-        with open(filename, 'w') as f:
-            f.write(_XML)
-
-        test = backends.junit.REGISTRY.load(filename, 'none')
-    nt.assert_equal(test.name, 'foobar')
-
-
-def test_load_folder_name():
-    """backends.junit._load: uses the folder name if the result is 'results'"""
-    with utils.nose.tempdir() as tdir:
-        os.mkdir(os.path.join(tdir, 'a cool test'))
-        filename = os.path.join(tdir, 'a cool test', 'results.xml')
-        with open(filename, 'w') as f:
-            f.write(_XML)
-
-        test = backends.junit.REGISTRY.load(filename, 'none')
-    nt.assert_equal(test.name, 'a cool test')
-
-
- at utils.nose.test_in_tempdir
-def test_load_default_name():
-    """backends.junit._load: uses 'junit result' for name as fallback"""
-    with utils.nose.tempdir() as tdir:
-        with utils.nose.chdir(tdir):
-            filename = 'results.xml'
-            with open(filename, 'w') as f:
-                f.write(_XML)
-            test = backends.junit.REGISTRY.load(filename, 'none')
-
-    nt.assert_equal(test.name, 'junit result')
-- 
2.9.0



More information about the Piglit mailing list