【问题标题】:Running MsTest from the command line with a custom assembly base directory使用自定义程序集基目录从命令行运行 MsTest
【发布时间】:2013-07-28 11:48:51
【问题描述】:

我在网络上做了很多研究并尝试了一些设置,但我无法重现在 Visual Studio 2012 的命令行中运行 MsTest 的行为。

我们的解决方案由许多项目组成,这些项目构建到位于解决方案级别的同一 bin 文件夹(例如 C:\MySolution\bin) - 这是被测代码 (CUT)。测试被分组在一个单独的项目中,该项目驻留在自己的解决方案中并构建在自己的 bin 文件夹中(例如 C:\MySolution\Tests\bin)。确实有很多插件,因此我们希望 MsTest 在运行测试时引用 CUT bin 文件夹,而不是将所有内容复制到 TestResults 文件夹。我们确实在 Visual Studio 2012 中通过编辑 .testrunco​​nfig 并将“.\bin”指定为“要加载的程序集的根文件夹”(在编辑 testrunco​​nfig 时的“单元测试”选项卡中)实现了这一点.所以我们可以在 VS2012 中加载测试解决方案并在那里运行测试,而无需将 bin 文件夹内容复制到 TestResults 目录。

现在我想创建一个 .bat 文件,它可以像在 VS2012 中一样运行 MsTest,这样我们就可以省略启动 Visual Studio 来运行测试。我现在正在研究如何在命令行上执行 MsTest,但一直很沮丧。这是我尝试过的(在 VS 命令提示符下的解决方案级别执行的命令):

MsTest /testcontainer:Tests\bin\Tests.dll

这根本不起作用,它甚至找不到 Tests.dll 需要运行的引用 dll。所以我重新使用了配置并再次运行它:

MsTest /runco​​nfig:LocalTestRun.testrunco​​nfig /testcontainer:Tests\bin\Tests.dll

还是不行。它可以开始测试,但都失败了。我收到了很多类似的警告

警告:测试运行部署问题:未找到测试容器“C:\MySolution\Tests\bin\tests.dll”直接或间接引用的程序集或模块“....”。

最后它说:

配置的应用程序基目录 'C:\MySolution\TestResults\User_Machine 2013-07-28 13_16_59\Out\bin' 不存在。将使用测试目录。

当我将 testrunco​​nfig 中的选项 applicationBaseDirectory更改为绝对路径 (C:\MySolution\bin) 时,它起作用了。我仍然收到很多警告,例如:

警告:测试运行部署问题:未找到测试容器“C:\MySolution\Tests\bin\tests.dll”直接或间接引用的程序集或模块“....”。

但无论如何,指定绝对路径并不是一个真正可行的解决方案。 如何在命令行上使用不同但相对的程序集基目录运行 MsTest?

我的 LocalTestRun.testrunco​​nfig 如下:

<?xml version="1.0" encoding="UTF-8"?>
<TestSettings name="Local Test Run" id="...." xmlns="http://microsoft.com/schemas/VisualStudio/TeamTest/2010">
  <Description>This is a default test run configuration for a local test run.</Description>
  <Deployment>
    <DeploymentItem filename="Tests\....\Resources\" />
  </Deployment>
  <Execution hostProcessPlatform="MSIL">
    <TestTypeSpecific>
      <UnitTestRunConfig testTypeId="....">
        <AssemblyResolution applicationBaseDirectory=".\bin">
           <TestDirectory useLoadContext="true" />
        </AssemblyResolution>
      </UnitTestRunConfig>
      <WebTestRunConfiguration testTypeId="....">
        <Browser name="Internet Explorer 7.0">
          <Headers>
            <Header name="User-Agent" value="Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)" />
            <Header name="Accept" value="*/*" />
            <Header name="Accept-Language" value="{{$IEAcceptLanguage}}" />
            <Header name="Accept-Encoding" value="GZIP" />
          </Headers>
        </Browser>
      </WebTestRunConfiguration>
    </TestTypeSpecific>
    <AgentRule name="LocalMachineDefaultRole">
    </AgentRule>
  </Execution>
</TestSettings>

【问题讨论】:

标签: visual-studio unit-testing visual-studio-2012 mstest


【解决方案1】:

经过更多搜索,我们改为使用 VS2012 附带的测试控制台运行器:

VSTest.Console.exe Tests\bin\Tests.dll /Framework:framework40 /Settings:LocalTestRun.testrunco​​nfig

这适用于 applicationBaseDirectory 的相对路径。

【讨论】:

    【解决方案2】:

    这是由于 MSTest 错误将当前目录设置为其自己的工作目录,而不是测试项目的 bin(或部署)文件夹。解决方法是在测试类的构造函数中执行以下代码:

    Environment.CurrentDirectory(AppDomain.CurrentDomain.BaseDirectory);
    

    我从http://www.ademiller.com/blogs/tech/2008/01/gotchas-mstest-appdomain-changes-in-vs-2008/那里得到了这个想法;但是,请注意,至少在我的情况下,它需要设置 Environment.CurrentDirectory,而不是如文章中建议的相反。

    【讨论】:

    • 对我来说,在 .net4.5 的 vs2013 中,以下工作:Environment.CurrentDirectory = AppDomain.CurrentDomain.BaseDirectory;
    猜你喜欢
    • 1970-01-01
    • 2012-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-20
    • 2022-01-20
    • 2012-11-13
    • 1970-01-01
    相关资源
    最近更新 更多