坑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

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