Visual Studio如何自动构建和测试C#代码?

时间:2018-09-07 07:19:09

标签: visual-studio visual-studio-2017

我习惯了Eclipse for Java项目,该项目在保存文件时会自动生成。 (我可以将其关闭。)

然后我安装Infinitest,它会自动运行受保存的更改影响的所有测试。

我该如何在Visual Studio中编写C#软件呢?

2 个答案:

答案 0 :(得分:4)

VS 2017 Enterprise Edition支持Live Unit Testing功能。对于较旧的版本或较低的版本,可以使用一些Mighty MooseNCrunch之类的第三方提供商(几乎肯定也存在其他第三方解决方案)

答案 1 :(得分:3)

重要提示:

如果您只关心C#/。NET代码,并且只想运行单元测试,那么此功能在Visual Studio 2017(仅企业版)中已经存在,称为实时单元测试,请在此处详细了解:{{ 3}}

  

实时单元测试是Visual Studio 2017 15.3版中提供的一项技术,可在更改代码时自动实时地自动执行单元测试。

我的原始答案:

(我曾经在Microsoft担任Visual Studio的SDE(2012、2013和2015)。我自己没有参与构建管道的工作,但希望我能提供一些见解:)

  

Visual Studio如何自动构建和测试代码?

不是,并且我认为不应该,假设“构建并测试代码”意味着您应该执行标准的项目构建,然后运行测试。

>
  

Eclipse仅构建受更改影响的内容。就像魅力一样。

