Merge pull request #36 from redixin/fix_mock_testr

Fix different test names with different runs
This commit is contained in:
Carles Barrobés
2015-11-18 23:03:08 +01:00
2 changed files with 37 additions and 54 deletions

64
ddt.py
View File

@@ -9,7 +9,6 @@ import inspect
import json import json
import os import os
import re import re
import sys
from functools import wraps from functools import wraps
__version__ = '1.0.0' __version__ = '1.0.0'
@@ -23,6 +22,20 @@ FILE_ATTR = '%file_path' # store the path to JSON file
UNPACK_ATTR = '%unpack' # remember that we have to unpack values UNPACK_ATTR = '%unpack' # remember that we have to unpack values
try:
trivial_types = (type(None), bool, int, float, basestring)
except NameError:
trivial_types = (type(None), bool, int, float, str)
def is_trivial(value):
if isinstance(value, trivial_types):
return True
elif isinstance(value, (list, tuple)):
return all(map(is_trivial, value))
return False
def unpack(func): def unpack(func):
""" """
Method decorator to add unpack feature. Method decorator to add unpack feature.
@@ -70,14 +83,6 @@ def file_data(value):
return wrapper return wrapper
def is_hash_randomized():
return (((sys.hexversion >= 0x02070300 and
sys.hexversion < 0x03000000) or
(sys.hexversion >= 0x03020300)) and
sys.flags.hash_randomization and
'PYTHONHASHSEED' not in os.environ)
def mk_test_name(name, value, index=0): def mk_test_name(name, value, index=0):
""" """
Generate a new name for a test case. Generate a new name for a test case.
@@ -86,47 +91,18 @@ def mk_test_name(name, value, index=0):
string representation of the value, and convert the result into a valid string representation of the value, and convert the result into a valid
python identifier by replacing extraneous characters with ``_``. python identifier by replacing extraneous characters with ``_``.
If hash randomization is enabled (a feature available since 2.7.3/3.2.3 We avoid doing str(value) if dealing with non-trivial values.
and enabled by default since 3.3) and a "non-trivial" value is passed The problem is possible different names with different runs, e.g.
this will omit the name argument by default. Set `PYTHONHASHSEED` different order of dictionary keys (see PYTHONHASHSEED) or dealing
to a fixed value before running tests in these cases to get the with mock objects.
names back consistently or use the `__name__` attribute on data values. Trivial scalar values are passed as is.
A "trivial" value is a plain scalar, or a tuple or list consisting A "trivial" value is a plain scalar, or a tuple or list consisting
only of trivial values. only of trivial values.
""" """
# We avoid doing str(value) if all of the following hold: if not is_trivial(value):
#
# * Python version is 2.7.3 or newer (for 2 series) or 3.2.3 or
# newer (for 3 series). Also sys.flags.hash_randomization didn't
# exist before these.
# * sys.flags.hash_randomization is set to True
# * PYTHONHASHSEED is **not** defined in the environment
# * Given `value` argument is not a trivial scalar (None, str,
# int, float).
#
# Trivial scalar values are passed as is in all cases.
trivial_types = (type(None), bool, str, int, float)
try:
trivial_types += (unicode,)
except NameError:
pass
def is_trivial(value):
if isinstance(value, trivial_types):
return True
if isinstance(value, (list, tuple)):
return all(map(is_trivial, value))
return False
if is_hash_randomized() and not is_trivial(value):
return "{0}_{1}".format(name, index + 1) return "{0}_{1}".format(name, index + 1)
try: try:
value = str(value) value = str(value)
except UnicodeEncodeError: except UnicodeEncodeError:

View File

@@ -3,7 +3,7 @@ import json
import six import six
from ddt import ddt, data, file_data, is_hash_randomized from ddt import ddt, data, file_data
from nose.tools import assert_equal, assert_is_not_none, assert_raises from nose.tools import assert_equal, assert_is_not_none, assert_raises
@@ -226,11 +226,7 @@ def test_ddt_data_unicode():
assert_is_not_none(getattr(Mytest, 'test_hello_1_ascii')) assert_is_not_none(getattr(Mytest, 'test_hello_1_ascii'))
assert_is_not_none(getattr(Mytest, 'test_hello_2_non_ascii__u2603')) assert_is_not_none(getattr(Mytest, 'test_hello_2_non_ascii__u2603'))
if is_hash_randomized(): assert_is_not_none(getattr(Mytest, 'test_hello_3'))
assert_is_not_none(getattr(Mytest, 'test_hello_3'))
else:
assert_is_not_none(getattr(Mytest,
'test_hello_3__u__u2603____data__'))
elif six.PY3: elif six.PY3:
@@ -242,10 +238,21 @@ def test_ddt_data_unicode():
assert_is_not_none(getattr(Mytest, 'test_hello_1_ascii')) assert_is_not_none(getattr(Mytest, 'test_hello_1_ascii'))
assert_is_not_none(getattr(Mytest, 'test_hello_2_non_ascii__')) assert_is_not_none(getattr(Mytest, 'test_hello_2_non_ascii__'))
if is_hash_randomized(): assert_is_not_none(getattr(Mytest, 'test_hello_3'))
assert_is_not_none(getattr(Mytest, 'test_hello_3'))
else:
assert_is_not_none(getattr(Mytest, 'test_hello_3________data__')) def test_ddt_data_object():
"""
Test not using value if non-trivial arguments
"""
@ddt
class Mytest(object):
@data(object)
def test_object(self, val):
pass
assert_is_not_none(getattr(Mytest, 'test_object_1_object'))
def test_feed_data_with_invalid_identifier(): def test_feed_data_with_invalid_identifier():