测试执行疑难解答

如果测试未能运行,则可通过检查测试环境来调查失败原因;调查内容涉及测试的设置方式以及活动测试设置中的各种设置。 在某些情况下(如在与部署相关的情况下),失败可能与测试类型无关。 而在其他一些情况下,测试类型则决定着调查方式与调查内容。 有关按测试类型列出的调查提示,请参见详细信息(按测试类型)。

报告的与测试相关的错误一般分为两个级别:

  • 测试级错误。 在“测试结果”窗口中,双击测试结果或右击测试结果,然后选择**“查看测试结果详细信息”**。 这时会显示测试 [Details] 页,其中显示了错误消息和其他详细信息,具体信息取决于测试类型,例如单元测试的堆栈跟踪信息。 测试超时错误便是测试级错误的一个示例,当达到测试的超时限制时便会出现此错误。

  • 运行级错误。 运行级错误(包括测试设置错误)通过“测试结果”窗口报告。 当发生运行级错误时,“测试结果”窗口的状态栏上就会出现一个链接。 单击此链接将显示与“测试运行 [Details]”页中的错误有关的更多详细信息。 单击“测试结果”窗口工具栏上的**“运行详细信息”**也可以显示“测试运行 [Details]”页。 运行超时错误便是运行级错误的一个示例,当达到运行的超时限制时便会出现此错误。

并非所有的问题都会导致测试无法运行。 在选择了获取代码覆盖率数据之后,如果项目中具有某些生成设置,则运行测试可能会生成警告。 有关更多信息,请参见在获取代码覆盖率数据时使用“AnyCPU”生成设置。

部署错误

任何可以自动运行的测试(指除手动测试以外的任何测试类型)都可能遇到一些特定的错误。 这些错误通常与测试的部署有关。 在部署测试时,包含测试的文件会被复制到另一个文件夹中,该文件夹可能位于本地计算机中的某个位置,也可能位于远程计算机中的某个位置。

例如,对于单元测试,从测试项目生成的 .dll 文件就是必须部署的文件。 如果无法部署此二进制文件,则在运行单元测试时,该文件中包含的所有单元测试在“测试结果”窗口中都将立即被标记为“未通过”。

若要修复此错误,请确认这些文件在本地计算机中可用,并且上次重新生成测试二进制文件时没有出现生成错误。

不只是可以部署二进制文件。 还可以指定某特定文件(如一个数据文件)是测试所必需的,因此必须随测试一起部署。 在部署时,如果因为移动或删除的原因而找不到此文件,将无法正确运行测试,同时会发生错误。 有关一般测试中涉及的此错误的信息,请参见详细信息(按测试类型)。

若要调查此错误,请先记下用于编辑测试设置的对话框的“部署”页上指定的文件和文件夹。 有关更多信息,请参见创建测试设置以从 Visual Studio 中运行自动测试。 然后检查磁盘上的这些文件和文件夹,确保这些文件和文件夹存在且与“部署”页中所指定的名称相同。

解决方案可能包含多个测试设置文件。 如果确实如此,请务必检查发生测试错误时处于活动状态的测试设置。 若要确定哪些测试设置处于活动状态,请查看该测试运行的“测试运行详细信息”页。

有关活动测试设置文件的更多信息,请参见如何:从 Microsoft Visual Studio 应用测试设置

报告远程测试结果时发生错误

远程运行测试时,可能无法显示测试结果。 此错误可能与测试运行的远程性质有关。

与本地测试运行的测试结果相似,远程运行的结果也是在本地报告给您。 某些远程测试结果的报告要依赖 Visual Studio 旗舰版将生成的测试结果文件从远程测试计算机复制到本地计算机的能力。

如果您发现远程测试结果出现错误,请先确定远程计算机与运行 Visual Studio 的计算机之间的网络连接是否已中断。

有关更多信息,请参见设置测试计算机以运行测试或收集数据

检测错误

为了启用代码覆盖率报告,必须在测试二进制文件之前对要测试的二进制文件进行检测,然后再部署。

如果未能对二进制文件进行检测,则导致代码覆盖率报告失败。 在测试运行完成之后,“测试运行详细信息”页中会显示一条错误消息,说明不能报告代码覆盖率,同时还会说明原因。

未能对二进制文件进行就地检测的可能原因有:文件被标记为只读,或者文件正被另一个进程使用。 若要修复二进制文件标记为只读这一错误,请先检查二进制文件的特性,确保可以对它执行写入操作。 若要知道应该检查哪些二进制文件,请打开活动测试设置的“代码覆盖率”页;您在这里指定需要检测的文件。 有关更多信息,请参见如何:获取代码覆盖率数据

