如何在 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_equality
或 test_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
正则表达式过滤器来区分两者。
下面是我的问题的简化说明表示:
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_equality
或 test_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
正则表达式过滤器来区分两者。