5
votes

I am using @pytest.mark.parametrize with various testcases and expected outputs. Its passing perfectly fine with few test cases and giving this error with some other cases. Not even able to google it. I want to know what could have gone wrong. I would be glad if someone can tell me how to atleast google for this error !

============================= test session starts ============================= platform win32 -- Python 2.7.12, pytest-3.0.3, py-1.4.31, pluggy-0.4.0 -- c:\python27\python.exe

cachedir: .cache

rootdir: C:\Python27, inifile:

collected 0 items / 1 errors

=================================== ERRORS ====================================

___________________ ERROR collecting test_mod_pppoe_disc.py ___________________

lib\site-packages\py_path\local.py:650: in pyimport

import(modname)

lib\site-packages\pytest-3.0.3-py2.7.egg_pytest\assertion\rewrite.py:131: in find_module

source_stat, co = _rewrite_test(self.config, fn_pypath)

lib\site-packages\pytest-3.0.3-py2.7.egg_pytest\assertion\rewrite.py:322: in _rewrite_test

tree = ast.parse(source)

lib\ast.py:37: in parse

return compile(source, filename, mode, PyCF_ONLY_AST)

E ValueError: invalid \x escape

!!!!!!!!!!!!!!!!!!! Interrupted: 1 errors during collection !!!!!!!!!!!!!!!!!!! =========================== 1 error in 0.21 seconds ===========================

@pytest.mark.parametrize("test_input1,test_input2,expected", [
(ARP(sha='D\x85\x00\xa2}\xad', spa='\n\xc4@=', tha='\x00\x00\x00\x00\x00\x00', tpa='\n\xc4@\x01'),"<socket._socketobject object at 0x0000000003DC8118>",0),
(ARP(sha='jrofalfeoiexad', spa='\nenkajf@=', tha='\x00\x00\x00\x02jfcalkfel', tpa='\n\xcjfeiafa1'),"<socket._socketobject object at 0x0000000003D2BD48>",0),
(ARP(eioakn iejfoeajoijea),"<socket._socketobject object at 0x0000000003DC8118>",0)
])
def test_mod_arp(test_input1,test_input2,expected):
    assert mod_arp(test_input1,test_input2) == expected

Description about code: This is the code where I was getting error. I have appropriate functions defined. Working fine with first test case. Was failing with last two test cases.

1
Can you show an example file causing that error?The Compiler
This is my test code pastebin.com/BiU4xmcU. You can see that I gave three test cases. Its working fine with first test case. I am getting above errors with rest two cases. I have all relevant functions defined. I am doing this to test if my function is able to parse arp packets properly and if it is able to handle wrong packets. That's why I tried giving garbage value in place of packet in last two test cases. Now I want pytest to at least tell that parsing failed with wrong packets but not give errors like this.Kalyanam Rajashree
Basically I want to construct packet on my own and give as it is as input to my functions and test. Heard of scapy. But getting errors with scapy installation. Command prompt is just hanging up.Kalyanam Rajashree

1 Answers

7
votes

The example you pasted can be minimized a bit into this file:

import pytest

@pytest.mark.parametrize("foo", ['\n\xcjfeiafa1'])
def test_escapes(foo):
    pass

Which gives us the same error with Python 2, and a clearer error with Python 3:

/usr/lib/python3.5/site-packages/_pytest/python.py:410: in _importtestmodule
    mod = self.fspath.pyimport(ensuresyspath=importmode)
/usr/lib/python3.5/site-packages/py/_path/local.py:650: in pyimport
    __import__(modname)
E     File "/home/florian/tmp/foo.py", line 3
E       @pytest.mark.parametrize("foo", ['\n\xcjfeiafa1'])
E                                       ^
E   SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-4: truncated \xXX escape

The reason this happens is due to your \xcj escape, which is not a valid escape.