-
-
Notifications
You must be signed in to change notification settings - Fork 2.9k
Description
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?