【问题标题】:How do I get Visual Studio's test window to use my ITestContainerDiscoverer?如何让 Visual Studio 测试窗口使用我的 TestContainer Discoverer?
【发布时间】:2014-02-08 12:43:47
【问题描述】:

我正在尝试为 Visual Studio 2013 编写一个测试适配器(我正在使用 Update 1 运行 Premium,并且安装了 VS SDK,因此我可以引用所有 VS DLL)。因为它将处理原始内容文件而不是编译的 dll/exe,看来我需要创建一个 ITestContainerDiscoverer

我在网上找到了一些似乎已经实现了这些的公共回购;例如:

TypeScriptJsonNodeand many more

但是;我的代码似乎是相同的(以及对 VS DLL 的相同引用),但似乎从未触发。我已经添加了 File.Write、Console.WriteLine、Debuuger.Launch,并且还附加了另一个 VS 实例。这是我的班级目前的样子:

[Export(typeof(ITestContainerDiscoverer))]
public class MyTestContainerDiscoverer : ITestContainerDiscoverer
{
    [ImportingConstructor]
    public MyTestContainerDiscoverer([Import(typeof(SVsServiceProvider))] IServiceProvider serviceProvider)
    {
        File.WriteAllText(@"M:\Coding\Applications\LuaTestAdapter\LuaTestAdapter\bin\Debug\Danny.txt", "TEST!");
        Console.WriteLine("IT'S RUNNING!");
        Debugger.Launch();
    }

    public Uri ExecutorUri
    {
        get { return TestExecutor.ExecutorUri; }
    }

    public IEnumerable<ITestContainer> TestContainers
    {
        get
        {
            return new[] {
                new TestContainer(this, @"M:\TestProject\Test.lua")
            };
        }
    }

    public event EventHandler TestContainersUpdated;
}

我在一个以 .TestAdapter.dll 结尾的 DLL 中构建它,并手动将其复制到 C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\CommonExtensions\Microsoft\TestWindow\Extensions 中,然后启动 VS。 VS 正确加载了 TestAdapter,因为在同一个项目中,我的 TestDiscoverer(当前包含 DLL 作为调试扩展)正在输出到控制台:

[FileExtension(".lua")]
[FileExtension(".dll")]
[DefaultExecutorUri(TestExecutor.ExecutorUriString)]
public class TestDiscoverer : ITestDiscoverer
{
    public void DiscoverTests(IEnumerable<string> sources, IDiscoveryContext discoveryContext, IMessageLogger logger, ITestCaseDiscoverySink discoverySink)
    {
        logger.SendMessage(TestMessageLevel.Informational, "This one works!");
    }
}

所以我认为 TestContainerDiscovered 一定有问题;但我在网上发现的样本中看不到任何不同之处:O(

【问题讨论】:

    标签: c# .net visual-studio visual-studio-2013


    【解决方案1】:

    看起来我可能发现了不同之处...如果我创建一个 Visual Studio 包项目并“以旧方式”安装我的 TestAdapter,那么我的代码执行得很好。

    看起来“普通”的 TestAdapter(例如,那些使用编译 DLL/EXE,因此可以使用提供的 TestContainerDiscoverers)工作正常(这就是为什么 NUnit、xUnit 等可以使用基于 NuGet 的包,或将 DLL 复制到Extensions 文件夹),但为了让我的工作,我需要通过包含以下“资产”的 Package 项目安装它(可能是因为使用 MEF 连接 ITestContainerDiscoverer)。

    <Asset Type="Microsoft.VisualStudio.MefComponent" d:Source="Project" d:ProjectName="LuaTestAdapter" Path="|LuaTestAdapter|" />
    

    【讨论】:

      【解决方案2】:

      默认情况下,Visual Studio 似乎只在 .exe.dll 中找到测试发现者。

      所以,当你想扩展时(例如.lua)你也需要实现这两个接口:

      • ITestContainer
      • ITestContainerDiscoverer

      还有标准的:

      • ITestDiscoverer
      • ITestExecutor

      要测试它是否会运行,你可以执行这个命令:

      cd Microsoft Visual Studio 11.0\Common7\IDE\CommonExtensions\Microsoft\TestWindow
      
      vstest.console.exe /listdiscoverers /useVsixExtensions:True
      

      如果它输出如下内容:

      这意味着您的发现正在加载。由于它是一个具有不同文件扩展名的新文件,我想你不能只是复制文件,我想它需要安装。

      当我创建这个适配器时,我从这个example provided by Microsoft 复制了所有内容并对其进行了修改。确保您的 vsixmanifest 看起来相同等等...

      除了示例,我没有找到任何实际文档...

      希望这会有所帮助...

      【讨论】:

      • 感谢您的信息 - 结果是我缺少的 vsix - 没有它(例如手动复制到 Extensions 文件夹)ITestDiscoverer's 将工作,但不是 ITestContainerDiscoverers。我怀疑这是由于使用MEF注册ITestContainerDiscoverers,但是VS自动扫描*.TestAdapter.dlls寻找ITestDiscoverers
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-21
      • 2013-12-16
      • 1970-01-01
      • 1970-01-01
      • 2014-03-14
      • 1970-01-01
      • 2017-05-18
      相关资源
      最近更新 更多