- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
当我为框架创建测试时,我开始注意到以下模式:
class SomeTestCase(unittest.TestCase):
def test_feat_true(self):
_test_feat(self, True)
def test_feat_false(self):
_test_feat(self, False)
def _test_feat(self, arg):
pass # test logic goes here
所以我想以编程方式为这些类型的带有元类的测试类创建 test_feat_*
方法。换句话说,对于每个带有签名 _test_{featname}(self, arg)
的私有(private)方法,我想要两个带有签名 test_{featname}_true(self) 的顶级可发现方法
和 test_{featname}_false(self)
被创建。
我想到了类似的东西:
#!/usr/bin/env python
import unittest
class TestMaker(type):
def __new__(cls, name, bases, attrs):
callables = dict([
(meth_name, meth) for (meth_name, meth) in attrs.items() if
meth_name.startswith('_test')
])
for meth_name, meth in callables.items():
assert callable(meth)
_, _, testname = meth_name.partition('_test')
# inject methods: test{testname}_{[false,true]}(self)
for suffix, arg in (('false', False), ('true', True)):
testable_name = 'test{0}{1}'.format(testname, suffix)
attrs[testable_name] = lambda self: meth(self, arg)
return type.__new__(cls, name, bases, attrs)
class TestCase(unittest.TestCase):
__metaclass__ = TestMaker
def _test_this(self, arg):
print 'this: ' + str(arg)
def _test_that(self, arg):
print 'that: ' + str(arg)
if __name__ == '__main__':
unittest.main()
我希望得到如下输出:
this: False
this: True
that: False
that: True
但是我得到的是:
$ ./test_meta.py
that: True
.that: True
.that: True
.that: True
.
----------------------------------------------------------------------
Ran 4 tests in 0.000s
OK
看起来我缺少一些关闭规则。我该如何解决这个问题?有没有更好的方法?
谢谢,
编辑:已修复。请参阅:the snippet .
最佳答案
确实是闭包问题:
改变
attrs[testable_name] = lambda self: meth(self, arg)
到
attrs[testable_name] = lambda self,meth=meth,arg=arg: meth(self, arg)
通过使用默认值,lambda 内部的 arg
绑定(bind)到在循环的每次迭代期间设置的默认值 arg
。如果没有默认值,arg
将在循环的所有迭代完成后采用 arg
的最后一个值。 (meth
也是如此)。
关于python - 单元测试和元类 : automatic test_* method generation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5175942/
我正在阅读 LevelDB 中的代码,并且不断遇到所使用的 TEST_ 前缀。我希望 TEST_ 表明此方法用于测试,以便能够对不会公开的内部结构进行操作。因此,我预计这些都不会出现在任何关键路径中。
如何在 phpMyAdmin 中运行命令,该命令将删除数据库中具有前缀 test_ 的所有列。 最佳答案 要从表中删除列,请使用以下语法: alter table drop column 要查找数
我如何在 phpMyAdmin 中运行一条命令,该命令将删除数据库中前缀为 test_ 的所有列。 最佳答案 要从表中删除列,请使用语法: alter table drop column 要查找数
当我为框架创建测试时,我开始注意到以下模式: class SomeTestCase(unittest.TestCase): def test_feat_true(self):
我刚刚将 tests.py 文件移动到一个名为tests的新目录,然后我在其中添加了__init__.py文件,但是当我运行测试时python manage.py test 它说在 0.000 秒内运
我正在使用 Python 3.4.1 和单元测试模块来验证另一个软件。 需要运行另一个软件,并且其输出必须由 python 脚本解析以进行验证。输出文件是一个包含未知数量元素的 XML 文件。 目前,
我的包中有多个模块。 package/ |--mod1.py |--mod2.py 每个模块都包含一些函数和一个用于测试模块的test_function。 我正在使用sphinx-apidoc为pac
这是 unittest and metaclass: automatic test_* method generation 的后续问题: 对于这个(固定的)unittest.TestCase 布局:
我喜欢将测试程序的输出记录到带有时间戳的日志文件中。 我创建了以下 Makefile,但它不起作用。 “make”似乎在最后一刻根据需要计算 LOGFILE。 生成文件 LOGFILE=`date +
我是一名优秀的程序员,十分优秀!