如何在SpecFlow的StepDefinitions中导入CSV示例并使用
问题描述
Feature文件代码
Feature: CheckLicense @T-1 @DataSource:licenses.csv @DataField:key=licenseNum Scenario Outline: Open site - Enter key - Search - Personal List - Get name Given Load settings When I enter '<key>' And I click on Search button And I click on Personnel List button Then I get name for '<key>'
StepDefinition类代码
using CheckLicencesTest.Drivers; using CheckLicencesTest.Pages; using OpenQA.Selenium.Chrome; using TechTalk.SpecFlow; namespace CheckLicencesTest.StepDefinitions { [Binding, Scope(Tag = "T-1")] public sealed class CheckLicenseStepDefinitions { private readonly BrowserDriver driver; private LicenseCheckPage _licenseCheckPage; private CheckDetailPage _checkDetailPage; private ContractorsDetailPage _contractorsDetailPage; public CheckLicenseStepDefinitions(BrowserDriver browserDriver) { driver = browserDriver; } [Given("Load settings")] public void GivenLoadSettings() { _licenseCheckPage = new LicenseCheckPage(driver.Current); _checkDetailPage = new CheckDetailPage(driver.Current); _contractorsDetailPage = new ContractorsDetailPage(driver.Current); } [When("I enter '(.*)'")] public void ThenIEnterKey(string key) { _licenseCheckPage.EnterKey(key); } [When("I click on Search button")] public void WhenIClickOnSearchButton() { _licenseCheckPage.ClickSearch(); } [When("I click on Personnel List button")] public void WhenIClickOnPersonnelListButton() { _checkDetailPage.ClickPersonnelLink(); } [Then("I get name for '(.*)'")] public void ThenIGetName(string key) { Console.WriteLine($"Name for {key}: {_contractorsDetailPage.GetName()}"); } } }
我在官方文档中看到他们未使用StepDefinition.cs文件,但我必须使用该文件,请问如何在StepDefinition.cs中使用CSV中的key?是否有其他将CSV数据导入StepDefinition的方法?
解决方案
方法一:直接利用SpecFlow Scenario Outline的参数传递(现有代码已支持)
你当前的写法其实已经能正常调用CSV里的key值:
- Feature文件里的
@DataSource:licenses.csv @DataField:key=licenseNum会自动把CSV中licenseNum列的数据映射到<key>参数 - StepDefinition里的
[When("I enter '(.*)'")]和[Then("I get name for '(.*)'")]通过正则捕获<key>的值,直接传入方法参数string key - 运行测试时,SpecFlow会自动遍历CSV的每一行数据,依次执行Scenario Outline
如果当前代码没生效,检查这几点:
- 确认
licenses.csv文件路径正确(默认放项目根目录,或设置为“复制到输出目录”) - CSV格式正确,第一行是表头
licenseNum,后续行是具体许可证号
方法二:手动加载CSV数据(自定义读取逻辑)
如果需要在StepDefinition里直接读取CSV全量数据,不依赖Scenario Outline的参数,可以自己写读取逻辑,推荐用CsvHelper NuGet包简化操作:
- 新增CSV读取工具类:
using CsvHelper; using System.Collections.Generic; using System.IO; using System.Globalization; namespace CheckLicencesTest.Utils { public class CsvReaderUtil { public static List<LicenseData> ReadLicenses(string filePath) { using var reader = new StreamReader(filePath); using var csv = new CsvReader(reader, CultureInfo.InvariantCulture); return csv.GetRecords<LicenseData>().ToList(); } } public class LicenseData { public string licenseNum { get; set; } // 可添加CSV中其他列的对应属性 } }
- 在StepDefinition中调用工具类读取数据:
[Given("Load settings")] public void GivenLoadSettings() { _licenseCheckPage = new LicenseCheckPage(driver.Current); _checkDetailPage = new CheckDetailPage(driver.Current); _contractorsDetailPage = new ContractorsDetailPage(driver.Current); // 读取CSV数据并存储,供后续步骤使用 var licenseList = CsvReaderUtil.ReadLicenses("licenses.csv"); }
方法三:利用ScenarioContext共享CSV数据
如果需要在多个步骤间传递CSV数据,可以通过ScenarioContext存储:
- 在StepDefinition构造函数注入
ScenarioContext:
private readonly BrowserDriver driver; private readonly ScenarioContext _scenarioContext; public CheckLicenseStepDefinitions(BrowserDriver browserDriver, ScenarioContext scenarioContext) { driver = browserDriver; _scenarioContext = scenarioContext; }
- 在
Given步骤读取CSV并存入上下文:
[Given("Load settings")] public void GivenLoadSettings() { // ...页面初始化代码 var licenseList = CsvReaderUtil.ReadLicenses("licenses.csv"); _scenarioContext.Set(licenseList, "LicenseData"); }
- 在后续步骤中取出使用:
[Then("I get name for '(.*)'")] public void ThenIGetName(string key) { var licenseList = _scenarioContext.Get<List<LicenseData>>("LicenseData"); var targetLicense = licenseList.First(l => l.licenseNum == key); Console.WriteLine($"Name for {key}: {_contractorsDetailPage.GetName()}"); }
内容的提问来源于stack exchange,提问作者Chusya
相关产品推荐
相关产品推荐

