关于 specflow-skill
specflow-skill 是使用 SpecFlow 和 .NET 进行行为驱动测试的参考技能,涵盖 Gherkin 功能文件、步骤绑定、钩子、依赖注入和报告。
主要功能
- 01Gherkin 功能场景
- 02C# 步骤绑定
- 03场景钩子
- 04上下文注入
- 05LivingDoc HTML 报告
- 06云端执行配置
适用场景
- 01用 Gherkin 描述登录场景
- 02将步骤关联到 C# 代码
- 03在测试步骤间共享上下文
- 04生成 SpecFlow 报告
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ lambdatest/ agent-skills --skill specflow-skill安装后在 Claude Code 中输入/specflow-skill确认已加载。
附带文件reference/advanced-patterns.mdreference/playbook.md
详细介绍
SpecFlow BDD 技能
核心模式
功能文件(Features/Login.feature)
Feature: User Login
Scenario: Successful login
Given I am on the login page
When I enter "[email protected]" as email
And I enter "password123" as password
And I click the login button
Then I should see the dashboard
And the welcome message should contain "Welcome"
Scenario: Invalid credentials
Given I am on the login page
When I enter "[email protected]" as email
And I enter "wrong" as password
And I click the login button
Then I should see error "Invalid credentials"
Scenario Outline: Login with various users
Given I am on the login page
When I enter "<email>" as email
And I enter "<password>" as password
And I click the login button
Then I should see "<result>"
Examples:
| email | password | result |
| [email protected] | admin123 | Dashboard |
| [email protected] | pass123 | Dashboard |
| [email protected] | wrong | Error |
步骤绑定
using TechTalk.SpecFlow;
using NUnit.Framework;
[Binding]
public class LoginSteps
{
private readonly ScenarioContext _context;
private IWebDriver _driver;
public LoginSteps(ScenarioContext context)
{
_context = context;
_driver = (IWebDriver)_context["driver"];
}
[Given(@"I am on the login page")]
public void GivenIAmOnTheLoginPage()
{
_driver.Navigate().GoTo("http://localhost:3000/login");
}
[When(@"I enter ""(.*)"" as email")]
public void WhenIEnterEmail(string email)
{
_driver.FindElement(By.Id("email")).SendKeys(email);
}
[When(@"I enter ""(.*)"" as password")]
public void WhenIEnterPassword(string password)
{
_driver.FindElement(By.Id("password")).SendKeys(password);
}
[When(@"I click the login button")]
public void WhenIClickLogin()
{
_driver.FindElement(By.CssSelector("button[type='submit']")).Click();
}
[Then(@"I should see the dashboard")]
public void ThenIShouldSeeDashboard()
{
Assert.That(_driver.Url, Does.Contain("/dashboard"));
}
[Then(@"I should see error ""(.*)""")]
public void ThenIShouldSeeError(string error)
{
var element = _driver.FindElement(By.CssSelector(".error"));
Assert.That(element.Text, Does.Contain(error));
}
}
钩子
[Binding]
public class Hooks
{
private readonly ScenarioContext _context;
public Hooks(ScenarioContext context) { _context = context; }
[BeforeScenario]
public void BeforeScenario()
{
var driver = new ChromeDriver();
_context["driver"] = driver;
}
[AfterScenario]
public void AfterScenario()
{
((IWebDriver)_context["driver"]).Quit();
}
}
依赖注入(上下文注入)
// SpecFlow auto-injects ScenarioContext, FeatureContext, and custom POCOs
public class LoginSteps
{
private readonly LoginPage _loginPage;
public LoginSteps(LoginPage loginPage) { _loginPage = loginPage; }
}
设置:dotnet add package SpecFlow.NUnit 或 SpecFlow.xUnit
运行:dotnet test
在 TestMu AI 上进行云端执行
设置环境变量:LT_USERNAME、LT_ACCESS_KEY
// Hooks.cs
[BeforeScenario]
public void Setup()
{
var ltOptions = new Dictionary<string, object>
{
{ "user", Environment.GetEnvironmentVariable("LT_USERNAME") },
{ "accessKey", Environment.GetEnvironmentVariable("LT_ACCESS_KEY") },
{ "build", "SpecFlow Build" },
{ "name", ScenarioContext.Current.ScenarioInfo.Title },
{ "platformName", "Windows 11" },
{ "video", true },
{ "console", true },
};
var options = new ChromeOptions();
options.AddAdditionalOption("LT:Options", ltOptions);
_driver = new RemoteWebDriver(
new Uri("https://hub.lambdatest.com/wd/hub"), options);
}
报告:使用 SpecFlow+ LivingDoc 扩展生成丰富的 HTML 报告
深入了解模式
有关高级模式、调试指南、CI/CD 集成和最佳实践,
请参阅 reference/playbook.md。
评论
支持 Markdown