如何为ELM中的List.partition函数编写模糊测试?
如何为Elm的List.partition编写模糊测试?
首先得明确模糊测试的核心:自动生成大量随机输入,验证输出是否符合我们定义的规则,不用手动一个个写测试用例,尤其适合覆盖各种边界场景。
针对你给出的List.partition函数,我们先梳理它必须满足的核心规则:
- 输出的第一个列表,所有元素都严格小于基准值(pivot)
- 输出的第二个列表,所有元素都大于等于基准值
- 两个列表的元素合并后,和原列表的元素完全一致(数量、种类都不缺,排序后与原列表排序结果一致)
- 两个列表的长度之和等于原列表的长度
接下来用Elm的elm-test库(自带模糊测试模块)来写测试,步骤如下:
1. 导入必要的模块
import Test exposing (Test, describe, fuzz, assert) import Fuzz exposing (int, list) import List exposing (partition, all, sort, length)
2. 编写模糊测试用例
partitionTests : Test partitionTests = describe "List.partition 模糊测试" -- 验证拆分后的列表符合元素范围规则 [ fuzz2 int (list int) "所有小于基准值的元素都在第一个列表,其余在第二个" <| \pivot inputList -> let (lessThan, greaterOrEqual) = partition pivot inputList in assert (all (\x -> x < pivot) lessThan) |> assert (all (\x -> x >= pivot) greaterOrEqual) -- 验证元素无丢失、无新增 , fuzz2 int (list int) "拆分后合并的元素与原列表完全一致(排序后)" <| \pivot inputList -> let (lessThan, greaterOrEqual) = partition pivot inputList combined = lessThan ++ greaterOrEqual in assert (sort combined == sort inputList) -- 验证长度之和匹配 , fuzz2 int (list int) "两个子列表长度之和等于原列表长度" <| \pivot inputList -> let (lessThan, greaterOrEqual) = partition pivot inputList in assert (length lessThan + length greaterOrEqual == length inputList) ]
测试的作用说明
- 第一个测试是核心:直接验证
partition的功能逻辑是否正确,比如如果不小心把x >= pivot写成x > pivot,模糊测试会自动生成包含基准值的列表,触发测试失败。 - 第二个测试防止出现元素丢失或重复的bug,比如函数逻辑错误导致某些元素被过滤掉。
- 第三个测试是辅助验证,虽然第二个测试已经能覆盖,但单独写出来更直观。
模糊测试的好处在于,它会自动帮你覆盖各种边界场景:空列表、所有元素都小于基准值、所有元素都大于等于基准值、基准值是列表中的最大值/最小值、包含重复元素的列表等等,不用你手动构造这些用例。
内容的提问来源于stack exchange,提问作者Vulsan Bianca
相关产品推荐
相关产品推荐

