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