如何在 nosetests 中使用正则表达式(即 -m)select fixture 中的一些测试方法?

How to select some test methods in a fixture using regex (i.e. -m) in nosetests?

下面是我的问题的简化说明表示:

import sys
import nose


def test_equality_stdalone():
    assert "b" == "b"


def test_inequality_stdalone():
    assert "b" != "c"


def test_xxx_stdalone():
    assert "xxx" == "xxx"


class TestClass(object):
    def setUp(self):
        pass

    def tearDown(self):
        pass

    def test_equality(self):
        assert "a" == "a"

    def test_xxx(self):
        assert "xxx" == "xxx"


if __name__ == "__main__":
    nose.main(argv=sys.argv[:] + ["-v", "-m", ".*equality.*", __file__])

这个测试脚本在执行时产生 -

zzztest.test_equality_stdalone ... ok
zzztest.test_inequality_stdalone ... ok

----------------------------------------------------------------------
Ran 2 tests in 0.003s

OK

虽然这 -

nose.main(argv=sys.argv[:] + ["-v", "-m", ".*Class.*", __file__])

产量 -

----------------------------------------------------------------------
Ran 0 tests in 0.000s

OK

还有这个-

nose.main(argv=sys.argv[:] + ["-v", "-m", "", __file__])

产量 -

zzztest.TestClass.test_equality ... ok
zzztest.TestClass.test_xxx ... ok
zzztest.test_equality_stdalone ... ok
zzztest.test_inequality_stdalone ... ok
zzztest.test_xxx_stdalone ... ok

----------------------------------------------------------------------
Ran 5 tests in 0.004s

OK

有人可以帮我弄清楚如何 select 仅测试 TestClass 中的几个方法吗?

P.S。 - 根据文档(下方)nose.main(argv=sys.argv[:] + ["-v", "-m", ".*Class.*", __file__]) 应该至少进行了几次测试。

  -m REGEX, --match=REGEX, --testmatch=REGEX
                        Files, directories, function names, and class names
                        that match this regular expression are considered
                        tests.  Default: (?:^|[\b_\.\-])[Tt]est
                        [NOSE_TESTMATCH]

P.P.S。 - 不是 nose framework command line regex pattern matching doesnt work(-e,-m ,-i) 的重复项。 如果您阅读问题并看到我传递给 nose.main() 的 3 个不同输入,那么您会发现问题不在于“-m”过滤器根本不起作用,而是它仅适用于独立测试用例,同时始终忽略 TestClass 中的方法。

了解 nose 如何匹配它想要的测试很重要。它独立于 class 名称、函数名称和目录。看看 selector.py 来揭开谜团,但简而言之:您的正则表达式查询必须匹配 class 名称(在您的情况下为 TestClass)和 class 方法(test_equalitytest_xxx) 同时。所以如果你想 运行 TestClass.test_xxx 你可以使用类似的东西:

nosetests zzztest.py -v --match="(TestClass|test_xxx$)"
zzztest.TestClass.test_xxx ... ok

----------------------------------------------------------------------
Ran 1 test in 0.002s

OK

如果 class 不匹配为正则表达式的一部分,它的方法不会被视为测试并且根本不会根据正则表达式进行评估,因此您得到 0 个测试。

这里唯一的区别是匹配 class 测试方法但不匹配独立方法的美元符号。如果您的独立方法和 class 方法命名相同,您将无法使用 --match 正则表达式过滤器来区分两者。