Python assert校验多边形面积<500ha时超阈值仍通过问题排查
问题根因
你遇到的打印面积超标但断言不触发的问题,来自两个低级代码错误:
- 变量名写错:投影后得到的正确面积对象是
geom_area,你打印公顷数时直接用geom_area.area算出了正确结果,但给total_area赋值时错用了未在当前逻辑中定义的poly_area变量,total_area存的根本不是当前多边形的面积。 - 测试逻辑完全和计算逻辑脱钩:面积计算写在全局作用域,测试函数直接读全局的
total_area,根本没有在测试流程里传入你准备的超标测试数据重新计算面积。只要之前运行过的逻辑给全局的poly_area赋过小于500的对应值,total_area就会一直是小于500的数,不管你传什么测试数据,断言都能通过——你看到的打印输出是对的,是因为打印语句没用到写错的total_area变量,直接算了正确值而已。
修复代码
把面积计算封装成独立函数,测试时传入对应测试数据实时计算结果,彻底去掉全局变量依赖,同时修正变量名错误:
from itertools import chain from shapely.geometry import Polygon from shapely.ops import transform from functools import partial import pyproj def get_polygon_area_ha(feature): geom = feature['geometry']['coordinates'] polygon = Polygon(list(chain(*geom))) projected_poly = transform( partial( pyproj.transform, pyproj.Proj(init='EPSG:4326'), pyproj.Proj( proj='aea', lat_1=polygon.bounds[1], lat_2=polygon.bounds[3] ) ), polygon) # 平方米转公顷(1公顷=10000平方米),保留1位小数 return round(projected_poly.area / 10000, 1) def test_area_max_500_ha(): # 替换为你的超标测试feature数据 test_feature = {} area_ha = get_polygon_area_ha(test_feature) print(f"实测多边形面积:{area_ha}公顷") assert area_ha < 500
额外提醒:写测试用例不要依赖全局变量存储计算结果,测试框架的用例执行顺序不固定,全局变量很容易被其他逻辑污染,导致测试结果完全不可信。
内容的提问来源于stack exchange,提问作者Where_am_I
相关产品推荐
相关产品推荐

