2013-11-02 88 views
2

我有一些unittests集合,並希望將每個測試運行的結果存儲爲YAML文件以供進一步分析。 YAML格式的轉儲數據在幾個方面符合我的需求。但測試屬於不同的花色和結果有不同的父類,這是一個例子我有什麼:在pyyaml中表示具有相同基類的不同類的實例

>>> 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. 

每個測試都可以有自己的父類。

>>> type(rz[0]) == type(rz[1]) 
False 

我已經添加了我自己的基類與__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) 

之證件說,我可以代者爲每個類,所以我試了一下,寫了這個代碼:

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) 

同時:

>>> isinstance(rz[0], MyTestCase) 
True 

即使在那之後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 

但是,這意味着我需要註冊的所有可能發生,這就是,嗯......至少,不會看起來都很精明。其實我真正的result是更復雜的字典裏,來自不同地方的收穫測試等

>>> for x in rz: yaml.SafeDumper.add_representer(type(x), repr_testcase) 
>>> yaml.safe_dump(rz) 
... here is expected result 

所以,問題是,我在做什麼毛病__getstate__或我怎麼能做出特別基地的所有實例工作pyyaml只有一個代表註冊。

回答

5

我找到了如何使這項工作。簡單的回答是,還有另一種方式來註冊代理商,它叫做add_multi_representer。因此,解決方法是:

# Change this line: 
# yaml.SafeDumper.add_representer(MyTestCase, repr_testcase) 

# to this line: 
yaml.SafeDumper.add_multi_representer(MyTestCase, repr_testcase) 

UPD。多代理人允許做我想要實現的功能:爲基類註冊代理人。

相關問題