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

Selenium C#+NUnit多列Excel测试数据处理的最优方案

处理大量列Excel数据的NUnit数据驱动测试方案

用DTO(数据传输对象)封装Excel测试数据完全是合理且符合行业标准的做法,这正是解决参数爆炸问题的最优解。下面是具体落地步骤和实现示例:

1. 定义对应Excel结构的DTO类

创建与Excel列一一对应的类,每个属性对应一列,属性名可直接匹配Excel列名,或通过自定义特性关联:

// 直接匹配列名的简单DTO
public class FormTestDataDto
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int Age { get; set; }
    // ... 剩余50+个字段依次定义
}

// 列名与属性名不一致时,用自定义特性映射
public class ExcelColumnAttribute : Attribute
{
    public string ColumnName { get; }
    public ExcelColumnAttribute(string columnName) => ColumnName = columnName;
}

public class FormTestDataDto
{
    [ExcelColumn("First Name")]
    public string FirstName { get; set; }
    // ... 其他带特性的属性
}

2. 改造TestCaseSource方法,返回DTO集合

修改数据提取方法,让它返回IEnumerable<FormTestDataDto>而非多参数的对象数组:

public static IEnumerable<FormTestDataDto> ExtractFormTestData(string excelFileName)
{
    var testDataList = new List<FormTestDataDto>();
    
    // 用EPPlus读取Excel文件示例
    using (var package = new ExcelPackage(new FileInfo(excelFileName)))
    {
        var worksheet = package.Workbook.Worksheets.First();
        int rowCount = worksheet.Dimension.Rows;
        int colCount = worksheet.Dimension.Columns;

        // 读取表头列名(假设第一行是表头)
        var columnNames = Enumerable.Range(1, colCount)
            .Select(col => worksheet.Cells[1, col].Text)
            .ToList();

        // 遍历数据行(从第二行开始)
        for (int row = 2; row <= rowCount; row++)
        {
            var dto = new FormTestDataDto();
            // 手动映射或用反射/AutoMapper简化代码
            for (int col = 1; col <= colCount; col++)
            {
                string columnName = columnNames[col-1];
                string cellValue = worksheet.Cells[row, col].Text;
                
                switch(columnName)
                {
                    case "First Name":
                        dto.FirstName = cellValue;
                        break;
                    case "Last Name":
                        dto.LastName = cellValue;
                        break;
                    case "Age":
                        dto.Age = int.TryParse(cellValue, out int age) ? age : 0;
                        break;
                    // ... 其他字段映射逻辑
                }
            }
            testDataList.Add(dto);
        }
    }
    
    return testDataList;
}

如果手动映射太繁琐,可使用AutoMapper自动匹配列名与属性名,或用反射遍历DTO属性完成赋值,减少重复代码。

3. 简化测试方法参数

测试方法只需接收一个DTO参数,彻底告别几十个参数的混乱:

[TestCaseSource(nameof(ExtractFormTestData), new object[] { "FormTestData.xlsx" })]
public void SubmitFormTest(FormTestDataDto testData)
{
    // 直接用DTO属性填充表单
    driver.FindElement(By.Id("firstName")).SendKeys(testData.FirstName);
    driver.FindElement(By.Id("lastName")).SendKeys(testData.LastName);
    driver.FindElement(By.Id("age")).SendKeys(testData.Age.ToString());
    // ... 其他字段填充逻辑
    driver.FindElement(By.Id("submitBtn")).Click();
    
    // 断言验证
    Assert.AreEqual("提交成功", driver.FindElement(By.Id("successMsg")).Text);
}

其他可选方案(不推荐,仅作参考)

  • ExpandoObject:动态对象无需预定义类,但失去类型安全,调试和重构难度大。
  • Dictionary<string, object>:用字典存储键值对,但缺乏类型检查,代码可读性差。

相比之下,DTO具备类型安全、可读性高、易于维护的优势,是处理大量列测试数据的首选方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 07:10:31