You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 13:25:13