Using `@unittest.skipIf` with older versions of Python
-
13-06-2021 - |
Question
With the unittest
module, I like the feature to skip tests, but it is only available in Python 2.7+.
For example, consider test.py
:
import unittest
try:
import proprietary_module
except ImportError:
proprietary_module = None
class TestProprietary(unittest.TestCase):
@unittest.skipIf(proprietary_module is None, "requries proprietary module")
def test_something_proprietary(self):
self.assertTrue(proprietary_module is not None)
if __name__ == '__main__':
unittest.main()
If I try to run a test with an earlier version of Python, I get an error:
Traceback (most recent call last):
File "test.py", line 7, in <module>
class TestProprietary(unittest.TestCase):
File "test.py", line 8, in TestProprietary
@unittest.skipIf(proprietary_module is None, "requries proprietary module")
AttributeError: 'module' object has no attribute 'skipIf'
Is there a way to "trick" older versions of Python to ignore the unittest decorator, and to skip the test?
Solution
unittest2 is a backport of the new features added to the unittest testing framework in Python 2.7. It is tested to run on Python 2.4 - 2.7.
To use unittest2 instead of unittest simply replace import unittest with import unittest2
OTHER TIPS
In general I would recommend not using unittest
because it has not really a pythonic API.
A good framework for testing in Python is nose
. You can skip tests by raising a SkipTest
exception, for example:
if (sys.version_info < (2, 6, 0)):
from nose.plugins.skip import SkipTest
raise SkipTest
This works for Python 2.3+
There are a lot more features in nose:
- You do not need classes. A function could be a test, too.
- Decorator for fixtures (setup, teardown functions).
- Module level fixtures.
- Decorator for expecting an Exception.
- ...
How about using if
statement?
if proprietary_module is None:
print "Skipping test since it requires proprietary module"
else:
def test_something_proprietary(self):
self.assertTrue(proprietary_module is not None)