SpecFlow 是一个框架,允许开发人员和业务人员以可执行规范的形式协作定义系统的业务功能,这些规范可以重复和一致地运行,并用作定义系统应该如何运行的“活文档”系统在任何给定点。为了有效地做到这一点,需要从外向内编写规范,即点击应用程序的入口点,对于基于 Web 的应用程序来说,入口点可以是网站 URL 或某种服务端点,并为此目的验证业务需求观点。要回答您的问题:
验收测试是实时产品的端到端测试吗?我读过一些是的,一些不是的。我应该进行端到端测试还是应该只对 c#、javascript 进行单元测试,并可能在 webapi 路由上进行一些集成测试?
验收测试是其中很大一部分,但不应孤立地进行。如果您正在使用集成测试,或者验证外部系统是否按预期进行通信,您可能还需要实际访问您的数据存储的集成测试。您当然应该对您的各个组件进行单元测试并酌情模拟/排除依赖关系,但这不会告诉您系统的不同层是否作为一个整体相互依赖地运行。这就是 SpecFlow 真正闪耀的地方。我不一定提倡在您的实时站点上运行验收测试,但是专门为验证验收测试设置一个实时镜像将是一项非常值得的努力,最好是作为您的 CI 构建过程的一部分。
是否可以使用 Specflow 编写操作浏览器的测试?我应该使用 Ranorex 或 Selenium 之类的东西进行端到端吗?
绝对有可能。您可以使用Selenium WebDriver或类似Watin(Selenium 的 .NET 包装器)之类的东西。上次我查看时,Watin 只在 IE 中工作。它可以与 Firefox 3.6 一起使用,但是当他们发布 5 时,FF 核心的变化停止了它的工作。很遗憾,因为它是一个非常好的框架。SpecFlow 提供了可用于在每次测试运行期间启动和关闭浏览器的挂钩。下面是一个使用 Selenium WebDriver 的简单示例:
[Binding]
public class FeatureHooks
{
[BeforeFeature]
public static void StartWebDriver()
{
Runner.InitialiseHost(HostTypeOption.Firefox);
}
[AfterFeature]
public static void StopWebDriver()
{
Runner.StopHost();
}
}
Runner 是一个静态类,我将其用作我正在开发的页面框架的一部分,以帮助实现验收测试自动化。这是主机初始化部分:
public static class Runner
{
internal static IWebDriver Host { get; private set; }
public static void InitialiseHost(HostTypeOption hostType, int windowWidth = 1024, int windowHeight = 768)
{
switch (hostType)
{
case HostTypeOption.Firefox:
Host = new FirefoxDriver();
break;
case HostTypeOption.InternetExplorer:
Host = new InternetExplorerDriver();
break;
case HostTypeOption.Chrome:
Host = new ChromeDriver();
break;
case HostTypeOption.Safari:
Host = new SafariDriver();
break;
default:
throw new ArgumentOutOfRangeException("hostType");
}
Host.Manage().Window.Size = new System.Drawing.Size(windowWidth, windowHeight);
Host.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(3));
}
public static void StopHost()
{
Host.Quit();
Host = null;
}
}
如果您想使用 IE 或 Chrome,您需要下载特定的驱动程序并将其添加到验收测试项目的 bin 目录中,但 Firefox 可以正常工作。