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

attaching unit test data to unit tests in visual studio

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

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

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

现在在一个团队中,当其他人正在尝试 运行 我的 "personal" 测试(POC 或其他)时,他们在该路径中没有对该文件的引用...因此测试失败。我们通常必须如何进行这项工作是提供测试数据,并允许用户修改测试代码,以便它 运行 在他的计算机上。

有什么 visual studio 方法可以解决这个问题?

这样做有什么好处?好吧,人们可以查看测试数据(在我的案例中是电子邮件)以及我为测试编写的方法,并且可以在需要时提出与之相关的 TFS(源代码控制系统)中的缺陷。

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

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

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

    然后您可以从单元测试访问数据文件(现在是资源)这样如:
[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和returns字符串的文件内容。

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

您通常要做的是将文件添加到您的项目并将其签入 TFS。然后确保项目的设置是:

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

然后在您的测试方法或测试上添加一个属性 class:

[DeploymentItem("file.eml")]

您可以选择指定输出目录:

[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

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

  1. 将文本文件添加到您的测试项目
  2. 右击访问属性window
  3. 复制到输出目录字段设置为始终或如果较新则复制。

现在,如果您构建测试项目,该文件将直接复制到您的输出中。这使得编写时尚的单元测试代码成为可能:

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