python--那些年踩过的坑系列--特殊的数据处理
坑1 ---- float数据类型nan
问题描述:
一条 pytest 用例在docker外也就是linux环境上运行每次都pass ,但是放入docker运行就会出现用例 assert 失败情况。
背景代码如下:
功能是用 tshark解析pcap流量包
class xxx:
xxxx
def xx(self):
run_cmd, row_name_lst = Read_pcap(self.obj, pcap_file = filepath, save_dir = self.anlyse_pcap_path).gptp_cmd(y_str = y_str)
# docker run --rm --privileged --net=host --pid=host -v /root/obf_test_framework/reports/product_datas/emac0.pcap:/emac0.pcap toendeavour/tshark:latest -r /emac0.pcap -Y "ptp and ptp.v2.message_type == 3" -T fields -e frame.number -e frame.time_epoch -e frame.time_delta_displayed -e eth.dst -e eth.src -e eth.type -e vlan.id -e frame.len -e ptp.v2.subdomainnumber -e ptp.v2.sequenceid -e ptp.v2.message_type
ss = Macro.subprocess_execute(run_cmd)
data_io = StringIO(ss[1])
df1 = pd.read_csv(data_io, sep="\t", header=None, names=row_name_lst, dtype={"dlt": str})
lst = df1["dlt"].str.split(', ').explode().tolist()
logger.info(f"本次测试初始结果:{lst}")
if len(lst) < 2:
logger.error(f"当前数据量小于2, 默认错误, 实际: {len(lst)}")
return False
values = [float(x) for x in lst if x!= "nan" and x != "0.0" and x!= "0.000000000"]
初始运行结果:
用例失败分析:
直接原因
根据上述运行日志显示,因为nan导致出现了false情况 。但是代码里:
values = [float(x) for x in lst if x!= "nan" and x != "0.0" and x!= "0.000000000"] 也过滤了"nan"。
排查方向
把for x in lst 中x的信息打印出来看一下,在上述代码中插入,重新执行
for x in lst :
logger.info(f"{x}: {type(x)}")

结论:
1. 由于nan作为 “Not a Number”(非数),代码 lst = df1["dlt"].str.split(', ').explode().tolist() 未成功转成str格式,所以之后的过滤失败
2. 另外如果不在docker内执行用例,虽然也是单独调用的 单tshark docker容器,但不会出现nan,就不会使用例执行失败。
解决方案:
将 values = [float(x) for x in lst if x != "nan" and x != "0.0" and x!= "0.000000000"]
改成 values = [float(x) for x in lst if str(x) != "nan" and x != "0.0" and x!= "0.000000000"]
再次强转str即可
坑2 ---- assert ”Fasle“ 是True
背景:
前面一部分代码,将一个判断结果“False”写入文档,其他用例函数读这个文件内的“False”后,再去assert 它,每次返回都是True 用例pass了,很明显出现了问题
分析方法:
1.直接logger打印该值和类型 ,很明显,文件读到的是str格式,assert的话就是pass的
2.bool(res) 用bool来转一下试试, bool函数使用,其中res的值只要不为空也都是True,不行

解决方法:
直接通过==来判断出bool类型即可 ,最初的代码直接改成
return data_0.lower() == "true" 得到了 我们希望的bool False

更多推荐
所有评论(0)