质量检查工程师如何通过链接Visual Studio中的自动测试和测试IT来节省一整天

开发人员的现代工作工具有十二种不同的应用程序:IDE,测试系统,各种框架,版本控制和容器化系统,办公应用程序等等。

通常,我们在没有注意到的情况下,会花费宝贵的时间将数据从一个工作系统传输到另一个工作系统。但是,为什么我们不进行工作流程的优化,即使是很小的事情呢?五分钟乘以每天五次,每月总共可以给我们超过一个工作日,这比平常的工作所花的时间要有用得多。因此,我们开始为Visual Studio创建扩展,它使我们能够在Test IT系统中自动化创建自动测试的过程。

继续讲述Webhooks以及它们如何帮助连接工作中的许多服务,我们向您介绍了有关为我们的工作IDE-Visual Studio创建扩展的故事。欢迎来到猫!

本文是来自Test IT团队的嘉宾帖子。



上一篇文章中讨论的聊天机器人当然不错,但是到目前为止,它仅为我们提供有关自动测试当前状态的信息。而且,如果我们与Test IT系统建立了更紧密的集成,则可以自动在门户上扩展当前项目的测试列表,而无需手动添加它们。

以前,为此,我们使用了一个匆忙部署的库和一个控制台应用程序,该应用程序在启动时会查看当前的解决方案,找到一个测试项目,从其程序集中提取一系列自动测试,然后将其发送到我们的API。看来您可以那样做,因为该解决方案有效。但是,不断拖延整个项目(即使这是异步调用该库的一种方法)非常困难,并且项目之间的永恒依赖关系也不是好习惯的标志。

因此,我们开始为Visual Studio创建扩展,现在我们将介绍如何制作扩展。

技术方面


我们自然会在Visual Studio本身中开发扩展。毕竟,没有人比IDE本身更了解IDE。首先,请确保Visual Studio具有创建扩展所需的所有组件。我们找到并启动Visual Studio Installer,并检查“ Visual Studio Extensions的开发”模块:



一项检查足以让我们安装所有必要的工作库。有关用于Visual Studio扩展的开发的安装信息应大致处于以下情况:



准备部分已结束,我们可以继续创建新项目,并使自己沉浸在扩展模板的体系结构中。

我们将使用短语“ VSIX”找到可用的解决方案列表,然后选择VSIX Project(当然是C#),以扩展新的扩展程序:



部署后,扩展模板的简单体系结构使我们乍看之下:



在此示例中,source.extension.vsixmanifest是描述扩展的基本属性的通用清单,例如产品名称,作者,版本,描述,扩展图标,IDE的目标版本。还有很多其他顺便说一下,在扩展存储区和Visual Studio扩展安装程序中都可以查看这些属性。

VSIXProject3Package.cs(掩码:{ProjectName} Package.cs)又是一个初始化程序类,该类注册所有可用的命令和资源模式。我们现在将了解团队。

让我们创建一个新的团队,该团队打开带有扩展参数的WPF窗口:我们需要存储有关目标项目的数据,其程序集的位置和名称,与服务器的连接以及其他信息。

我们正在寻找一个新的元素,称为颇合逻辑的Command



许多人可能会怀疑:当异步工具窗口和工具窗口适合按名称描述任务时,为什么要使用命令?一切都非常简单:创建这两个元素时,我们会将标记文件部署到xaml,具有相同名称的cs文件以及命令。一切都会好起来,就像我们需要的一样,但是在这种情况下,“工具窗口”(无论是否异步)都部署了一个集成到Visual Studio本身的窗口模板。在输出中,我们获得其中一个窗口,默认情况下会展开该窗口,而不是“调试”窗口。当然,所有这些都是可定制的,但是我们需要一个第三方窗口。这就是为什么我们不使用“工具窗口”,而是添加常规WPF窗口的原因。

我认为创建带有标准元素的新窗口的细节可以省略,因为它很无聊,无趣且与文章标题联系不紧密。您可以在这里留下的唯一建议是:添加新元素时,Visual Studio不会在选项列表中显示WPF窗口,因此,最快,最简单的选择是与扩展项目分开创建一个这样的窗口,然后将其转移到当前项目中(不要忘记固定空间)名称)。



因此,在创建了一个新团队(我们称为OpenSettingsCommand)之后,传奇的Studio代码生成过程将创建一个团队类和一个vsct格式文件,该文件既存储我们扩展的标记,又存储命令的映射以及调用它们的按钮。非常需要在您自己的实现上重写标记:自动创建的标记,它将把您的元素放在“扩展”菜单中。在这种情况下,我们通过创建一个由两个团队组成的小组并直接将其放置在工具栏上来重写此标记。在我们的存储库中可以找到命令和标记的示例

在创建的类中,我们可以注意到Execute方法,当调用此命令时,该方法将从所有内容开始。实际上,我们将在这里注册新的WPF窗口的初始化。

环境


我们顺利地使用了Visual Studio SDK,即EnvDTE库。这个COM库使我们能够使用Visual Studio的对象和元素:获得活动解决方案和项目的列表,使用语法突出显示,活动窗口,阅读项目代码等等。实际上,如果您沉迷于该库的文档,您将为自己找到很多有用的功能。在此示例中,我们精确地使用它来获取活动解决方案中的项目列表。

尽管免费的代码库很小,但是我们只需要几行代码即可获得活动解决方案中的项目列表:

