将单元测试数据附加到visual studio中的单元测试

时间:2015-04-20 06:22:09

标签: visual-studio unit-testing tfs

我大量使用单元测试来满足我的开发人员需求(POC,单元测试等)。对于一种特定的测试方法,有一条线路......

var file = @"D:\data\file.eml";

所以我在文件系统上引用了一些文件。

现在在一个团队中,当其他人试图运行我的“个人”测试(POC或其他)时,他们在该路径中没有对该文件的引用...因此测试失败。我们通常要做的工作就是提供测试数据,并允许用户修改测试代码,使其在计算机上运行。

任何视觉工作室管理此特定问题的方法?

这有什么好处?好吧,人们可以查看测试数据(我的情况下的电子邮件)以及我编写的用于测试的方法,如果需要,可以在TFS(源控制系统)中引发缺陷。

3 个答案:

答案 0 :(得分:2)

我经常处理单元测试项目的数据文件的一种方法是将数据文件设置为Resources。 (*请注意,此链接适用于vs2010,但我已通过vs2015RC使用此方法)。

在包含数据文件的项目中:项目 - >属性 - >资源并选择添加资源文件如果您的项目还没有。在资源窗格中选择 Files ,然后单击添加资源或将数据文件拖放到资源管理器上。默认情况下,资源标记为内部资源,因此要从另一个项目访问资源,您有多种方法:

  1. 在包含数据文件的程序集中,将以下内容添加到AssemblyInfo.cs文件中,这将只允许指定的程序集访问内部资源
  2. [assembly: InternalsVisibleTo("NameSpace.Of.Other.Assembly.To.Access.Resources")]
    
    1. 创建一个简单的提供程序类来抽象出整个资源机制,例如:
    2. public static class DataProvider
      {
          public static string GetDataFile(int dataScenarioId)
          {
              return Properties.Resources.ResourceManager.GetString(
                  string.Format("resource_file_name_{0}", id));
          }
      }
      
      1. 将资源管理更改为公共(不是我使用过的方法)

        然后,您可以从单元测试中访问数据文件(现在是资源),例如:
      2. [TestCase(1)]
        public void X_Does_Y(int id)
        {
            //Arrange
            var dataAsAString = Assembly_With_DataFile.DataProvider.GetScenario(id);
        
            //Act    
            var result = classUnderTest.X(dataAsAString);
        
            //Assert
            Assert.NotNull(result);
        }
        

        请注意,使用数据文件作为资源,ResourceManager处理文件I / O并返回文件内容的字符串。

        更新:上面示例中的测试方法来自NUnit项目,并不意味着进行处理,而是一种可以从另一个项目访问数据文件的机制。

答案 1 :(得分:0)

您通常会将文件添加到项目中并将其检入TFS。然后确保项目的设置为:

  • 构建操作:内容
  • 复制到输出:如果更新

然后在Test方法或Test类上添加一个属性:

[DeploymentItem("file.eml")]

您可以选择指定输出dircetory:

[DeploymentItem("file.eml", "Directory to place the item")]

如果将文件放在测试项目的子目录中,则相应地调整属性:

[DeploymentItem(@"testdata\file.eml")]

该文件将被复制到测试项目的工作目录中,从而可以轻松地从测试代码中访问该文件。直接加载文件,或将路径传递给任何需要它的方法。

如果您测试期望特定位置的文件,您可以使用简单的System.IO.File.Copy()System.IO.File.Move()将该项目放在您需要的位置。

MSDN上的process is explained here

答案 2 :(得分:0)

我认为最直接的方法是简单地向项目添加任何内容,并为复制到输出目录设置正确的值。换句话说,假设您的数据位于文本文件中。

  1. 将文本文件添加到测试项目
  2. 右键单击以访问属性窗口
  3. 复制到输出目录字段设置为“始终”或“如果更新则复制。”
  4. 现在,如果构建测试项目,文件将直接复制到输出中。这使得能够编写时尚的单元测试代码:

    var dataFile = File.OpenRead("data.txt");