首页 > 解决方案 > Python 子测试参数

问题描述

使用 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 解释器都会抱怨未解析的引用。

IE:

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"

如何将参数传递给子测试?它们是如何在子测试代码块中命名和引用的?

标签: pythonpython-unittest

解决方案


在我看来,如果在文档中对此进行更多说明会很好,但是用于状态的API :subTest(msg=None, **params)

...msg 和 params 是可选的,任意值,只要子测试失败就会显示,让您清楚地识别它们。

所以看起来**params中传递的关键字参数仅用于在将测试状态打印到控制台时进行测试识别。它们不会以任何方式作为参数传递给代码块。


推荐阅读