VS2012 & TFS2012 单元测试主要问题

Posted

技术标签:

【中文标题】VS2012 & TFS2012 单元测试主要问题【英文标题】:VS2012 & TFS2012 Unit Test major issues 【发布时间】:2012-10-14 11:21:31 【问题描述】:

我们正在使用 VS2012 和 TFS2012 并为我们的代码编写单元测试。我们希望报告代码覆盖率,并在我们的单元测试中使用 .config 文件来测试 appsettings,以及一些其他的日志记录设置、MS Enterprise 库设置等。


App.config 无法在新的测试框架中运行

MS 的新测试框架应该很棒,但对我来说根本没有那么好。 当新框架不再使用配置文件时,我应该如何在配置文件中设置一些基本配置?

我们遇到了混合模式 dll 的问题,并找到了解决方法:添加

<startup useLegacyV2RuntimeActivationPolicy="true"> 

到 app.config。但这对我们的单元测试项目不起作用。因为配置文件不再存在。上网搜了一下,找到了解决办法

'Problems with .Net 2.0 Mixed Mode Assemblies inside Visual Studio .Net 4.5 Test Projects'

这意味着在程序文件目录中编辑 Visual Studio 11 本身的文件,我认为这不是一个很好的解决方案....

那么一些基本的应用设置呢?我该如何设置?


不要使用 .testSettings 文件

MS 也不推荐使用旧的 .testsettings 文件,因为那时使用的是旧的测试框架。如果我使用 .testsettings 文件,我无法在我的 tfs2012 构建服务上设置代码覆盖率。

另一个问题是我们的代码需要一个 dll (system.data.sqlite.dll),但只有在运行时单元测试代码才需要这个 dll。所以不需要参考。我们通过使用 testsettings 文件上的部署选项卡解决了这个问题。但在新框架中,您不应该使用 testsettings 文件。如果需要文件,则具有 [deploymentitem] 属性。但是 deploymentitem 属性只能用于 [testmethod] 而不能用于 [testinitialize] 或 [assemblyinitialize] 方法。但是我们的代码需要[testinitialize]方法中的dll。所以没有办法让dll就位。

只是在[assemblyinitialize](或testinitialize)方法中用File.Copy复制是行不通的。

将 dll 作为文件添加到项目中,并将“复制到输出目录”设置为“始终复制”,如“Configuring Unit Tests by using a .runsettings File”中所述,也根本不起作用。

(真的不是很好)解决方案是添加 dll 作为引用,然后实例化一个类,然后什么都不做。这种方式需要 dll 否则它不会构建,因此 dll 将自己部署到正确的目录。


如何解决我的问题??? - 我想在我的单元测试中使用配置文件。 - 我想在“assemblyinitialise”和/或“classinitialize”方法中部署一些需要的文件。 - 我希望启用 TFS2012 nightly build 上的代码覆盖率。

【问题讨论】:

【参考方案1】:

a) App.config 在新的测试框架中不起作用

这应该仍然有效。我认为在这种情况下缺少的是这个 .config 文件没有与您的测试 dll 一起复制。您能否将其设置为部署项并重试?

b) 不要使用 .testSettings 文件

.testsettings 和代码覆盖率。 VS 2012 版本仍然支持使用 .testsettings 文件设置代码覆盖率。您只需选择 mstest 2010 测试运行器并在构建定义中指定 .testsettings 文件

如果您在 .testsettings 文件中除了代码覆盖率设置之外没有任何其他内容,那么您可以轻松迁移到 2012 测试运行器并在下拉项中选择“启用代码覆盖率”

复制测试初始化​​所需的文件 您可以通过 .testsettings 文件执行此操作,也可以执行构建后文件复制任务。这样做非常简单,对其他任何事情都没有影响。使用“复制到输出目录 = 始终复制”确实有效。请使用示例解决方案进行尝试,看看您是否可以缩小在您的设置中这不起作用的原因。

【讨论】:

a) 一方面,app.config 似乎正在工作,并且 app.config 位于单元测试的外部目录中(由 VS2010 重命名为 [mydllname].dll.config应该),但是为什么启动属性(useLegacyV2RuntimeActivationPolicy)不起作用呢?它在配置文件中,配置文件在正确的位置,但我仍然收到混合模式错误。我提到的网址中描述了该解决方案。另一方面,我使用 log4net 进行日志记录,这适用于 app.config。看起来有些事情有效,有些事情却没有。t b) 问题是我需要一个 dll 文件,但该项目确实在没有引用它的情况下构建。添加对 dll 的引用并将本地副本设置为 true 并没有完成这项工作。将 dll 添加为文件,并设置“复制到输出目录 = 始终复制”并没有完成这项工作。创建一个 assemblyinitialize 方法(在它上面带有 assemblyinitialize 属性),并且有一个 File.Copy 到测试的输出目录不起作用。我使用 TestContext 尝试了所有已知的目录。 TestResultsDirectory、TestRunDirectory、TestRunResultsDirectory、TestDir、TestDeploymentDir。 continue b) 在任何 TestResults 目录被文件填充之前,我已经在应该使用 dll 的 [TestInitialize] 方法上运行测试时出错。所以在结果目录被文件填充之前就出现了错误。 continue a) 我现在在构建服务器上遇到问题,混合模式错误已在本地机器上修复(更改 c:\program 文件中的配置文件)但在 tfs2012 构建服务器上我得到这个错误。 a) 您需要在构建服务器上进行相同的修复 b) 请查看 msbuild 中提供的 postbuildevent,以将您的文件复制到 $(OutDir)。我无法重现这一点,因此很难提供任何理由说明这对你不起作用。

以上是关于VS2012 & TFS2012 单元测试主要问题的主要内容,如果未能解决你的问题,请参考以下文章

TFS2012 vs Jetbrains TeamCity+YouTrack [关闭]

使用TFS 2010在Visual Studio 2012中进行代码审查

JIRA vs TFS 2012 作为完整的 ALM 系统 [关闭]

签入前运行单元测试

VS2012 连接TFS 报错TF31002

Visual Leak Detector 不适用于 VS2012 中的单元测试