Python pytest.raises上下文管理器中的块未执行

Python pytest.raises上下文管理器中的块未执行,python,testing,pytest,tokenize,python-3.8,Python,Testing,Pytest,Tokenize,Python 3.8,我一直在为我在空闲时间开发的一种小语言编写一个标记器,我想用负输入测试它。我的代码会引发两种异常s,一种是缩进错误,另一种是语法错误,看起来是这样的 类标记器: def uuu init uuu(self,source:str)->无: self.source=源 ... def get_next_令牌(自我)->令牌: “”“返回下一个标记并将位置指针前进到self.source”“” ... def令牌化(自)->生成器[令牌,无,无]: “”“在扫描所有self.source之前调用get

我一直在为我在空闲时间开发的一种小语言编写一个标记器,我想用负输入测试它。我的代码会引发两种
异常
s,一种是
缩进错误
,另一种是
语法错误
,看起来是这样的

类标记器:
def uuu init uuu(self,source:str)->无:
self.source=源
...
def get_next_令牌(自我)->令牌:
“”“返回下一个标记并将位置指针前进到self.source”“”
...
def令牌化(自)->生成器[令牌,无,无]:
“”“在扫描所有self.source之前调用get\u next\u令牌”
...
然后在测试中,我有各种输入的列表。例如:

SYNTAX\u ERROR\u SOURCES=[“(}”、“[}”、“{]”、“a@b“]#请注意@不是受支持的操作数
然后其中一个测试函数如下所示:

@pytest.mark.parametrize(“源”,语法错误\u源)
def测试\标记化\失败\语法\错误(来源:str)->无:
使用pytest.raises(SyntaxError):
标记器(源).tokenize()
问题是,
tokenize
从未在上下文管理器中被调用,我不知道为什么。我可以通过在调试器下运行代码来确认这一点。当它到达调用
tokenize
的行时,它直接转到某个
pytest
代码,然后测试失败,出现
失败:未引发
而不进入
标记化

另外,如果我使用
python-tokenizer.py”作为脚本执行tokenizer.pya@b“
然后一切正常,程序退出时出现语法错误,正如预期的那样


有人遇到过类似的情况吗?

尝试注释掉“pytest.raises”行。尝试添加一些打印语句,在测试中,在Tokenizer
\uuuu init\uuuu
方法和tokenize()中方法。是否确定在此测试函数定义之前初始化了SYNTAX_ERROR_SOURCES?注释掉
pytest。引发
行将导致所有测试通过。根据调试器,SYNTAX_ERROR_SOURCES在测试函数之前初始化,并且source参数具有正确的值。还添加了
print
标记化语句进一步确认它不会被调用,因为不会打印任何内容。在这一点上,我通常会发现我正在测试的代码与我正在编辑的代码不同。至于添加
print
语句,将它们添加到未被调用的函数中不会给您带来太多帮助-将它们添加到周围的co中好吧,我确信我正在测试的代码就是我正在编辑的代码,因为除了我正在使用的
pytest之外,所有其他函数都会打印
print
语句。在中引发了
。我想,我会在Github上打开一个问题。谢谢你的帮助。这不是pytest中的错误-这只是生成器的工作方式。实际的代码是t引发SyntaxError直到您尝试使用tokenize()返回的生成器时才会被调用。您不必在列表中换行,只需换行next(),我认为这将更好地传达您期望第一次标记化失败的信息。