使用 python 的单元测试时 subtest , 我对子测试中参数的命名和范围感到困惑。
上面链接中给出的规范示例似乎暗示 with self.subtest()
子句中使用的参数可以作为关键字参数传递给 subTest()
。作为引用,显示的示例是这样的:
class NumbersTest(unittest.TestCase):
def test_even(self):
"""
Test that numbers between 0 and 5 are all even.
"""
for i in range(0, 6):
with self.subTest(i=i):
self.assertEqual(i % 2, 0)
它使用一种含糊不清的约定,将内部范围的变量命名为与参数相同的名称 (i=i
)。我认为这意味着关键字参数名称被视为内部作用域变量名称。然而,当我尝试创建自己的测试时,我发现如果关键字参数的命名与用作参数输入的外部范围变量的命名不完全相同,PyCharm 和 python 解释器都会提示未解析的引用。
即:
class NumbersTest(unittest.TestCase):
def test_even(self):
"""
Test that numbers between 0 and 5 are all even.
"""
for i in range(0, 6):
with self.subTest(num=i): # <-- Renamed keyword argument parameter
self.assertEqual(num % 2, 0) # < -- Results in unresolved reference error "num"
如何将参数传递给子测试?它们在子测试代码块中是如何命名和引用的?
最佳答案
在我看来,如果在文档中对此进行更多阐述会很好,但是 API for subTest(msg=None, **params)
状态:
...msg and params are optional, arbitrary values which are displayed whenever a subtest fails, allowing you to identify them clearly.
所以看起来**params 中传递的关键字参数只是在向控制台打印测试状态时用于测试标识。它们不会以任何方式作为参数传递给代码块。
关于Python 子测试参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63673724/