MSTest.exe找不到app.config文件。

22

我目前正在尝试从NCover运行MSTest.exe,但我认为这个问题通常适用于从命令行运行MSTest.exe。

如果我使用“/noisolation”参数,则MSTest.exe似乎会按预期找到并使用app.config。如果没有它,NCover就无法捕获任何覆盖信息。根据我目前的研究,NCover需要/noisolation。所以问题是如何在传递该参数时使我的*.config文件起作用。

我的NCover设置如下:

待分析应用程序
C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\IDE\MSTest.exe

工作目录
C:\Documents and Settings\MyProfile\My Documents\Visual Studio 2008\Projects\XYZ\XYZ.CoreTest\bin\Debug

应用程序参数
/noisolation /testcontainer:"C:\Documents and Settings\MyProfile\My Documents\Visual Studio 2008\Projects\XYZ\XYZ.CoreTest\bin\Debug\XYZ.CoreTest.dll"



更新:我添加了一个跟踪,显示我的配置(不出所料)正试图从“C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\IDE\MSTest.exe.Config”读取。

更新2:如有可能,我不想编辑MSTest.exe.Config。那只是不太可移植。


相关链接:https://dev59.com/jW445IYBdhLWcg3wia2V(包含潜在解决方案) - Lauri Harpf
9个回答

15

以下是在此链接的Craig Stuntz评论中提供的MSTest操作步骤。

  1. 在“解决方案资源管理器”中,右键单击“解决方案”(而不是项目)。

  2. 点击“添加”和“新建项目”。

  3. 在分类中选择“测试运行配置”。

  4. 现在选择“测试运行配置”并将其添加到您的项目中。

  5. 在“解决方案资源管理器”中,双击刚刚创建的测试运行配置。

  6. 点击“部署”选项卡。

  7. 将您的配置文件作为部署文件添加(如果适用,则部署包含该文件的整个文件夹)。

我花了一些时间才明白这些步骤,但我处于类似的情况,并且这对我有效。


2
非常感谢!这个小改动救了我的一天。在使用VS2010时,“测试运行配置”被称为“测试设置”。然后,添加配置文件就对我有用了。 - Marcel
1
在2010年对我没有任何作用。仍然没有解决这个问题的办法。我无法阻止它从/IDE/目录中读取。 - BradLaney

7
在Visual Studio中,将App.config文件的属性标记为CopyAlways。(右键单击文件,在属性面板中选择属性即可)

完成后,(重命名的)app.config就在我的输出文件夹中,紧挨着程序集...这就是它一直在做的事情。但是我的应用程序仍然尝试读取MSTest.exe.config而不是MyAssembly.dll.config。如果我省略/noisolation开关,则会读取正确的文件。 - Larsenal
刚遇到了同样的问题,这个方法对我很有效。谢谢! - Dan Puzey
简单的方法! +1 - Vielinko

2

在使用MSTestRunner插件的Jenkins构建中,我遇到了同样的问题。通过勾选配置页面中的Omit NoIsolation解决了该问题。


2

看起来链接已更改为http://docs.ncover.com/ref/2-0/whats-new-in-ncover-2-0/release-notes-for-ncover-2-1-0/。 - Regent

1

有一种技术可以将配置文件的内容合并,详见此处。您可以在MSTest.exe.Config中添加一个固定的文件包含行,然后将应用程序的app.config复制到该固定文件位置。这样做虽然不太美观,但比为每种情况都修改MSTest.exe.Config更具可移植性。


0

我以前从未使用过NoIsolation,但如果我理解正确的话,它实际上在MSTest类中运行所有测试代码。因此,它会读取MSTest的App config文件,这是必须的。如果您坚持使用noisolation,我认为您需要将您的App.config合并到MSTest.exe.config中。当然,这是一种hack方法。

最好完全避免使用noisolation。如果出现错误,请尽可能修复错误。如果无法重新组织(进行重大重构)应用程序,则可以解决错误。我不确定是否有一个“优雅”的替代方案。

我在this URL找到了“我认为我们需要找到这个问题的根本原因,以避免noisolation开关。您可能需要修改您的应用程序。是否可能创建一个简单的解决方案来重现相同的问题?”。


如果是这种情况,那么我的实际问题也许与如何在不使用 /noisolation 的情况下使 NCover 正确地与 MSTest.exe 协同工作有关。 - Larsenal
只是一些想法,很抱歉听起来有点批评的意味。并非故意如此。 如果你正在使用团队系统,也许可以尝试使用那里的代码覆盖率? http://blogs.vertigosoftware.com/teamsystem/archive/2006/02/06/nUnit_and_Team_System_Code_Coverage.aspx - oglester

0

尝试将其名称从app.config更改为projectname.extension.**config**

例如,如果您有一个名为proj1的单元测试项目,并使用其dll,请将app.config重命名为proj1.dll.config

这对我起作用了。


0
为了澄清混淆: 不使用 /noisolation = 如果找到 SameNameAsYourDll.dll.config 文件,它将自动部署与测试 dll 一起,并用于运行该程序集中的测试的应用程序配置
使用 /noisolation = 所有我们在测试、主机进程和其他所有内容之间进行的隔离都被抛弃了。我们可能仍然会进行一些隔离,但您不会获得应用程序域对您的测试 dll 唯一性的额外好处。因此,您的 dll 配置将无法帮助您。

-2

好的,我冒着引发单元测试战争的风险发帖,但我认为问题出在你的测试上,甚至可能是你的代码。你应该进行重构。

单元测试应该是原子性的。一个单独的测试不应该有任何外部依赖关系,而配置文件就是这样的依赖关系。没有测试应该依赖于配置文件。

如果你正在测试一个使用配置文件信息的方法,请重构你的代码,使得配置信息在方法之外被读取,并在调用方法之前作为属性传递给方法或设置。这样你的测试可以将值传递给方法,或在测试设置期间设置属性。

如果你需要app.config来连接数据库,那么你就自己解决吧。数据访问层(DAL)通常很难进行单元测试。如果是用于Web服务连接字符串,请不要使用它--模拟接口即可。


我所做的更适合被称为集成测试,而不是单元测试。在这种特殊情况下,我需要对现有代码库进行追加测试。 - Larsenal
哦,我讨厌做那个!啊,好吧,我坚持我的说法...如果你有机会重构你的代码使其更易于测试,那就去做吧。如果你手头受限,那就无能为力了。此外,如果可以的话,尝试模拟你的集成,这将对你以后产生巨大的帮助。 - Randolpho

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接