【发布时间】:2018-01-19 06:17:52
【问题描述】:
我有代码库,其中单元测试是使用机器规范编写的,利用基于 nuget 的测试运行器 Machine.Specifications.Runner.VisualStudio,v2.10 来执行测试。它在 Visual Studio(2015 和 2017)的上下文中运行良好,并且按 Trait 过滤按预期工作。但是,当使用 Test Assemblies 构建步骤时,它似乎不支持类别过滤器。与 Visual Studio 相比,TFS 构建代理运行测试适配器的方式有什么特别之处吗?
示例测试
[Subject(typeof(RetrieveConfiguration))]
[Tags(Categories.Manual)]
public class When_hitting_the_general_services_uri : SpecificationContext
{
private static TestResult result;
Establish context = () =>
{
IServiceInfo serviceInfo = Substitute.For<IServiceInfo>();
serviceInfo.Url = "";
environment.GetService("Confiugration", "Retrieve").Returns(serviceInfo);
x509Manager.LoadFromSignature(ValidSignature).Returns(LoadFromMachine(ValidSignature));
};
Because of = () => error = Catch.Exception(() => result = sut.Execute(new Uri("https://myproductionuri/retrieve"), environment));
It should_have_the_succeeded = () => result.Result.ShouldEqual(StepResult.Success);
}
构建日志
...
2017-08-10T20:49:44.8717852Z ##[debug]Calling Invoke-VSTest for all test assemblies
2017-08-10T20:49:44.9655216Z Working folder: E:\B39\BA78\WS\18
2017-08-10T20:49:44.9655216Z Executing C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\CommonExtensions\Microsoft\TestWindow\vstest.console.exe "E:\B39\BA78\WS\18\s\Src\Test\Verifier.Reporting.Azure.Storage.Spec\bin\Release\Verifier.Reporting.Azure.Store.Spec.dll" /TestCaseFilter:"TestCategory=ContinuousIntegration" /EnableCodeCoverage /logger:trx /TestAdapterPath:"E:\B39\BA78\WS\18\s"
2017-08-10T20:49:45.1999042Z Microsoft (R) Test Execution Command Line Tool Version 14.0.25420.1
2017-08-10T20:49:45.1999042Z Copyright (c) Microsoft Corporation. All rights reserved.
2017-08-10T20:49:45.5592884Z Starting test execution, please wait...
2017-08-10T20:49:56.8721150Z Information: Machine Specifications Visual Studio Test Adapter - Executing tests in E:\B39\BA78\WS\18\s\Src\Test\Verifier.Reporting.Azure.Storage.Spec\bin\Release\Verifier.Reporting.Azure.Store.Spec.dll
2017-08-10T20:50:01.5285749Z Passed Verifier.Reporting.Azure.Store.Spec.When_publishing_a_report.should_have_succeeded
...
8/25 更新 - 添加了请求的屏幕截图和反馈
请注意,总共有 16 个测试,以 when hit 开头的表示是集成测试,预计不会在构建代理的上下文中运行。
测试总数已从 16 个减少到 14 个。由于该测试没有请求的标记,因此已从测试运行中删除。
至于在 Visual Studio 之外运行测试,似乎测试运行程序在我的开发机器上加载测试适配器时遇到问题,而适配器在 Visual Studio 和构建代理上运行良好。
【问题讨论】:
-
能否在构建日志中分享相关的错误信息?
-
@Patrick-MSFT 我添加了围绕单元测试执行的构建日志部分。作为构建的一部分,不会引发错误,只是执行未使用过滤器中应用的指定 TestCategory\Trait 修饰的测试。测试没有通过,因为它们引用了构建代理主机根本不可用的资源。我们通过在测试中添加 if 调试编译指示来解决该问题,但这不是一个理想的解决方案。
-
使用本地VS过滤测试时传递了哪些参数? TFS VStest 任务中的测试筛选条件与`vstest.console.exe` 的控制台选项
/TestCaseFilter的工作方式相同。您上面的测试代码没有包含相应的类别信息。有关 VStest 任务中的 Test Filter Criteria 的更多信息,请参阅此博客:dotnetcatch.com/2016/03/11/… -
@Patrick-MSFT 这就是我遇到的问题。上面的代码不包括在测试过滤条件中指定的测试类别,但它包含在构建代理上的测试运行测试中。它使用过滤器特征通过 Visual Studio 中的测试资源管理器按预期工作:ContinuousIntegration。我相信这相当于 2015 年构建代理中的 TestCategory=ContinuousIntegration 。如果是这样,那么还有其他原因导致行为差异。
-
您好 Tedford,通常需要将测试类别指定为过滤器。至于测试资源管理器中的过滤器,没有过滤测试的选项。只有一个配置持续集成,它实际上不是一个过滤器。如果您不介意,请在 Visual Studio 的测试运行测试中展示您是如何使用过滤器特征的:
ContinuousIntegration。更多细节请看我的更新答案。