From 345b8391c4543e4b6a1a50c086918738d04b5b9f Mon Sep 17 00:00:00 2001 From: Brianna Laugher Date: Wed, 29 May 2013 12:59:47 +1000 Subject: [PATCH] A couple of improvements to parametrize - When not specifying ids, let None and bools use their native string form (like str, int, float) rather than obfuscated form used for objects - When specifying ids, explicitly raise a ValueError if a different number of ids are specified compared to the test cases - Add tests for both these items. --- _pytest/python.py | 6 +++++- testing/python/metafunc.py | 32 ++++++++++++++++++++++++++++++-- 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/_pytest/python.py b/_pytest/python.py index 3dcc0836f..fda0434c5 100644 --- a/_pytest/python.py +++ b/_pytest/python.py @@ -2,6 +2,7 @@ import py import inspect import sys +from types import NoneType import pytest from _pytest.main import getfslineno from _pytest.mark import MarkDecorator, MarkInfo @@ -705,6 +706,9 @@ class Metafunc(FuncargnamesCompatAttr): raise ValueError("%r uses no fixture %r" %( self.function, arg)) valtype = indirect and "params" or "funcargs" + if ids and len(ids) != len(argvalues): + raise ValueError('%d tests specified with %d ids' %( + len(argvalues), len(ids))) if not ids: ids = idmaker(argnames, argvalues) newcalls = [] @@ -758,7 +762,7 @@ def idmaker(argnames, argvalues): for valindex, valset in enumerate(argvalues): this_id = [] for nameindex, val in enumerate(valset): - if not isinstance(val, (float, int, str)): + if not isinstance(val, (float, int, str, bool, NoneType)): this_id.append(str(argnames[nameindex])+str(valindex)) else: this_id.append(str(val)) diff --git a/testing/python/metafunc.py b/testing/python/metafunc.py index 71438870a..2de885064 100644 --- a/testing/python/metafunc.py +++ b/testing/python/metafunc.py @@ -95,6 +95,17 @@ class TestMetafunc: ids = [x.id for x in metafunc._calls] assert ids == ["basic-abc", "basic-def", "advanced-abc", "advanced-def"] + def test_parametrize_with_wrong_number_of_ids(self, testdir): + def func(x, y): pass + metafunc = self.Metafunc(func) + + with pytest.raises(ValueError): + metafunc.parametrize("x", [1,2], ids=['basic']) + + with pytest.raises(ValueError): + metafunc.parametrize(("x","y"), [("abc", "def"), + ("ghi", "jkl")], ids=["one"]) + def test_parametrize_with_userobjects(self): def func(x, y): pass metafunc = self.Metafunc(func) @@ -121,6 +132,25 @@ class TestMetafunc: result = idmaker((py.builtin._totext("a"), "b"), [({}, '\xc3\xb4')]) assert result == ['a0-\xc3\xb4'] + def test_idmaker_native_strings(self): + from _pytest.python import idmaker + result = idmaker(("a", "b"), [(1.0, -1.1), + (2, -202), + ("three", "three hundred"), + (True, False), + (None, None), + (list("six"), [66, 66]), + ({7}, set("seven")), + (tuple("eight"), (8, -8, 8)) + ]) + assert result == ["1.0--1.1", + "2--202", + "three-three hundred", + "True-False", + "None-None", + "a5-b5", + "a6-b6", + "a7-b7"] def test_addcall_and_parametrize(self): def func(x, y): pass @@ -530,8 +560,6 @@ class TestMetafuncFunctional: *test_function*1.3-b1* """) - - @pytest.mark.parametrize(("scope", "length"), [("module", 2), ("function", 4)]) def test_parametrize_scope_overrides(self, testdir, scope, length):