我很难使用Python(3.9.7(自动在浮点值周围添加单引号,这会导致断言失败。
我的目标是使用pytest来断言解析函数的预期输出。解析器获取一个json对象(下面简称代码示例(,并返回Signal对象的列表。我在解析函数中复制了logging.debug(f"{signal_list}")
的打印输出,并将其分配给测试函数中的expected_result
#Arrange
message = json.dumps({"data":{"name":"battery_volt","alias":"Volt","unit":"volt","value":12.0,"time":1644587969}})
expected_result = [Signal(id=None, name='battery_volt', description=None, value=12.0, type=None, unit='volt', time='2022-02-11T13:59:29')]
print(expected_result)
p = Parser(message)
#Act
result = p.parse_message()
#Assert
assert result == expected_result
令人恼火的是,pytest -vv
抛出断言错误:
E Full diff:
E - [Signal(id=None, name='battery_volt', description=None, value='12.0', type=None, unit='volt', time='2022-02-11T13:59:29')]
E ? - -
E + [Signal(id=None, name='battery_volt', description=None, value=12.0, type=None, unit='volt', time='2022-02-11T13:59:29')]
上一行似乎是expected_result的值,因为print(expected_result)
还添加了围绕12.0 的单引号
我假设logging.debug(f"{signal_list}")
的复制输出与结果的实际值不相同。我尝试将expected_result类型转换为列表,str((-在测试中转换result和expected-result,但expected_result始终具有'12.0'
,result具有12.0
。
我迫切需要一个提示如何以正确的方式进行这种断言。
编辑:以下是解析函数:
def parse_message(self):
message = json.loads(self.message)
#logging.debug(f"message is: {message}")
message_data = message.get('data', {})
parsed_data = []
try:
device = message_data.get('device', None)
if device is not None:
vehicle = self.parse_vehicle(device)
parsed_data.append(vehicle)
else:
logging.error("'device' was None!")
except Exception as e:
logging.error(e)
signals = []
try:
data = message_data.get('data', None)
if data is not None:
signals = self.parse_signals(data)
gps = message_data.get('gps', None)
if gps is not None:
gps_signal = self.parse_gps(gps)
signals.append(gps_signal)
parsed_data.append(signals)
except Exception as e:
logging.error(e)
return parsed_data
if __name__ == "__main__":
setup_logging()
message = json.dumps({"consumerid":redacted,"data":{"device":{"time":1644587969,"imei":"redacted","man_id":redacted,"car_id":999,"vin":"redacted"},"data":[{"name":"battery_volt","alias":"Volt","unit":"volt","value":12.0,"time":1644587969}],"gps":{"lat":51.437515,"lon":6.9281199,"dir":252,"alt":88,"sat":19,"time":1644587969}},"event":"redacted","itemid":redacted,"itemtype":1,"senderip":"redacted"})
p = Parser(message)
signal_list = p.parse_message()
logging.debug(f"{signal_list}")
请注意,传递的json对象比原始文章中的代码示例更复杂。
class Signal(BaseModel):
id: int = None
name: str = None
description: str = None
value: str = None
type: str = None
unit: str = None
time: str = None
EDIT2-Signal.value的分配发生在此处:
def parse_signals(self, data):
signals = []
#logging.debug(f"data is : {data}")
for data_object in data:
signal = Signal()
try:
signal.name = data_object.get('name', None)
#get dtc-count value as seperate return-element, needed by the controller to handle dtc-codes
if signal.name == 'dtc_count':
self.dtc_count == data_object.get('value', None)
signal.description = data_object.get('description', None)
signal.value = data_object.get('value', None)
signal.time = datetime.datetime.utcfromtimestamp(data_object.get('time', None)).isoformat()
signal.unit = data_object.get('unit', None)
if signal.unit == "dtc":
signal.type = "1"
if signal.name is not None:
signals.append(signal)
#logging.debug(signal.__dict__)
except Exception as e:
logging.error(f"While parsing signal {data_object}, the following error occured: {e}")
return signals
当parse_message被调用为__name__ == "main":
时,下面的测试代码输出value=12.0
好吧,事实证明python类型的提示并没有像我预期的那样强制执行:
当通过__name__ == "main":
调用parse_message时,下面的测试代码输出value=12.0
。显然,尽管Signal.value的类型提示为str,12.0还是被指定为float。当我尝试sys.stdout.write(signal_list(时,我得到了一个TypeError。
我现在只需str((-在parse_signals((中进行转换,如下
signal.value = str(data_object.get('value', None))
从而使我的价值在单引号中保持一致。