summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2012-09-20 22:44:05 +0000
committerGerrit Code Review <review@openstack.org>2012-09-20 22:44:05 +0000
commit48fc829da2b2ca1106a59517d6df322fe7ba9d38 (patch)
tree1a8365b646c2d867f7342a6c1297395f6a0e39ee
parent1ec8b5d06cf5f5ff0dc0e2a5318ccfc05756d2a4 (diff)
parentc82dba22c24cd7cd4d7ce3629da24644414cb374 (diff)
downloadnova-48fc829da2b2ca1106a59517d6df322fe7ba9d38.tar.gz
nova-48fc829da2b2ca1106a59517d6df322fe7ba9d38.tar.xz
nova-48fc829da2b2ca1106a59517d6df322fe7ba9d38.zip
Merge "Clarify dangerous use of exceptions in unit tests"
-rw-r--r--nova/testing/README.rst30
-rw-r--r--nova/tests/api/openstack/test_common.py12
-rw-r--r--nova/tests/compute/test_compute.py4
-rw-r--r--nova/tests/test_db_api.py3
4 files changed, 32 insertions, 17 deletions
diff --git a/nova/testing/README.rst b/nova/testing/README.rst
index 67fa33d1d..4c341b7ed 100644
--- a/nova/testing/README.rst
+++ b/nova/testing/README.rst
@@ -54,13 +54,33 @@ Writing Integration Tests
TBD
-Tests and assertRaises
-----------------------
-When asserting that a test should raise an exception, test against the
-most specific exception possible. An overly broad exception type (like
-Exception) can mask errors in the unit test itself.
+Tests and Exceptions
+--------------------
+A properly written test asserts that particular behavior occurs. This can
+be a success condition or a failure condition, including an exception.
+When asserting that a particular exception is raised, the most specific
+exception possible should be used.
+
+In particular, testing for Exception being raised is almost always a
+mistake since it will match (almost) every exception, even those
+unrelated to the exception intended to be tested.
+
+This applies to catching exceptions manually with a try/except block,
+or using assertRaises().
Example::
self.assertRaises(exception.InstanceNotFound, db.instance_get_by_uuid,
elevated, instance_uuid)
+
+If a stubbed function/method needs a generic exception for testing
+purposes, test.TestingException is available.
+
+Example::
+
+ def stubbed_method(self):
+ raise test.TestingException()
+ self.stubs.Set(cls, 'inner_method', stubbed_method)
+
+ obj = cls()
+ self.assertRaises(test.TestingException, obj.outer_method)
diff --git a/nova/tests/api/openstack/test_common.py b/nova/tests/api/openstack/test_common.py
index 250a199e8..4ebd49ca2 100644
--- a/nova/tests/api/openstack/test_common.py
+++ b/nova/tests/api/openstack/test_common.py
@@ -290,10 +290,8 @@ class MiscFunctionsTest(test.TestCase):
try:
common.raise_http_conflict_for_instance_invalid_state(exc,
'meow')
- except Exception, e:
- self.assertTrue(isinstance(e, webob.exc.HTTPConflict))
- msg = str(e)
- self.assertEqual(msg,
+ except webob.exc.HTTPConflict as e:
+ self.assertEqual(unicode(e),
"Cannot 'meow' while instance is in fake_attr fake_state")
else:
self.fail("webob.exc.HTTPConflict was not raised")
@@ -303,10 +301,8 @@ class MiscFunctionsTest(test.TestCase):
try:
common.raise_http_conflict_for_instance_invalid_state(exc,
'meow')
- except Exception, e:
- self.assertTrue(isinstance(e, webob.exc.HTTPConflict))
- msg = str(e)
- self.assertEqual(msg,
+ except webob.exc.HTTPConflict as e:
+ self.assertEqual(unicode(e),
"Instance is in an invalid state for 'meow'")
else:
self.fail("webob.exc.HTTPConflict was not raised")
diff --git a/nova/tests/compute/test_compute.py b/nova/tests/compute/test_compute.py
index 63af33153..747774fa4 100644
--- a/nova/tests/compute/test_compute.py
+++ b/nova/tests/compute/test_compute.py
@@ -2264,7 +2264,7 @@ class ComputeTestCase(BaseTestCase):
try:
raise NotImplementedError('test')
- except Exception:
+ except NotImplementedError:
exc_info = sys.exc_info()
self.stubs.Set(nova.db, 'instance_fault_create', fake_db_fault_create)
@@ -2292,7 +2292,7 @@ class ComputeTestCase(BaseTestCase):
try:
raise user_exc
- except Exception:
+ except exception.Invalid:
exc_info = sys.exc_info()
self.stubs.Set(nova.db, 'instance_fault_create', fake_db_fault_create)
diff --git a/nova/tests/test_db_api.py b/nova/tests/test_db_api.py
index 641c7c8cd..e434faaad 100644
--- a/nova/tests/test_db_api.py
+++ b/nova/tests/test_db_api.py
@@ -46,11 +46,10 @@ class DbApiTestCase(test.TestCase):
return db.instance_create(self.context, args)
def test_ec2_ids_not_found_are_printable(self):
-
def check_exc_format(method):
try:
method(self.context, 'fake')
- except Exception as exc:
+ except exception.NotFound as exc:
self.assertTrue('fake' in unicode(exc))
check_exc_format(db.get_ec2_volume_id_by_uuid)