问题描述
我们目前正在构建一个内部装置来在大型 C++ 代码库上运行单元测试,使用 Catch2 作为框架和我们的内部 VS 测试适配器(使用 [ITestdiscoverer]
和 {{1} }) 使它们适应我们的代码实践。但是,我们遇到了在构建后并不总是发现单元测试的问题。
我们正在做的一些不正常的事情可能会有所贡献。虽然我们使用 VS2019 进行编码,但我们使用 FASTBuild 和 Sharpmake 来构建我们的解决方案(其中可以包含无数项目)。当我们意识到 VS 会在运行之前尝试使用 MSBuild 再次构建测试(即使在完全重建之后),我们在 VS 选项中禁用了该行为。其他一切似乎都在按预期运行,只是有时没有进行测试。
在进行一些挖掘之后(即在输入我们的 Testdiscoverer 时将验证消息输出到 VS 的 Tests 输出),似乎测试发现通行证并不总是在我们期望的时候被调用,有时甚至可以重建完整的解决方案。除了通常的期望,即使用新更改(或直接重建)构建项目将导致开始通过,VS 用于确定何时调用所有已安装测试适配器的方法似乎在确切的参数/条件触发方面相当黑箱
另一种选择似乎是允许用户通过一些可以包装在 VSPackage 中的方式手动执行 TD pass。然而,最初通过 VSSDK API 寻找可以完成这项工作的任何东西都不够用。
使用 VSSDK,是否有任何方法可以独立于 VS 检测是否需要通过的正常方法来调用测试发现通过?
解决方法
您可能想要使用 ITestContainerDiscoverer.TestContainersUpdated 事件。然后,平台应调用您的 Container Discoverer 以获取最新的容器集 (ITestContainerDiscoverer.TestContainers)。只要从发现者返回的容器不同(基于 ITestContainer.CompareTo()),平台就应该触发对已更改容器的发现。这个博客在过去很有帮助:https://matthewmanela.com/blog/anatomy-of-the-chutzpah-test-adapter-for-vs-2012-rc/