--- you can reply above this line ---

New issue 237: Unexpected behavior when modifying parameterized value
https://bitbucket.org/hpk42/pytest/issue/237/unexpected-behavior-when-modifying

James Laska:

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?


--

This is an issue notification from bitbucket.org. You are receiving
this either because you are the owner of the issue, or you are
following the issue.
_______________________________________________
py-svn mailing list
py-svn@codespeak.net
http://codespeak.net/mailman/listinfo/py-svn

Reply via email to