PyCharm上的Python unittest有时会通过而不更改SUT中的任何代码

2024-09-29 19:33:25 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我遇到的第一个问题。我有一个类和相应的单元测试。测试随机通过/失败,被测类没有任何变化。我的意思是我按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

下面是测试类(文件的全部内容)

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()

(也请原谅我提出的测试用例,我知道)


Tags: nameselfagedeftypexmlelementresult
1条回答
网友
1楼 · 发布于 2024-09-29 19:33:25

dict没有可预测的迭代顺序。当您在vars(element)上迭代时:

attrs = vars(element)
self.xml_result += indent + '<' + element.__class__.__name__ + '>\n'
for attr in attrs:

测试的每次运行都将以自己的任意顺序进行迭代。根据解释器实现和设置的具体情况,这可能是相当一致的,或者是随机的,也可能是以几乎任何方式表现的。您可能使用的是python3,其中字符串哈希代码是随机的。你知道吗

不要依赖于dict迭代顺序。你知道吗

相关问题 更多 >

    热门问题