即使增量编译也不是即时的,尤其是在有大量的编译后活动(例如,复杂的链接和优化(即使在调试模式下),外部编译任务(例如,嵌入资源,可执行压缩,代码签名等)的情况下。 / p>

特别是在Eclipse中,此功能并不完美。 Eclipse主要是Java IDE,在Java项目中,很有可能快速执行增量构建,因为Java的构建时间非常快,增量构建就像交换嵌入式{{1 }}文件放在Java .class中。为了进行比较,在Visual Studio中,.NET程序集的构建时间也很快-但不那么简单,因为输出PE(.jar / .exe)文件的构建并不那么简单。

但是,在其他项目类型中,尤其是C ++,构建时间要长得多,因此对于C / C ++开发人员来说,具有此功能是不合适的,事实上Eclipse自己的文档建议C / C ++用户关闭此功能:

  

https://docs.microsoft.com/en-us/visualstudio/test/live-unit-testing-intro?view=vs-2017

     

默认情况下,Eclipse工作台被配置为自动构建项目。但是,对于C / C ++开发,您应禁用此选项,否则,无论何时将更改保存到makefile或源文件中,都将重建整个项目。单击“项目”>“自动生成”,并确保“自动生成”菜单项旁边没有选中标记。

其他项目类型也不支持此功能,例如Eclipse的Go插件:

  

https://help.eclipse.org/mars/index.jsp?topic=%2Forg.eclipse.cdt.doc.user%2Ftasks%2Fcdt_t_autobuild.htm

     

0.14.0中的更改:
  [...]   启用工作区“自动构建”设置并保存文件时,不再调用项目构建器。 (无论如何,这被认为是不适当的功能)

(该括号内的注释在GoClipse的更改列表中,并且肯定明确了插件作者对“自动构建”的看法)

  

然后我安装Infinitest,它会自动运行受保存的更改影响的所有测试。

Visual Studio可以在构建后自动运行测试(但是您仍然需要自己触发构建),这是一项内置功能,请参见此处:

  

https://github.com/GoClipse/goclipse/releases/tag/v0.14.0

     

要在每次本地构建后运行单元测试,请在标准菜单上选择 Test ,然后在“测试资源管理器”工具栏上选择在构建之后运行测试

由于我的原因,Visual Studio不支持“保存时构建”:

  • 只有最简单的C#/ VB和TypeScript项目在不到一秒钟的时间内就能完成构建,其他项目类型(例如C,C ++,SQL数据库等)需要花费几秒钟的时间来进行简单项目的热重建-大型项目实际上要花费数小时规模的C ++项目,在单核CPU上具有许多导入的标头,低RAM和5400rpm的IDE硬盘。
  • 许多构建都是非常耗费IO的(尤其是C / C ++项目具有很多标头* cough *,例如 * cough *),而不是CPU受限,并且磁盘IO延迟是锁定和锁定的主要原因。计算机上正在运行的其他应用程序的运行速度变慢,因为磁盘分页操作可能会延迟,或者因为它们正在GUI线程上执行磁盘IO操作,依此类推-因此,在磁盘IO密集型构建中启用此功能仅表示您每次您按Ctrl + S或运行自动保存时,计算机都会抖动很多。
  • 并非每种项目类型都支持增量构建,或者可以支持 fast 增量构建。 Java是该规则的例外,因为Java的设计目的是使每个输入源.dll文件一对一映射到输出.java文件,这使得增量构建非常快,因为只有实际修改的文件需要重建,但是C#和C ++之类的其他项目却没有这么奢侈:如果您甚至对C预处理宏或C ++模板进行了无关紧要的1个字符的编辑,您都需要重新编译使用该模板的所有其他内容-并且那么链接器和优化器(如果是代码内联的话)都必须重新运行-这不是一项快速的任务。
  • 构建可能涉及删除磁盘上的文件(例如清理构建输出文件夹)或更改全局系统状态(例如写入非项目构建日志)-我认为程序是否曾经删除过我个人拥有的目录(例如.classC:\git\),该死的最好还是向 me 征求直接许可,每次-尤其是当我在做某事时想对最后的构建输出做某事时。我不想先将构建输出复制到安全目录。这也是为什么“清洁项目”命令是单独的,而不是“构建项目”所隐含的原因。
  • 用户经常每隔几秒钟习惯性地按 Ctrl + S (我是其中的一个)-即使我编写的代码不完整,我也会按 Ctrl + S 在我的编辑器中:存在语法错误甚至破坏性代码的东西-我根本不希望构建该代码,因为它还没有准备好构建!即使我的代码没有错误,IDE也无法推断我的意图。
  • 构建项目是一种获取代码库错误列表的方法,但数十年来一直不需要:IDE长期以来一直存在设计时错误和警告,而无需编译器运行构建(感谢诸如语言服务器之类的东西)-实际上,运行构建只会在IDE的错误窗口中给我双重错误消息,因为我已经在设计时错误列表中收到了错误消息。
  • 至少在Visual Studio中(我不能代表Eclipse),Visual Studio在构建过程中会进入一种特殊的只读模式:因此,在构建过程中,您无法将进一步的更改保存到磁盘上,您可以'不能更改项目或IDE设置,依此类推-这是因为构建过程是一个漫长的过程,取决于项目源处于固定的已知状态-如果源文件正在编译,编译器将无法执行其工作在阅读它们时进行了修改!因此,如果每次保存后IDE始终在构建(即使只是几秒钟),则用户在构建完成之前将不喜欢IDE如何阻止他们执行某些编辑任务(请记住,IDE不仅要显示编辑器,还需要执行更多操作:一些专门的工具窗口可能需要写入项目文件才能打开)。
  • 最后,构建并非没有副作用(实际上,这就是重点!)-始终存在在构建过程中可能出错并破坏系统上其他内容的风险。我并不是说构建有风险,但是如果您有一个自定义的构建脚本,该脚本执行某些风险(例如,它运行C:\Users\me\Documents\Visual Studio Projects)并且构建中断(因为它们总是这样做),则可能会使您的系统陷入困境状态。
  • 还有一个(有点哲学上的)问题:“如果将不完整的更改保存到项目的构建脚本中会发生什么?”

现在,我承认某些项目类型确实可以非常快速地生成,例如TypeScript,Java和C#,而其他项目类型的源文件根本不需要编译和链接,而只需运行验证工具(例如PHP或JavaScript) -并且拥有“保存时生成”功能对这些人可能有用-但可以说,对于数量有限的用户而言,其体验会得到改善,对于其他用户来说显然会恶化。

如果您真的想要保存时构建,那么将其编写为Visual Studio扩展很简单(钩住“ File Save”命令,然后在处理程序中调用Project Build命令)-或养成习惯 Ctrl + S 之后按 Ctrl + B 的内容:)