问题是我遇到过的第一个问题。我有一个班级和相应的单元测试。测试通过/失败,对测试类没有任何改变。我的意思是我按 shift + F10 并立即再次按下它。一个通过另一个失败。
这是班级(但看起来有点脏。请原谅我)
class XmlSerializer:
def __init__(self, int_repr = 'int', str_repr = 'str'):
"""@int_repr: integer type representation (default: 'int')
@str_repr : string type representation (default: 'str')"""
self.xml_result = []
self.__int_repr = int_repr
self.__str_repr = str_repr
def serialize(self, element):
self.xml_result = []
self.__recurse2(element, indent='')
return ''.join(self.xml_result)
def __recurse2(self, element, indent):
if isinstance(element, int):
self.xml_result += indent + '\t<' + self.__int_repr + '>' + str(element) + '</' + self.__int_repr + '>\n'
if isinstance(element, str):
self.xml_result += indent + '\t<' + self.__str_repr + '>' + str(element) + '</' + self.__str_repr + '>\n'
elif type(element) in [type(list()), type(tuple()), type(dict())]:
for el in element:
self.__recurse2(el, indent + '\t')
else:
try: # Attribute names are printed only here
attrs = vars(element)
self.xml_result += indent + '<' + element.__class__.__name__ + '>\n'
for attr in attrs:
self.xml_result += indent + '\t' + '<'+ attr +'>\n'
self.__recurse2(attrs[attr], indent + '\t')
self.xml_result += indent + '\t' + '</'+ attr +'>\n'
self.xml_result += indent + '</' + element.__class__.__name__ + '>\n'
except Exception as ex:
pass
这是Test Class(文件的全部内容)
import unittest
from string_and_regex.xml_stuff import XmlSerializer
class Person:
def __init__(self):
self.name = "Sam"
self.age = 26
class Group:
def __init__(self):
self.name = 'sample object'
self.people = [Person(), Person()]
group_serialized = '<Group>\n' \
'\t<name>\n' \
'\t\t<str>sample object</str>\n' \
'\t</name>\n' \
'\t<people>\n' \
'\t\t<Person>\n' \
'\t\t\t<name>\n' \
'\t\t\t\t<str>Sam</str>\n' \
'\t\t\t</name>\n' \
'\t\t\t<age>\n' \
'\t\t\t\t<int>26</int>\n' \
'\t\t\t</age>\n' \
'\t\t</Person>\n' \
'\t\t<Person>\n' \
'\t\t\t<name>\n' \
'\t\t\t\t<str>Sam</str>\n' \
'\t\t\t</name>\n' \
'\t\t\t<age>\n' \
'\t\t\t\t<int>26</int>\n' \
'\t\t\t</age>\n' \
'\t\t</Person>\n' \
'\t</people>\n' \
"</Group>\n"
class TestXmlSerializer(unittest.TestCase):
def test_serialize(self):
serializer = XmlSerializer()
xml_result = serializer.serialize(Group())
self.assertEquals(group_serialized, xml_result)
if __name__ == '__main__':
unittest.main()
(同样请原谅我提出的测试用例,我知道)
答案 0 :(得分:0)
Dicts没有可预测的迭代顺序。当您遍历vars(element)
:
attrs = vars(element)
self.xml_result += indent + '<' + element.__class__.__name__ + '>\n'
for attr in attrs:
您的测试的每次运行都将按照自己的任意顺序进行迭代。这可能是相当一致的,或随机的,或者它可能以几乎任何方式运行,具体取决于解释器实现和设置的细节。您可能在Python 3上,其中字符串哈希码是随机的。
不要依赖于dict迭代顺序。