Bug 1292300 - Make mock_runner fixture do more work; r=maja_zf

Remove some duplication in various tests by doing more
of that work in the `mock_runner` fixture, including:
- monkeypatch mozversion in the fixture so we don't have to
  patch mozversion.get_version in various places
- mock additional attributes needed for certain tests

Use the improved mock_runner fixture wherever
`runner.run_tests` is called.

MozReview-Commit-ID: GQlBR0Geic6

--HG--
extra : rebase_source : fa4634c832e5727a7609b0a60c57e53caf43cb57
This commit is contained in:
Anjana Vakil 2016-08-09 17:30:50 +02:00
Родитель 88d6e5e9c4
Коммит 532b4939e0
1 изменённых файлов: 29 добавлений и 34 удалений

Просмотреть файл

@ -135,14 +135,17 @@ def runner(mach_parsed_kwargs):
@pytest.fixture()
def mock_runner(runner, mock_marionette):
def mock_runner(runner, mock_marionette, monkeypatch):
"""
MarionetteTestRunner instance with mocked-out
self.marionette and other properties.
self.marionette and other properties,
to enable testing runner.run_tests().
"""
runner.driverclass = mock_marionette
runner._set_baseurl = Mock()
runner.run_test_set = Mock()
for attr in ['_set_baseurl', 'run_test_set', '_capabilities']:
setattr(runner, attr, Mock())
runner._appName = 'fake_app'
monkeypatch.setattr('marionette.runner.base.mozversion', Mock())
return runner
@ -367,8 +370,7 @@ def test_add_test_directory(runner):
assert test_dir in test['filepath']
assert len(runner.tests) == 4
def test_add_test_manifest(runner):
runner._appName = 'fake_app'
def test_add_test_manifest(mock_runner):
manifest = "/path/to/fake/manifest.ini"
active_tests = [{'expected': 'pass',
'path': u'/path/to/fake/test_expected_pass.py'},
@ -381,18 +383,18 @@ def test_add_test_manifest(runner):
read=DEFAULT, active_tests=DEFAULT) as mocks:
mocks['active_tests'].return_value = active_tests
with pytest.raises(IOError) as err:
runner.add_test(manifest)
mock_runner.add_test(manifest)
assert "does not exist" in err.value.message
assert mocks['read'].call_count == mocks['active_tests'].call_count == 1
args, kwargs = mocks['active_tests'].call_args
assert kwargs['app'] == runner._appName
runner.tests, runner.manifest_skipped_tests = [], []
assert kwargs['app'] == mock_runner._appName
mock_runner.tests, mock_runner.manifest_skipped_tests = [], []
with patch('marionette.runner.base.os.path.exists', return_value=True):
runner.add_test(manifest)
mock_runner.add_test(manifest)
assert mocks['read'].call_count == mocks['active_tests'].call_count == 2
assert len(runner.tests) == 2
assert len(runner.manifest_skipped_tests) == 1
for test in runner.tests:
assert len(mock_runner.tests) == 2
assert len(mock_runner.manifest_skipped_tests) == 1
for test in mock_runner.tests:
assert test['filepath'].endswith(('test_expected_pass.py', 'test_expected_fail.py'))
if test['filepath'].endswith('test_expected_fail.py'):
assert test['expected'] == 'fail'
@ -401,48 +403,42 @@ def test_add_test_manifest(runner):
def test_cleanup_with_manifest(mock_runner):
mock_runner._appName = 'fake_app'
with patch.multiple('marionette.runner.base.TestManifest',
read=DEFAULT, active_tests=DEFAULT) as mocks:
mocks['active_tests'].return_value = [{'expected':'pass', 'path':'test_something.py'}]
with patch('marionette.runner.base.mozversion.get_version'):
with patch('marionette.runner.base.os.path.exists', return_value=True):
mock_runner.run_tests(['fake_manifest.ini'])
with patch('marionette.runner.base.os.path.exists', return_value=True):
mock_runner.run_tests(['fake_manifest.ini'])
assert mock_runner.marionette is None
assert mock_runner.httpd is None
def test_cleanup_empty_manifest(mock_runner):
mock_runner._appName = 'fake_app'
with patch.multiple('marionette.runner.base.TestManifest',
read=DEFAULT, active_tests=DEFAULT) as mocks:
mocks['active_tests'].return_value = []
with patch('marionette.runner.base.mozversion.get_version'):
with pytest.raises(Exception) as exc:
mock_runner.run_tests(['fake_empty_manifest.ini'])
with pytest.raises(Exception) as exc:
mock_runner.run_tests(['fake_empty_manifest.ini'])
assert "no tests to run" in exc.value.message
assert mock_runner.marionette is None
assert mock_runner.httpd is None
def test_reset_test_stats(runner):
def test_reset_test_stats(mock_runner):
def reset_successful(runner):
stats = ['passed', 'failed', 'unexpected_successes', 'todo', 'skipped', 'failures']
return all([((s in vars(runner)) and (not vars(runner)[s])) for s in stats])
assert reset_successful(runner)
runner.passed = 1
runner.failed = 1
runner.failures.append(['TEST-UNEXPECTED-FAIL'])
assert not reset_successful(runner)
with pytest.raises(Exception):
runner.run_tests([u'test_fake_thing.py'])
assert reset_successful(runner)
assert reset_successful(mock_runner)
mock_runner.passed = 1
mock_runner.failed = 1
mock_runner.failures.append(['TEST-UNEXPECTED-FAIL'])
assert not reset_successful(mock_runner)
mock_runner.run_tests([u'test_fake_thing.py'])
assert reset_successful(mock_runner)
def test_initialize_test_run(mock_runner):
tests = [u'test_fake_thing.py']
mock_runner.reset_test_stats = Mock()
with patch('marionette.runner.base.mozversion.get_version'):
mock_runner.run_tests(tests)
mock_runner.run_tests(tests)
assert mock_runner.reset_test_stats.called
with pytest.raises(AssertionError) as test_exc:
mock_runner.run_tests([])
@ -457,8 +453,7 @@ def test_initialize_test_run(mock_runner):
def test_add_tests(mock_runner):
assert len(mock_runner.tests) == 0
fake_tests = ["test_" + i + ".py" for i in "abc"]
with patch('marionette.runner.base.mozversion.get_version'):
mock_runner.run_tests(fake_tests)
mock_runner.run_tests(fake_tests)
assert len(mock_runner.tests) == 3
for (test_name, added_test) in zip(fake_tests, mock_runner.tests):
assert added_test['filepath'].endswith(test_name)