Create CaptureOutput fixture
Add a fixture for controlling whether or not stdout and stderr are captured as the test runs. Blueprint oslotest-refactor-test-base-class Change-Id: Ifa8d991c1a8e3ec643e5350d09fcb3895ac8378e
This commit is contained in:
parent
a7cd68519b
commit
9e7c3e99eb
@ -23,6 +23,12 @@ oslotest.moxstubout
|
||||
.. automodule:: oslotest.moxstubout
|
||||
:members:
|
||||
|
||||
oslotest.output
|
||||
===================
|
||||
|
||||
.. automodule:: oslotest.output
|
||||
:members:
|
||||
|
||||
oslotest.timeout
|
||||
================
|
||||
|
||||
|
@ -20,6 +20,7 @@ import os
|
||||
import tempfile
|
||||
|
||||
import fixtures
|
||||
from oslotest import output
|
||||
from oslotest import timeout
|
||||
|
||||
import six
|
||||
@ -101,12 +102,7 @@ class BaseTestCase(testtools.TestCase):
|
||||
self.useFixture(timeout.Timeout())
|
||||
|
||||
def _fake_output(self):
|
||||
if os.environ.get('OS_STDOUT_CAPTURE') in _TRUE_VALUES:
|
||||
stdout = self.useFixture(fixtures.StringStream('stdout')).stream
|
||||
self.useFixture(fixtures.MonkeyPatch('sys.stdout', stdout))
|
||||
if os.environ.get('OS_STDERR_CAPTURE') in _TRUE_VALUES:
|
||||
stderr = self.useFixture(fixtures.StringStream('stderr')).stream
|
||||
self.useFixture(fixtures.MonkeyPatch('sys.stderr', stderr))
|
||||
self.output_fixture = self.useFixture(output.CaptureOutput())
|
||||
|
||||
def _fake_logs(self):
|
||||
level = None
|
||||
|
55
oslotest/output.py
Normal file
55
oslotest/output.py
Normal file
@ -0,0 +1,55 @@
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
# not use this file except in compliance with the License. You may obtain
|
||||
# a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
import os
|
||||
|
||||
import fixtures
|
||||
|
||||
_TRUE_VALUES = ('True', 'true', '1', 'yes')
|
||||
|
||||
|
||||
class CaptureOutput(fixtures.Fixture):
|
||||
"""Optionally capture the output streams.
|
||||
|
||||
The behavior is managed through two environment variables. If
|
||||
``OS_STDOUT_CAPTURE`` is true then stdout is captured and if
|
||||
``OS_STDERR_CAPTURE`` is true then stderr is captured.
|
||||
|
||||
"True" values include ``True``, ``true``, ``1``, and ``yes``.
|
||||
|
||||
.. py:attribute:: stdout
|
||||
|
||||
The ``stream`` attribute from a :class:`StringStream` instance
|
||||
replacing stdout.
|
||||
|
||||
.. py:attribute:: stderr
|
||||
|
||||
The ``stream`` attribute from a :class:`StringStream` instance
|
||||
replacing stderr.
|
||||
|
||||
"""
|
||||
|
||||
def __init__(self):
|
||||
super(CaptureOutput, self).__init__()
|
||||
self.stdout = None
|
||||
self.stderr = None
|
||||
|
||||
def setUp(self):
|
||||
super(CaptureOutput, self).setUp()
|
||||
if os.environ.get('OS_STDOUT_CAPTURE') in _TRUE_VALUES:
|
||||
self._stdout_fixture = fixtures.StringStream('stdout')
|
||||
self.stdout = self.useFixture(self._stdout_fixture).stream
|
||||
self.useFixture(fixtures.MonkeyPatch('sys.stdout', self.stdout))
|
||||
if os.environ.get('OS_STDERR_CAPTURE') in _TRUE_VALUES:
|
||||
self._stderr_fixture = fixtures.StringStream('stderr')
|
||||
self.stderr = self.useFixture(self._stderr_fixture).stream
|
||||
self.useFixture(fixtures.MonkeyPatch('sys.stderr', self.stderr))
|
@ -99,6 +99,22 @@ class TestBaseTestCase(testtools.TestCase):
|
||||
# check that mock patches are cleaned up
|
||||
self.assertEqual(obj.value, obj.backup)
|
||||
|
||||
@mock.patch('os.environ')
|
||||
def test_capture_output_disabled(self, mock_env):
|
||||
mock_env.get.return_value = ''
|
||||
tc = self.FakeTestCase("test_fake_test")
|
||||
tc.setUp()
|
||||
self.assertIs(None, tc.output_fixture.stdout)
|
||||
self.assertIs(None, tc.output_fixture.stderr)
|
||||
|
||||
@mock.patch('os.environ')
|
||||
def test_enabled(self, mock_env):
|
||||
mock_env.get.return_value = 'True'
|
||||
tc = self.FakeTestCase("test_fake_test")
|
||||
tc.setUp()
|
||||
self.assertIsNot(None, tc.output_fixture.stdout)
|
||||
self.assertIsNot(None, tc.output_fixture.stderr)
|
||||
|
||||
|
||||
class TestManualMock(base.BaseTestCase):
|
||||
|
||||
|
43
tests/unit/test_output.py
Normal file
43
tests/unit/test_output.py
Normal file
@ -0,0 +1,43 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
# not use this file except in compliance with the License. You may obtain
|
||||
# a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
import sys
|
||||
|
||||
from oslotest import output
|
||||
|
||||
import mock
|
||||
import testtools
|
||||
|
||||
|
||||
class CaptureOutputTest(testtools.TestCase):
|
||||
|
||||
@mock.patch('os.environ')
|
||||
def test_disabled(self, mock_env):
|
||||
mock_env.get.return_value = ''
|
||||
f = output.CaptureOutput()
|
||||
f.setUp()
|
||||
self.assertIs(None, f.stdout)
|
||||
self.assertIs(None, f.stderr)
|
||||
self.assertIsNot(sys.stdout, f.stdout)
|
||||
self.assertIsNot(sys.stderr, f.stderr)
|
||||
|
||||
@mock.patch('os.environ')
|
||||
def test_enabled(self, mock_env):
|
||||
mock_env.get.return_value = 'True'
|
||||
f = output.CaptureOutput()
|
||||
f.setUp()
|
||||
self.assertIsNot(None, f.stdout)
|
||||
self.assertIsNot(None, f.stderr)
|
||||
self.assertIs(sys.stdout, f.stdout)
|
||||
self.assertIs(sys.stderr, f.stderr)
|
Loading…
x
Reference in New Issue
Block a user