Python SubTest参数

问题描述

在使用python的unittest 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和params是可选的,显示的任意值 每当子测试失败时,您就可以清楚地识别它们。

因此,在将测试状态打印到控制台时,似乎在** params中传递的关键字参数似乎仅用于测试标识。它们不会以任何方式作为参数传递给代码块。