在使用就地检测功能时,如果将一个或多个单元测试与一个手动测试结合使用,也可能导致代码覆盖率报告失败。 在手动测试过程中,测试人员会运行被测试的成品代码。 如果测试人员以按 F5 或 Ctrl+F5 的方式来启动或调试代码,将会重新生成项目的可执行文件,这会移除检测过程。

此外,还要确保该二进制文件未由任何其他进程使用。 例如,请确保没有在 Visual Studio 的其他实例中打开该文件。

在检测具有强名称的程序集时,可能会遇到与对程序集重新签名有关的其他错误。 有关更多信息,请参见对程序集进行检测和重新签名

在获取代码覆盖率数据时使用“AnyCPU”生成设置

只有当测试 32 位程序集中的代码时,才能获取代码覆盖率数据。 为了保证能够满足此条件,请设置一个特殊的生成属性:

提示

此警告并不适用于 C++ 项目,因为“AnyCPU”不是 C++ 项目的平台选项。

如果您使用“AnyCPU”值来生成自己的项目,则针对所得到的程序集运行的测试将生成代码覆盖率数据,但是该测试运行还生成一个警告。 您可以在“测试运行详细信息”页上查看该警告的文本:

警告 VSP2013 : 检测此映像要求此映像以 32 位进程的方式运行。已更新 CLR 标头标志,以反映这一信息。

此警告表示已经对该程序集进行了重新编译,而且已经应用了 x86 属性,以便在该测试运行过程中获得代码覆盖率数据。 为了避免出现此警告,请使用 x86 设置来编译要获得其代码覆盖率数据的任何程序集。

提示

如果您的应用程序将要在 32 位和 64 位计算机上运行,请记住在完成测试之后,使用“AnyCPU”设置重新编译它。

运行单元测试可以锁定 C++/CLI 测试程序集

您可能会遇到测试执行引擎在您的测试项目中打开并锁定某个程序集的情况。 发生这种情况时,您无法执行某些操作,例如,将更改保存到该程序集中。 下列情况下可能会发生此问题:

  • 第 1 种情况:您为测试项目 TestProjectA 禁用了部署。 TestProjectA 是用 C++/CLI 编译的。 TestProjectA 中的代码定义了一个特性类,该特性至少修饰 TestProjectA 的一个测试方法。 此时,当您在 TestProjectA 中运行单元测试时,测试执行引擎将打开 TestProjectA.DLL 并可以将其保留为锁定状态。

  • 第 2 种情况:您的测试项目 TestProject1 中包含一个 DLL,它是从第二个测试项目 TestProject2 中编译的。 TestProject2 是用 C++/CLI 编译的。 TestProject2 中的代码定义了一个特性类,该特性至少修饰 TestProject2 的一个测试方法。 此时,当您在 TestProject1 中运行单元测试时,测试执行引擎将打开 TestProject2.DLL 并可以将其保留为锁定状态。

在上述两种情况下,解决方案都分两部分进行。 首先执行下列步骤。

  1. 在**“工具”菜单上选择“选项”**。

    将打开**“选项”**对话框。

  2. 展开**“测试工具”并单击“测试执行”**。

  3. 在**“性能”下,清除“使测试执行引擎在两次测试运行之间保持运行”**复选框。

完成这些步骤之后,如果问题仍然存在,请执行下列操作:

更改代码,使在 C++/CLI 中编译的测试项目不需要加载到默认 AppDomain 中。 若要实现此目的,一种方法是将您使用的自定义特性的定义移动到在 C# 中实现的单独程序集中。

详细信息(按测试类型)

正如本节所述,在运行特定测试类型时,经常会发生一些特定的错误。

  • 顺序测试。 顺序测试所遇到的错误通常与文件部署有关。 在运行顺序测试之前,测试引擎必须先找到所有包含的测试中的全部测试文件以及其他一些必需文件,然后再对这些文件进行部署。 如果其中任意单个测试的此步骤失败,都会导致错误发生。

  • 一般测试。 在运行一般测试时,也可能发生部署错误。 对于一般测试,可以用两种方式来指定要部署的文件:在测试设置的“部署”页上指定,以及在“一般”测试自身的创作页上指定。 如果没有列出所需的全部文件或者在指定位置找不到这些文件,测试就有可能失败。

    这两种不同的部署文件方法所引发的错误分别出现在不同级别。 如果部署错误与在一般测试创作页中指定的文件有关,则将出现测试级错误。 如果部署错误与在测试设置中指定的文件有关,则将出现运行级错误。

请参见

任务

如何:为运行测试设置时间限制

概念

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

查看测试结果