2 new commits in pytest:
https://bitbucket.org/hpk42/pytest/commits/4972758f9321/
Changeset: 4972758f9321
Branch: parametrize-hashable
User: bubenkoff
Date: 2013-12-03 21:05:19
Summary: implement index-based mechanizm for collection of parametrized
tests
Affected #: 3 files
diff -r a6837c60c2409e26e718c20a5e033842afe73a0f -r
4972758f932169015f6fe68168f26a8093357a70 CHANGELOG
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,6 +1,9 @@
Unreleased
-----------------------------------
+- fix issue244 by implementing special index for parameters to only use
+ indices for paramentrized test ids
+
- fix issue287 by running all finalizers but saving the exception
from the first failing finalizer and re-raising it so teardown will
still have failed. We reraise the first failing exception because
diff -r a6837c60c2409e26e718c20a5e033842afe73a0f -r
4972758f932169015f6fe68168f26a8093357a70 _pytest/python.py
--- a/_pytest/python.py
+++ b/_pytest/python.py
@@ -594,12 +594,14 @@
self._globalparam = _notexists
self._arg2scopenum = {} # used for sorting parametrized resources
self.keywords = {}
+ self.indices = {}
def copy(self, metafunc):
cs = CallSpec2(self.metafunc)
cs.funcargs.update(self.funcargs)
cs.params.update(self.params)
cs.keywords.update(self.keywords)
+ cs.indices.update(self.indices)
cs._arg2scopenum.update(self._arg2scopenum)
cs._idlist = list(self._idlist)
cs._globalid = self._globalid
@@ -623,7 +625,8 @@
def id(self):
return "-".join(map(str, filter(None, self._idlist)))
- def setmulti(self, valtype, argnames, valset, id, keywords, scopenum=0):
+ def setmulti(self, valtype, argnames, valset, id, keywords, scopenum,
+ param_index):
for arg,val in zip(argnames, valset):
self._checkargnotcontained(arg)
getattr(self, valtype)[arg] = val
@@ -631,6 +634,7 @@
# parametrize_sorted() which groups tests by params/scope
if valtype == "funcargs":
self.params[arg] = id
+ self.indices[arg] = param_index
self._arg2scopenum[arg] = scopenum
if val is _notexists:
self._emptyparamspecified = True
@@ -740,11 +744,12 @@
ids = idmaker(argnames, argvalues)
newcalls = []
for callspec in self._calls or [CallSpec2(self)]:
- for i, valset in enumerate(argvalues):
+ for param_index, valset in enumerate(argvalues):
assert len(valset) == len(argnames)
newcallspec = callspec.copy(self)
- newcallspec.setmulti(valtype, argnames, valset, ids[i],
- newkeywords.get(i, {}), scopenum)
+ newcallspec.setmulti(valtype, argnames, valset,
ids[param_index],
+ newkeywords.get(param_index, {}),
scopenum,
+ param_index)
newcalls.append(newcallspec)
self._calls = newcalls
@@ -1862,19 +1867,19 @@
except AttributeError:
return []
if scopenum == 0:
- argparams = [x for x in cs.params.items() if x not in ignore
+ argparams = [x for x in cs.indices.items() if x not in ignore
and cs._arg2scopenum[x[0]] == scopenum]
elif scopenum == 1: # module
argparams = []
- for argname, param in cs.params.items():
+ for argname, valindex in cs.indices.items():
if cs._arg2scopenum[argname] == scopenum:
- key = (argname, param, item.fspath)
+ key = (argname, valindex, item.fspath)
if key in ignore:
continue
argparams.append(key)
elif scopenum == 2: # class
argparams = []
- for argname, param in cs.params.items():
+ for argname, valindex in cs.indices.items():
if cs._arg2scopenum[argname] == scopenum:
l = cache.setdefault(item.fspath, [])
try:
@@ -1882,13 +1887,13 @@
except ValueError:
i = len(l)
l.append(item.cls)
- key = (argname, param, item.fspath, i)
+ key = (argname, valindex, item.fspath, i)
if key in ignore:
continue
argparams.append(key)
#elif scopenum == 3:
# argparams = []
- # for argname, param in cs.params.items():
+ # for argname, param in cs.indices.items():
# if cs._arg2scopenum[argname] == scopenum:
# key = (argname, param, getfslineno(item.obj))
# if key in ignore:
diff -r a6837c60c2409e26e718c20a5e033842afe73a0f -r
4972758f932169015f6fe68168f26a8093357a70 testing/python/collect.py
--- a/testing/python/collect.py
+++ b/testing/python/collect.py
@@ -355,6 +355,35 @@
rec = testdir.inline_run()
rec.assertoutcome(passed=2)
+
+ def test_parametrize_with_non_hashable_values_indirect(self, testdir):
+ """Test parametrization with non-hashable values with indirect
parametrization."""
+ testdir.makepyfile("""
+ archival_mapping = {
+ '1.0': {'tag': '1.0'},
+ '1.2.2a1': {'tag': 'release-1.2.2a1'},
+ }
+
+ import pytest
+
+ @pytest.fixture
+ def key(request):
+ return request.param
+
+ @pytest.fixture
+ def value(request):
+ return request.param
+
+ @pytest.mark.parametrize('key value'.split(),
+ archival_mapping.items(), indirect=True)
+ def test_archival_to_version(key, value):
+ assert key in archival_mapping
+ assert value == archival_mapping[key]
+ """)
+ rec = testdir.inline_run()
+ rec.assertoutcome(passed=2)
+
+
def test_parametrize_with_mark(selfself, testdir):
items = testdir.getitems("""
import pytest
https://bitbucket.org/hpk42/pytest/commits/ef64b4405d0c/
Changeset: ef64b4405d0c
User: hpk42
Date: 2013-12-03 21:07:15
Summary: Merged in paylogic/pytest/parametrize-hashable (pull request #89)
implement index-based mechanizm for collection of parametrized tests
Affected #: 3 files
diff -r a6837c60c2409e26e718c20a5e033842afe73a0f -r
ef64b4405d0caf4ba5bb390f591889b99be574a1 CHANGELOG
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,6 +1,9 @@
Unreleased
-----------------------------------
+- fix issue244 by implementing special index for parameters to only use
+ indices for paramentrized test ids
+
- fix issue287 by running all finalizers but saving the exception
from the first failing finalizer and re-raising it so teardown will
still have failed. We reraise the first failing exception because
diff -r a6837c60c2409e26e718c20a5e033842afe73a0f -r
ef64b4405d0caf4ba5bb390f591889b99be574a1 _pytest/python.py
--- a/_pytest/python.py
+++ b/_pytest/python.py
@@ -594,12 +594,14 @@
self._globalparam = _notexists
self._arg2scopenum = {} # used for sorting parametrized resources
self.keywords = {}
+ self.indices = {}
def copy(self, metafunc):
cs = CallSpec2(self.metafunc)
cs.funcargs.update(self.funcargs)
cs.params.update(self.params)
cs.keywords.update(self.keywords)
+ cs.indices.update(self.indices)
cs._arg2scopenum.update(self._arg2scopenum)
cs._idlist = list(self._idlist)
cs._globalid = self._globalid
@@ -623,7 +625,8 @@
def id(self):
return "-".join(map(str, filter(None, self._idlist)))
- def setmulti(self, valtype, argnames, valset, id, keywords, scopenum=0):
+ def setmulti(self, valtype, argnames, valset, id, keywords, scopenum,
+ param_index):
for arg,val in zip(argnames, valset):
self._checkargnotcontained(arg)
getattr(self, valtype)[arg] = val
@@ -631,6 +634,7 @@
# parametrize_sorted() which groups tests by params/scope
if valtype == "funcargs":
self.params[arg] = id
+ self.indices[arg] = param_index
self._arg2scopenum[arg] = scopenum
if val is _notexists:
self._emptyparamspecified = True
@@ -740,11 +744,12 @@
ids = idmaker(argnames, argvalues)
newcalls = []
for callspec in self._calls or [CallSpec2(self)]:
- for i, valset in enumerate(argvalues):
+ for param_index, valset in enumerate(argvalues):
assert len(valset) == len(argnames)
newcallspec = callspec.copy(self)
- newcallspec.setmulti(valtype, argnames, valset, ids[i],
- newkeywords.get(i, {}), scopenum)
+ newcallspec.setmulti(valtype, argnames, valset,
ids[param_index],
+ newkeywords.get(param_index, {}),
scopenum,
+ param_index)
newcalls.append(newcallspec)
self._calls = newcalls
@@ -1862,19 +1867,19 @@
except AttributeError:
return []
if scopenum == 0:
- argparams = [x for x in cs.params.items() if x not in ignore
+ argparams = [x for x in cs.indices.items() if x not in ignore
and cs._arg2scopenum[x[0]] == scopenum]
elif scopenum == 1: # module
argparams = []
- for argname, param in cs.params.items():
+ for argname, valindex in cs.indices.items():
if cs._arg2scopenum[argname] == scopenum:
- key = (argname, param, item.fspath)
+ key = (argname, valindex, item.fspath)
if key in ignore:
continue
argparams.append(key)
elif scopenum == 2: # class
argparams = []
- for argname, param in cs.params.items():
+ for argname, valindex in cs.indices.items():
if cs._arg2scopenum[argname] == scopenum:
l = cache.setdefault(item.fspath, [])
try:
@@ -1882,13 +1887,13 @@
except ValueError:
i = len(l)
l.append(item.cls)
- key = (argname, param, item.fspath, i)
+ key = (argname, valindex, item.fspath, i)
if key in ignore:
continue
argparams.append(key)
#elif scopenum == 3:
# argparams = []
- # for argname, param in cs.params.items():
+ # for argname, param in cs.indices.items():
# if cs._arg2scopenum[argname] == scopenum:
# key = (argname, param, getfslineno(item.obj))
# if key in ignore:
diff -r a6837c60c2409e26e718c20a5e033842afe73a0f -r
ef64b4405d0caf4ba5bb390f591889b99be574a1 testing/python/collect.py
--- a/testing/python/collect.py
+++ b/testing/python/collect.py
@@ -355,6 +355,35 @@
rec = testdir.inline_run()
rec.assertoutcome(passed=2)
+
+ def test_parametrize_with_non_hashable_values_indirect(self, testdir):
+ """Test parametrization with non-hashable values with indirect
parametrization."""
+ testdir.makepyfile("""
+ archival_mapping = {
+ '1.0': {'tag': '1.0'},
+ '1.2.2a1': {'tag': 'release-1.2.2a1'},
+ }
+
+ import pytest
+
+ @pytest.fixture
+ def key(request):
+ return request.param
+
+ @pytest.fixture
+ def value(request):
+ return request.param
+
+ @pytest.mark.parametrize('key value'.split(),
+ archival_mapping.items(), indirect=True)
+ def test_archival_to_version(key, value):
+ assert key in archival_mapping
+ assert value == archival_mapping[key]
+ """)
+ rec = testdir.inline_run()
+ rec.assertoutcome(passed=2)
+
+
def test_parametrize_with_mark(selfself, testdir):
items = testdir.getitems("""
import pytest
Repository URL: https://bitbucket.org/hpk42/pytest/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
_______________________________________________
pytest-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pytest-commit