如何:为测试部署文件

在运行测试之前,必须将测试和应用程序连同它们引用的其他程序集一起复制到可运行它们的位置。 测试通常还需要其他文件,如测试数据、配置文件、数据库和显式加载的程序集。 若要使这些附加文件可用于测试,你必须指定将部署这些文件。

在何处运行测试?

Visual Studio 2013 可在多个位置运行测试:

  • 在生成输出文件夹中,通常为 <你的项目>\bin\Debug。

  • 在生成所在的同一计算机上的本地测试部署文件夹中。

  • **在远程计算机上。**远程部署用于测试分布式应用程序或 Web 应用程序以及必须在特定平台上运行的应用程序。 对于远程部署,你必须设置测试控制器和测试代理,并且你通常在实验室环境中运行测试。 有关远程部署的更多信息,请参见如何:使用测试控制器和测试代理运行测试

如何为本地测试部署测试文件?

以下为最佳方法:

  1. 将文件复制到生成目标目录中(这是生成过程的一部分)。

    • 如果这些文件特定于某个测试项目,则将其作为内容文件包含在 Visual Studio 测试项目中。 在解决方案资源管理器中选择它们,并将**“复制到输出”属性设置为“如果较新则复制”**。

    • 否则,请定义后期生成任务以将文件复制到生成输出目录中。 例如:

      xcopy /Y /S "$(SolutionDir)SharedFiles\*" "$(TargetDir)"
      

      打开你的测试项目的项目属性。 在 C# 项目中,打开**“生成事件”页。 在 Visual Basic 项目中,打开“编译”页并选择“生成事件”。 将复制命令添加到“后期生成事件”**字段中。

  2. 在测试方法或测试类上使用 DeploymentItemAttribute 可指定应从生成输出目录复制到部署目录中的文件和文件夹。

    [TestClass]
    class TestClass1
    {
      [TestMethod]
      [DeploymentItem("source", "targetFolder")]
      public void Test1()
      {
        string testData = System.IO.File.ReadAllText(@"targetFolder\source");
        ...
    } }
    
    <TestClass()> _
    Public Class UnitTest1
        <TestMethod()> _
        <DeploymentItem("source", "targetFolder")> _
        Sub TestMethod1()
            Dim testData As String = _
                System.IO.File.ReadAllText(@"targetFolder\source")
        ...
        End Sub
    End Class
    
    • 源是要复制的文件或目录。 生成输出目录的路径可以是绝对的或相对的。

    • targetFolder 是可选的。 它是一个将源文件或目录内容复制到其中的目录。 部署目录的路径可以是绝对的或相对的。 默认值是“.”,部署目录。

      备注

      targetFolder 始终是目录,从来不是文件路径。你无法通过使用 DeploymentItem 更改文件名。

    你可以根据需要多次使用特性,并且可将其应用于测试方法或测试类。

    当你选择要运行的一组测试时,在测试运行开始之前,将复制其 DeploymentItem 特性中指定的所有项目。

  3. 考虑直接在生成输出目录中运行单元测试,以使测试能更快速地运行。 这对于签入测试后的生成服务器尤其有用。

    为此,将 *.runsettings 文件添加到你的解决方案中,包括 <DeploymentEnabled>False</DeploymentEnabled>,然后选择**“测试”“测试设置”**菜单中的文件。 在完全不使用 DeploymentItemAttribute 的任何测试运行中,都会产生同样的效果。

    但是,如果你使用 *.testsettings 文件(Web 和负载测试、编码的 UI 测试,以及要将应用程序部署到远程计算机中的所有测试都需要该文件),则无法避免使用部署文件夹。

什么是 *.runsettings 文件?

带有任何名称和文件扩展名“.runsettings”的文件。 它用于出于某些目的配置单元测试。 若要创建一个此类文件,请复制 使用 .runsettings 文件配置单元测试中的示例。 将其放在解决方案文件夹中,然后使用**“测试 > 测试设置”**菜单使其成为活动状态。

应何时使用 *.testsettings 文件?

*.testsettings 文件(即,带有任何名称和文件扩展名“.testsettings”的文件)是 *.runsettings 较早的替代项。 若要创建一个此类文件,请使用**“测试 > 测试设置”菜单中的菜单项。 将该文件保存在解决方案文件夹中,然后使用“测试 > 测试菜单”**菜单使其成为活动状态。

尽量避免使用 *.testsettings 文件,因为它会使测试运行得更缓慢,并且与第三方测试框架不兼容。 你在纯单元测试时不需要它。 但是你在以下情况下需要它:

如果使用 *.testsettings 文件,你的应用程序和测试程序集将始终复制到部署文件夹中。

你可在 .testsettings 编辑器的**“部署”**页上指定数据文件和目录。 每次测试运行前,需将它们复制到部署文件夹中。 本页上指定的项路径始终相对于解决方案目录,并且始终与应用程序和测试程序集一起部署到部署文件夹中。

若要使用绝对路径或指定其他目标目录,请使用 XML 编辑器打开 .testsettings 文件,并插入类似于以下内容的片段:

<Deployment>
  <DeploymentItem filename="C:\MyTestData\TestData.mdb"
        outputDirectory="D:\TestDB\" />
</Deployment>

outputDirectory 可以是部署目录的绝对或相对目录。

何时使用单独的部署文件夹?

如果通过使用 Visual Studio 运行测试,则将在解决方案文件夹中的 TestResults 下创建部署文件夹。

如果测试运行中有任何测试方法或类具有 DeploymentItem 特性,或者你使用 *.testsettings 文件,则将使用单独的部署文件夹。

如果使用部署文件夹,则以下文件和文件夹将在测试运行前复制到部署文件夹中:

本地测试运行的部署文件夹

用于测试的本地部署文件夹

何时以何种顺序部署文件?

在测试运行中,将任何测试开始之前复制所有要部署的文件。 测试运行是一批由单个命令或计划的事件启动的测试。 这意味着,如果为特定测试方法指定要部署的数据文件,它还可用于同一运行中执行的所有其他测试。

以下项按显示排序进行复制。 后复制的项将覆盖先复制的项(如果它们同名)。

  1. 使用 DeploymentItemAttribute 指定的项

  2. 依赖项。 例如,应用程序配置文件和依赖程序集。

  3. *.testsettings 文件中指定的项(如果你正在使用它)。

  4. 已检测的二进制文件。 例如,经过检测用于启用代码覆盖率或 IntelliTrace 的程序集。

    如果正在使用就地检测,则首先检测二进制文件,然后将其复制到部署目录中;否则将首先复制二进制文件再进行检测。 就地检测是本地运行的测试的默认设置。

  5. 构成测试的一个或多个文件。 这包括用于单元测试的测试程序集、用于手动测试的文本或 .mht 文件或用于其他测试类型(如一般测试)的其他类型的文件。

TestResults 目录中有哪些内容?

  • 测试运行文件夹。 TestResults 为已启动的每个测试运行包含一个文件夹。 其名称包括创建时间。

    如果在 *.testsettings 文件中指定设置和清理脚本,则测试运行文件夹将包含这些脚本。

  • Out。 每个测试运行文件夹都包含一个名为 Out 的文件夹。 Out 文件夹是真正的部署文件夹,在测试运行启动时,程序集和其他部署文件都将复制到此件夹中。

  • In。 代码复盖率结果和某些其他测试结果将存储在名为 In 的文件夹中。

请参见

参考

DeploymentItemAttribute

概念

对程序集进行检测和重新签名

其他资源

指定 Visual Studio 测试的测试设置