diff --git a/_pytest/python.py b/_pytest/python.py index 7b4b0a622..3020f4db6 100644 --- a/_pytest/python.py +++ b/_pytest/python.py @@ -7,6 +7,7 @@ import re import types import sys import math +import collections import py import pytest @@ -1152,9 +1153,14 @@ def _idvalset(idx, valset, argnames, idfn, ids): def idmaker(argnames, argvalues, idfn=None, ids=None): ids = [_idvalset(valindex, valset, argnames, idfn, ids) for valindex, valset in enumerate(argvalues)] - if len(set(ids)) < len(ids): - # user may have provided a bad idfn which means the ids are not unique - ids = [str(i) + testid for i, testid in enumerate(ids)] + duplicates = [testid for testid in ids if ids.count(testid) > 1] + if duplicates: + # The ids are not unique + counters = collections.defaultdict(lambda: 0) + for index, testid in enumerate(ids): + if testid in duplicates: + ids[index] = testid + str(counters[testid]) + counters[testid] += 1 return ids def showfixtures(config): diff --git a/testing/python/metafunc.py b/testing/python/metafunc.py index f0f3dbd4c..e7ede1bf8 100644 --- a/testing/python/metafunc.py +++ b/testing/python/metafunc.py @@ -238,9 +238,9 @@ class TestMetafunc: (20, KeyError()), ("three", [1, 2, 3]), ], idfn=ids) - assert result == ["0a-a", - "1a-a", - "2a-a", + assert result == ["a-a0", + "a-a1", + "a-a2", ] @pytest.mark.issue351 @@ -267,10 +267,9 @@ class TestMetafunc: def test_idmaker_with_ids_unique_names(self): from _pytest.python import idmaker - result = idmaker(("a", "b"), [(1, 2), - (3, 4)], - ids=["a", "a"]) - assert result == ["0a", "1a"] + result = idmaker(("a"), [1,2,3,4,5], + ids=["a", "a", "b", "c", "b"]) + assert result == ["a0", "a1", "b0", "c", "b1"] def test_addcall_and_parametrize(self): def func(x, y): pass @@ -834,8 +833,8 @@ class TestMetafuncFunctional: result = testdir.runpytest("-v") assert result.ret == 1 result.stdout.fnmatch_lines_random([ - "*test_function*0a*PASSED", - "*test_function*1a*FAILED" + "*test_function*a0*PASSED", + "*test_function*a1*FAILED" ]) @pytest.mark.parametrize(("scope", "length"),