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

排序顺序验证断言失败:问题排查与修复方案咨询

排序测试失败原因分析与修复方案

一、失败核心原因

  1. 字符串比较逻辑与业务排序规则不匹配
    你当前使用StringComparer系列比较器直接对整个字符串做比较,但系统对该列的排序并非基于字面字符串顺序,而是基于下划线分割后的数值逻辑(比如"17_2"实际是按17和2两个数值进行排序)。例如如果业务规则是优先按下划线后的数字降序,那么"5_13"(后缀为13)应该排在"17_2"(后缀为2)前面,但字符串比较会认为"17_2"更大,导致断言失败。

  2. 特殊值未适配
    列中存在"-_1"、"--"这类非标准数值格式的值,默认字符串比较无法匹配它们在业务排序中的优先级(比如是排在所有数值前还是后)。

二、修复方案

1. 实现符合业务规则的自定义比较器

首先需要明确页面实际的排序规则(以下示例假设规则为:优先按下划线前的数字降序,再按下划线后的数字降序;特殊值"-_1"、"--"排在所有有效数值之后),然后编写自定义比较器:

public class CustomColumnDescComparer : IComparer<string>
{
    public int Compare(string x, string y)
    {
        // 标记特殊值
        bool xIsSpecial = IsSpecialValue(x);
        bool yIsSpecial = IsSpecialValue(y);

        // 处理特殊值排序
        if (xIsSpecial && yIsSpecial)
            return string.Compare(x, y, StringComparison.Ordinal);
        if (xIsSpecial)
            return 1; // 特殊值排后面,降序时y优先级更高
        if (yIsSpecial)
            return -1;

        // 分割有效数值并解析
        string[] xParts = x.Split('_');
        string[] yParts = y.Split('_');

        if (int.TryParse(xParts[0], out int xNum1) && int.TryParse(yParts[0], out int yNum1))
        {
            // 先比较下划线前的数字(降序需反转比较)
            int num1Compare = yNum1.CompareTo(xNum1);
            if (num1Compare != 0)
                return num1Compare;

            // 前一位数字相等时,比较下划线后的数字
            if (int.TryParse(xParts[1], out int xNum2) && int.TryParse(yParts[1], out int yNum2))
            {
                return yNum2.CompareTo(xNum2);
            }
        }

        // 解析失败时 fallback 到字符串降序比较
        return string.Compare(y, x, StringComparison.Ordinal);
    }

    private bool IsSpecialValue(string value)
    {
        return value == "-_1" || value == "--";
    }
}

如果是升序验证,需要对应调整比较逻辑:

public class CustomColumnAscComparer : IComparer<string>
{
    public int Compare(string x, string y)
    {
        bool xIsSpecial = IsSpecialValue(x);
        bool yIsSpecial = IsSpecialValue(y);

        if (xIsSpecial && yIsSpecial)
            return string.Compare(x, y, StringComparison.Ordinal);
        if (xIsSpecial)
            return -1; // 特殊值排前面,升序时x优先级更高
        if (yIsSpecial)
            return 1;

        string[] xParts = x.Split('_');
        string[] yParts = y.Split('_');

        if (int.TryParse(xParts[0], out int xNum1) && int.TryParse(yParts[0], out int yNum1))
        {
            int num1Compare = xNum1.CompareTo(yNum1);
            if (num1Compare != 0)
                return num1Compare;

            if (int.TryParse(xParts[1], out int xNum2) && int.TryParse(yParts[1], out int yNum2))
            {
                return xNum2.CompareTo(yNum2);
            }
        }

        return string.Compare(x, y, StringComparison.Ordinal);
    }

    private bool IsSpecialValue(string value)
    {
        return value == "-_1" || value == "--";
    }
}

2. 修改测试断言代码

将原有的默认比较器替换为自定义比较器:

var sortedColumnEntries = customPage.GetValuesForColumn(columnName);
if (customPage.Grid.Header[columnName].IsSortButtonAscending)
{
    using (new AssertionScope())
    {
        customPage.Grid.Header[columnName].IsAscending.Should().BeTrue();
        sortedColumnEntries.Should().BeInAscendingOrder(new CustomColumnAscComparer());
    }
}
else
{
    using (new AssertionScope())
    {
        customPage.Grid.Header[columnName].IsSortButtonDescending.Should().BeTrue();
        customPage.Grid.Header[columnName].IsAscending.Should().BeFalse();
        sortedColumnEntries.Should().BeInDescendingOrder(new CustomColumnDescComparer());
    }
}

3. 优化列值获取逻辑(可选)

确保获取的列值没有额外空格或隐藏字符,避免干扰比较:

// 在GetValuesForColumn方法中,返回文本时添加Trim()
return i[columnIndex].Text.Trim();

4. 确认业务规则准确性

如果自定义比较器仍不匹配,先手动触发页面排序,观察实际顺序:

  • 确认"5_13"、"17_2"等值的排列优先级
  • 确认"-_1"、"--"的位置(最前/最后)
  • 根据实际观察结果调整自定义比较器的逻辑

内容的提问来源于stack exchange,提问作者Neman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 08:55:58