ThreadHelper.ThrowIfNotOnUIThread();
var activeVS = (DTE)Microsoft.VisualStudio.Shell.ServiceProvider.GlobalProvider.GetService(typeof(DTE))
 ?? throw new InvalidOperationException("DTE not found");
var activeProjects = new List<Project>();
activeProjects.AddRange(activeVS.Solution.Projects.Cast<Project>());
//  , activeProjects         

因此,我们可以轻松自然地收集有关所有活动项目的详细信息。

从此列表中获取项目名称(名称属性)和csproj文件的路径(突然为FullName):这足以让我们从可能的项目列表中向用户询问所需的项目并将其映射到目录以搜索程序集。

下一步是连接库,库的任务是分析程序集,收集自动测试并将其发布在Test IT门户上。我们将省略创建库的详细信息,但将提供一个有趣的类,该类可以从已加载的程序集中获取自动测试的列表:

public class AutotestsService
    {
        public IList<AutotestModel> GetAutotestsFromAssembly<TTestClassAttribute, TTestMethodAttribute>(Assembly assembly, Guid projectId, string repositoryLink)
            where TTestClassAttribute : Attribute
            where TTestMethodAttribute : Attribute
        {
            MethodInfo[] testMethods = GetAutotestFromAssembly<TTestClassAttribute, TTestMethodAttribute>(assembly);

            List<AutotestModel> allModels = new List<AutotestModel>();
            foreach (MethodInfo method in testMethods)
            {
                AutotestModel autotest = new AutotestModel()
                {
                    ExternalId = method.Name,
                    LinkToRepository = repositoryLink,
                    ProjectId = projectId,
                    Name = GetAutotestName(method.Name),
                    Classname = method.DeclaringType.Name,
                    Namespace = GetAutotestNamespace(method)
                };

                allModels.Add(autotest);
            }

            return allModels;
        }

        private static MethodInfo[] GetAutotestFromAssembly<TTestClassAttribute, TTestMethodAttribute>(Assembly assembly)
            where TTestClassAttribute : Attribute
            where TTestMethodAttribute : Attribute
        {
            return assembly.GetTypes()
                .Where(c => c.IsDefined(typeof(TTestClassAttribute)))
                .SelectMany(t => t.GetMethods())
                .Where(m => m.IsDefined(typeof(TTestMethodAttribute)))
                .ToArray();
        }

        private string GetAutotestName(string autotestExternalId)
        {
            StringBuilder autotestName = new StringBuilder();

            for (int i = 0; i < autotestExternalId.Length; i++)
            {
                if (char.IsUpper(autotestExternalId[i]) && i != 0)
                    autotestName.Append(' ');
                autotestName.Append(autotestExternalId[i]);
            }

            return autotestName.ToString();
        }

        private string GetAutotestNamespace(MethodInfo testMethod)
        {
            return testMethod.DeclaringType.FullName
                .Replace($".{testMethod.DeclaringType.Name}", string.Empty);
        }
    }

库的整个源代码始终可以在我们的存储库中查看

因此,回到扩展名。要启动库的逻辑,您需要添加一个新命令,在Execute方法中我们编写库调用,并向其传递测试类和方法的属性以及保存的扩展参数:

var settings = Properties.Settings.Default;
var executor = new LinkExecutor();
await executor.Execute<TestClassAttribute, TestMethodAttribute>(
    settings.Domain,
    settings.SecretKey,
    settings.ProjectNameInTestIT,
    settings.RepositoryLink ?? string.Empty,
    settings.AssemblyPath,
    Logger);

重要说明:我们跳过记录器进入库,以便能够将技术信息直接写入Visual Studio消息输出窗口。该库不应仅与此IDE绑定,对于我们来说,重要的是要有机会在任何情况下使用它。

结果


结果,在开发之后,我们得到了以下扩展名:



. , Visual Studio, , Visual Studio Visual Studio Visual Studio Visual Studio. , .



让我们打开一个包含一个带有单元测试项目的示例解决方案,然后在其上测试我们的扩展。加载项目时,我们可以立即在面板上看到一个新按钮:



立即从您的个人帐户中获取API密钥,并在我们的平台上准备一个新项目:





接下来,让我们回到扩展程序。让我们用扩展参数打开窗口并填写字段:



我们将当前项目列表传递给窗口设计器,由Visual Studio SDK库提供,并在选择项目后加载“ Project dll”选项:该服务在UnitTestProject项目的程序集中查找所有dll文件”并向我们展示了可能的图书馆选择。我们保存设置并运行扩展程序的主要功能。

几秒钟后,在输出窗口中,我们看到以下内容:



谁在乎我们如何输出消息-记录器的源代码可以在这里找到

在我们的示例中,有3个单元测试和3个集成测试。听起来像是事实。检查是否有门户网站:



结论


今天,我们以在Test IT平台上发布自动测试列表的扩展示例为例,研究了为Visual Studio创建扩展的基础。扩展选项仅受您的想象力限制:您可以与团队进行聊天,可以在分支机构的项目崩溃时创建通知,甚至可以在办公室添加比萨饼订购按钮,就像我们对Bot Framework的幻想一样

梦想,创造,节省时间,并始终保持创意专家的地位!

关于作者



Mikhail Pirogovsky是.NET开发人员。该材料是由Test IT团队编写的。Facebook上的小组中,我们讨论了质量检查,测试,工具等方面的工作。

All Articles