Mik*_*kin 2 python yaml pyyaml
我有一些单元测试,并希望将每个测试运行的结果存储为YAML文件以供进一步分析.YAML格式的转储数据以多种方式满足我的需求.但测试属于不同的西装,结果有不同的父类,这是我的例子:
>>> rz # shorthand for result
[<upstream_suite.fftest.SimpleTest testMethod=test_is_fsType_not_set>,
<upstream_suite.openfolder.UfoOpenTest testMethod=test_is_A>,
<upstream_suite.openfolder.UfoOpenTest testMethod=test_is_A_a_glyph_instance>,
<upstream_suite.openfolder.UfoOpenTest testMethod=test_is_ended_ufo>,
<upstream_suite.openfolder.UfoOpenTest testMethod=test_is_folder>,
<upstream_suite.openfolder.UfoOpenTest testMethod=test_is_fsType_eq_1>,
<upstream_suite.openfolder.UfoOpenTest testMethod=test_it_exists>]
# etc.
Run Code Online (Sandbox Code Playgroud)
每个测试都可以有自己的父类.
>>> type(rz[0]) == type(rz[1])
False
Run Code Online (Sandbox Code Playgroud)
我已经使用__getstate__方法为所有类添加了我自己的基类,但由于某些原因它不起作用:
>>> rz[0].__getstate__()
{'targets': ['upstream'], 'methodDoc': 'Is the OS/2 table fsType set to 0?', 'methodName': 'test_is_fsType_not_set', 'tool': 'FontForge', 'name': 'upstream_suite.fftest'}
>>> yaml.safe_dump(rz[0])
*** RepresenterError: cannot represent an object: test_is_fsType_not_set (upstream_suite.fftest.SimpleTest)
Run Code Online (Sandbox Code Playgroud)
Documentations说我可以为每个类创建代表,所以我尝试了并编写了这段代码:
import yaml
from somepath import MyTestCase
def repr_testcase(dumper, data):
return dumper.represent_mapping(u'tag:yaml.org,2002:map', {
'methodDoc': data._testMethodDoc,
'tool': data.tool,
'name': data.name,
'methodName': data._testMethodName,
'targets': data.targets,
})
# Register representer
yaml.SafeDumper.add_representer(MyTestCase, repr_testcase)
Run Code Online (Sandbox Code Playgroud)
同一时间:
>>> isinstance(rz[0], MyTestCase)
True
Run Code Online (Sandbox Code Playgroud)
即使在那之后safe_dump也行不通.但是,如果我做了这个技巧,那么它可以工作,我可以得到结果:
>>> yaml.SafeDumper.add_representer(type(rz[0]), repr_testcase)
>>> print(yaml.safe_dump(rz[0]))
methodDoc: Is the OS/2 table fsType set to 0?
methodName: test_is_fsType_not_set
name: checker.upstream_suite.fontforge_suite.fftest
targets: [upstream]
tool: FontForge
Run Code Online (Sandbox Code Playgroud)
但这意味着我需要注册所有可能的事件,这是,至少,看起来并不聪明.实际上我的真实result是更复杂的字典,从不同的地方收集的测试等.
>>> for x in rz: yaml.SafeDumper.add_representer(type(x), repr_testcase)
>>> yaml.safe_dump(rz)
... here is expected result
Run Code Online (Sandbox Code Playgroud)
所以,问题是,我做错了什么__getstate__或如何使用只有一个代表注册的特定基类的所有实例来创建工作pyyaml.
我找到了如何使这项工作的方式.简短的回答是,还有另一种方法来注册它所称的代表add_multi_representer.所以修复是:
# Change this line:
# yaml.SafeDumper.add_representer(MyTestCase, repr_testcase)
# to this line:
yaml.SafeDumper.add_multi_representer(MyTestCase, repr_testcase)
Run Code Online (Sandbox Code Playgroud)
更新.多代表允许我做出我想要实现的目标:为基类注册代表.
| 归档时间: |
|
| 查看次数: |
787 次 |
| 最近记录: |