我正在尝试编写一个SpecFlow测试,我测试当我的应用程序读取某个文件夹和文件结构时会发生什么。我想在我的项目中包含这些文件夹和文件,因此测试不仅仅在我自己的计算机上运行。
例如,我的Specs项目中有两个文件夹。一个名为'SimpleTestModel',另一个名为'ComplexTestModel'。如何在SpecFlow测试中引用这些文件夹?
答案 0 :(得分:4)
您需要Test Fixture。
来自Wikipedia:
在软件测试中,测试夹具是被测软件的固定状态,用作运行测试的基线;也称为测试环境。它还可以指为使系统进入这种状态而执行的操作。
灯具示例:
- 使用特定的已知数据集加载数据库
- 删除硬盘并安装已知的干净操作系统安装
- 复制特定的已知文件集
- 准备输入数据以及设置/创建虚假或模拟对象
用于系统地对被测软件进行可重复测试的软件称为测试工具;其部分工作是建立合适的测试装置。
针对您的具体问题:
在SpecFlow测试项目中创建一个Fixtures
目录。在里面,根据你的测试创建任意数量的子目录,以设置你需要的目录和文件结构。
在App.config条目中添加<appSettings>
定义所有测试装置的根文件夹
<configuration>
...
<appSettings>
<!-- Path relative to the build output directory -->
<add name="FixturesRootDirectory" value="..\..\Fixtures" />
</appSettings>
...
</configuration>
在[BeforeScenario]
挂钩中,设置当前场景上下文中fixtures目录的绝对路径(参考:How do I get the path of the assembly the code is in?)
using System.Configuration;
using System.IO;
using TechTalk.SpecFlow;
namespace Foo
{
[Binding]
public class CommonHooks
{
[BeforeScenario]
public void BeforeScenario()
{
InitFixturesPath();
}
private void InitFixturesPath()
{
if (ScenarioContext.Current.ContainsKey("FixturesPath"))
return;
string codeBase = Path.GetDirectoryName(Assembly.GetExecutingAssembly().CodeBase)
+ Path.DirectorySeparatorChar
+ ConfigurationManager.AppSettings["FixturesRootDirectory"];
UriBuilder uri = new UriBuilder(codeBase);
string path = Uri.UnescapeDataString(uri.Path);
ScenarioContext.Current.Set<string>("FixturesPath", Path.GetDirectoryName(path));
}
}
}
现在您可以使用ScenarioContext.Current.Get<string>("FixturesPath")
获取所有灯具的根目录。你甚至可以编写自己的Fixtures辅助类:
public static class FixturesHelper
{
public static string Path { get; set; }
// other methods and properties making it easier to use fixtures
}