Skip to content

Unexpected behavior when modifying parameterized value #237

@pytestbot

Description

@pytestbot

Originally reported by: James Laska (BitBucket: jlaska, GitHub: jlaska)


Greetings,

With py.test-2.3.4, when adjusting the value of a parameterized test function argument, it appears the changes are made to subsequent calls to the same function.

With the following conftest.py ...

#!python

import pytest

releasevers = "6Server".split()
basearchs = "i386 x86_64".split()
clouds = "rhevm ec2".split()
image_list = list()
for releasever in releasevers:
    for basearch in basearchs:
        image_list.append(dict(
            name="rhel-{basearch}-{releasever}".format(releasever=releasever, basearch=basearch),
            profile="small-{basearch}".format(basearch=basearch),
            releasever=releasever,
            basearch=basearch))

def pytest_generate_tests(metafunc):

    if 'cloud' in metafunc.funcargnames:
        metafunc.parametrize("cloud", clouds)

    if 'image' in metafunc.funcargnames:
        metafunc.parametrize("image", image_list, ids=[i.get('name') for i in image_list])

Any the following test_images.py ...

#!python

def test_build(cloud, image):

    print "\n  BEFORE: profile=%s" % (image.get('profile'))

    # If rhevm, alter the profile
    if cloud == 'rhevm' and image.get('basearch','') == 'i386':
        image['profile'] = 'small-x86_64'
        print "  MODIFIED PROFILE"

    if cloud == 'rhevm':
        assert image.get('profile') == 'small-x86_64'
    else:
        assert image.get('profile') == 'small-%s' % image.get('basearch')

This may be something fundamental to python (call-by-reference) that I'm missing. However, it appears that py.test is adjusting the value of image['profile'] for subsequent calls to the test function. For example ..

py.test -s .
============================================================================================= test session starts =============================================================================================
platform linux2 -- Python 2.7.3 -- pytest-2.3.4
collected 4 items 

test_images.py 
  BEFORE: profile=small-i386
  MODIFIED PROFILE
.
  BEFORE: profile=small-x86_64
.
  BEFORE: profile=small-x86_64
F
  BEFORE: profile=small-x86_64
.

================================================================================================== FAILURES ===================================================================================================
______________________________________________________________________________________ test_build[ec2-rhel-i386-6Server] ______________________________________________________________________________________

cloud = 'ec2', image = {'basearch': 'i386', 'name': 'rhel-i386-6Server', 'profile': 'small-x86_64', 'releasever': '6Server'}

    def test_build(cloud, image):

        print "\n  BEFORE: profile=%s" % (image.get('profile'))

        # If rhevm, alter the profile
        if cloud == 'rhevm' and image.get('basearch','') == 'i386':
            image['profile'] = 'small-x86_64'
            print "  MODIFIED PROFILE"

        if cloud == 'rhevm':
            assert image.get('profile') == 'small-x86_64'
        else:
>           assert image.get('profile') == 'small-%s' % image.get('basearch')
E           assert 'small-x86_64' == 'small-i386'
E             - small-x86_64
E             + small-i386

test_images.py:13: AssertionError
===================================================================================== 1 failed, 3 passed in 0.02 seconds ======================================================================================

If I first copy the test argument named 'image' using the 'copy.copy()' method, I am able to modify the object as needed without disruption to other generated calls to the same method.

Please advise, is this a problem with pytest, or in how I'm generating the test arguments?


Metadata

Metadata

Assignees

No one assigned

    Labels

    invalidtype: bugproblem that needs to be addressed

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions