在Visual Studio中进行单元测试时,不必要的项目会重建

时间:2014-04-14 13:58:01

标签: unit-testing build visual-studio-2013

我知道this问题(和答案),但尽管尝试了所有建议的选项,我仍然被卡住了。

我有一个包含多个项目的解决方案,但对于这个特殊情况,我们说我已经拥有ExampleProjectA和相应的单元测试项目ExampleProjectATest。第一个被添加为测试项目的参考 - 不是通过Visual Studio的"Project References",而是作为DLL的链接(类似"..\Path\$(Config)\ExampleProjectA.dll") - 这是由于我们公司构建服务器要求,但是当我们还有"Project References"时,问题也存在。

  • 构建然后运行单个单元测试正常
  • 更改单元测试中的单个字母,然后让测试运行始终导致重建ExampleProjectA,即使这不是必需的
  • ExampleProjectA中的所有(只有少数)文件从“始终复制”设置为“如果更新则复制”在各自的属性中没有帮助
  • 选中Tools => Options => Projects and Solutions => Build an Run下的复选框(见下文)也没有改变任何内容Visual Studio 2013 setting

要查看是否有更多可用信息,我将构建输出设置更改为诊断。每次触发ExampleProjectA的重建时,输出窗口中的第一行是

1>项目'ExampleProjectATest'不是最新的。在输出文件'C:\ tfs \ mysolution-dev \ exampleprojectatest \ bin \ Release \ exampleprojectatest.pdb'之后修改输入文件'c:\ tfs \ mysolution-dev \ exampleprojectatest \ myfolder \ namegeneratortest.cs'。

写入窗口的类名(例如namegeneratortest.cs)会根据我更改的测试文件而更改。

不确定此消息的原因,但下一步是禁用Project properties => Build => Advanced => Output => Debug Info => None下的调试信息,如下所示:

Advanced Build Settings

仍然相同,没有任何改变。

我尝试的另一件事是检查我的解决方案文件夹中包含的文件的时间戳(因为有一个用户有一个带有未来时间戳的文件的情况 - 请参阅链接帖子) - 无济于事。

我尝试的最后一件事是将Configuration Manager中的构建设置更改为其他目标平台 - 某些设置不允许我成功构建解决方案,其他一些设置也是如此,但描述的问题仍然存在,因此没有变化。

与Visual Studio Test Runner和ReSharper提供的行为类似(虽然不一样)。

Visual Studio Test Runner

项目'ExampleProject'不是最新的。在输出文件'C:\ tfs \ mysolution-dev \ exampleprojecta \ bin \ exampleprojecta.pdb'之后修改输入文件'C:\ tfs \ mysolution-dev \ exampleprojecta \ Views \ Shared \ someview.cshtml'。

ReSharper Test Runner

项目'ExampleProjectATest'不是最新的。在输出文件'C:\ tfs \ mysolution-dev \ exampleprojectatest \ bin \ Release \ exampleprojectatest.pdb'之后修改输入文件'c:\ tfs \ mysolution-dev \ exampleprojectatest \ myfolder \ namegeneratortest.cs'。

我正在使用带有ReSharper 8.2的Visual Studio 2013 Premium Edition和最新更新,我们的解决方案文件中的项目都在C#中。

更新

为了澄清 - 输出窗口中的第一行确实显示了必须重建测试项目 - 这很好。但是,以下行表明还必须重建ExampleProjectA,这不是必需的。输出窗口的后续消息还显示其他项目(从ExampleProjectA引用)必须重建。

更新2

尽管安装了Update 4,但没有任何改变。

3 个答案:

答案 0 :(得分:10)

对于我的情况,解决方案是从"始终复制"更改配置文件的构建操作。到"复制如果更新"。需要一段时间才能找到,因为我必须更改构建输出详细信息以获取有关哪个文件导致错误的详细信息,例如

Project 'xyz' is not up to date. Project item 'c:\my\path\web.config.dev' has 'Copy to Output Directory' attribute set to 'Copy always'.

根据我的经验,在构建多次时也会显示不同的文件名,因此如果问题仍然存在,请确保您拥有正确的文件名和/或再次构建。

另请查看this question and its answers以查找更多信息。

答案 1 :(得分:0)

检查您正在使用的Visual Studio 2013版本。更新1有一个很大的问题,它重建一切。请参阅:https://connect.microsoft.com/VisualStudio/feedback/details/811112/unnecessary-solution-rebuild-on-each-test-run

升级到Update 3就行了!

我不确定Resharper是否也会影响事情。我建议暂时卸载它。

答案 2 :(得分:0)

我通过删除\ obj文件夹中的.pdb文件解决了这个问题。似乎visual studio正在检查文件修改时间以决定是否应该构建项目(在您的情况下为ExampleProjectA)并且.cshtml比pdb更新。但是在启动构建时,.cshtml文件中的项目更改不会触发.pdb重建,因此问题仍然存在。

通过删除\ obj文件夹中的.pdb(不在\ bin中,因为文件从\ obj复制并保留旧的修改时间).pdb的修改时间比.cshtml和VS更新在运行测试之前不需要构建项目。当然,这只会在下次修改.cshtml文件之前有效,这就是我将其限定为解决方法的原因。