当带参数的地址能被无限组合时,测试目标不应是“测遍所有地址”,而是先定义一组有效地址集合:只保留会改变页面主要内容或关键资源的参数组合,其余归并为同一代表地址。判断依据不是参数数量,而是参数是否改变服务端返回的主体内容、是否触发不同的资源请求、是否被缓存键区分。若三者都不变,把它并入代表地址更合理。
有效地址集合的边界,取决于参数对响应的实际影响。可以用一个可核对的判断动作:对同一路径保留一个基准地址,再分别只改一个参数,比较服务端返回的正文主体、关键资源清单和缓存响应头。若正文主体与关键资源清单不变,只是链接或统计标识变化,这类参数属于追踪型,通常不进入有效地址集合。
内容型参数则相反:它会让服务端返回不同的正文主体,或让页面加载不同的脚本、样式、图片。例如筛选、分页、排序、语言、货币、商品规格等,在多数实现中会改变可见内容。此时它们应进入有效地址集合,但仍要控制组合数量,而不是把每个参数的每个取值都相乘。
假设某列表页有排序、每页条数、来源追踪三个参数。排序有 3 个取值,每页条数有 3 个取值,追踪参数有任意字符串。若实测发现排序和每页条数都会改变返回的正文主体,而追踪参数不改变正文,那么有效地址集合可以定义为排序与每页条数的组合,共 9 个代表地址;追踪参数统一归并到其中一个代表地址。这个数字只是说明比较方法,不是任何站点的实际统计。
只看页面标题或可见文字容易误判。更可靠的证据是缓存键与关键资源清单:如果两个地址返回同一份缓存对象,且请求的关键资源路径集合一致,把它们视为同一有效地址通常成立。反之,如果缓存键不同、资源清单不同,即使页面看起来相似,也不应合并。
实施动作可以这样安排:先为每个候选参数组合记录响应状态、内容主体指纹、关键资源路径集合、缓存响应头。然后按指纹分组,把同组地址归并为一个代表地址。归并结果会直接影响下一步:如果归并后代表地址数量仍然很大,说明存在内容型参数组合,需要进一步确定哪些组合值得保留;如果归并后数量很小,说明大部分参数是追踪型,测试范围可以大幅缩小。
条件一:参数只影响追踪、会话或展示偏好,且不改变正文主体与关键资源清单。此时选择归并,把有效地址集合定义为路径加内容型参数的有限组合,追踪型参数不参与组合。这样做的结果是测试样本可控,后续优化动作可以落到模板或组件层。
条件二:参数会改变正文主体或关键资源清单,且组合数量随取值增长而膨胀。此时选择分层抽样,而不是全量枚举:先按参数对内容的影响程度排序,只保留影响最大的前若干组,再为每组选一个代表地址。分层依据应来自实际响应差异,而不是参数在地址中的出现顺序。
两种选择的分界不是“参数多不多”,而是“归并后是否仍能覆盖主要的内容差异”。如果归并会掩盖明显不同的加载路径,就不应归并;如果保留全部组合只是重复测量同一份响应,就应归并。
有效地址集合一旦确定,应作为测试输入的一部分固定下来,而不是每次临时决定。可以按以下顺序执行:先枚举候选参数,再对每个参数做单变量响应对比,然后按内容指纹归并,最后为保留的组合生成代表地址清单。每一步的中间结果都要保留,便于后来解释为什么某个组合被排除。
当测试结果出现与直觉相反的情况,例如参数更多的地址反而更快,不要直接归因于参数本身。先检查这些地址是否命中了不同的缓存对象、是否请求了不同数量的关键资源、是否在服务端走了不同分支。请求量、抓取量或某项统计归零,也不能单独证明归并正确;它还可能来自缓存命中、访问路径变化或测量窗口不同。把有效地址集合定义清楚,才能让后续比较建立在同一组对象上,而不是被无限组合稀释。