使用SpecFlow测试引用项目中的文件夹

时间:2015-01-22 13:03:39

标签: c# .net specflow

我正在尝试编写一个SpecFlow测试,我测试当我的应用程序读取某个文件夹和文件结构时会发生什么。我想在我的项目中包含这些文件夹和文件,因此测试不仅仅在我自己的计算机上运行。

例如,我的Specs项目中有两个文件夹。一个名为'SimpleTestModel',另一个名为'ComplexTestModel'。如何在SpecFlow测试中引用这些文件夹?

1 个答案:

答案 0 :(得分:4)

您需要Test Fixture

来自Wikipedia

  

在软件测试中,测试夹具是被测软件的固定状态,用作运行测试的基线;也称为测试环境。它还可以指为使系统进入这种状态而执行的操作。

     

灯具示例:

     
      
  • 使用特定的已知数据集加载数据库
  •   
  • 删除硬盘并安装已知的干净操作系统安装
  •   
  • 复制特定的已知文件集
  •   
  • 准备输入数据以及设置/创建虚假或模拟对象
  •   
     

用于系统地对被测软件进行可重复测试的软件称为测试工具;其部分工作是建立合适的测试装置。

针对您的具体问题:

  1. 在SpecFlow测试项目中创建一个Fixtures目录。在里面,根据你的测试创建任意数量的子目录,以设置你需要的目录和文件结构。

  2. 在App.config条目中添加<appSettings>定义所有测试装置的根文件夹

    <configuration>
      ...
      <appSettings>
        <!-- Path relative to the build output directory -->
        <add name="FixturesRootDirectory" value="..\..\Fixtures" />
      </appSettings>
      ...
    </configuration>
    
  3. [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));
            }
        }
    }
    
  4. 现在您可以使用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
    }