从命令提示符运行单元测试失败

时间:2013-09-03 11:39:53

标签: c# teamcity mstest

目前我正在使用一些单元测试,这些测试在visual studio中运行良好但在Teamcity中失败

我将问题追溯到mstests.exe

假设我执行以下步骤:

  1. 创建新的测试项目
  2. 使用以下测试添加新的Test类

    [TestMethod]
    public void TestCanCreateSqLiteConnection()
    {
        // Create the DbProviderFactory
        var factory = DbProviderFactories.GetFactory("System.Data.SQLite");
        // Create the DbConnection.
        var connection = factory.CreateConnection();
        // Assign connection string
        connection.ConnectionString = "Data Source=database.sqlite";
        // check the result
        Assert.IsTrue(connection.GetType().Name.Equals("SQLiteConnection"));
    }
    
  3. 添加app.config文件并添加:

    <system.data>
      <DbProviderFactories>
    
        <remove invariant="System.Data.SQLite" />
        <add name="SQLite Data Provider"
             invariant="System.Data.SQLite"
             description=".Net Framework Data Provider for SQLite"
             type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite" />
    
      </DbProviderFactories>
    </system.data>
    
  4. 通过nuget安装“System.Data.SQLite(x86 / x64)”

  5. 从Visual Studio(2010)运行测试。它运行良好:

  6. 现在我想通过mstest.exe运行相同的测试,所以我:

    1. 打开Visual Studio 2010命令提示符

    2. 导航到bin \ debug文件夹

    3. 执行

      mstest.exe /testcontainer:TestProject1.dll /detail:errormessage
      
    4. 测试最终会失败

      System.DllNotFoundException: Unable to load DLL 'SQLite.Interop.DLL':
      The specified module could not be found. (Exception from HRESULT:0x8007007E)
      
    5. 现在,如果我使用testsettings将调用扩展到mstest.exe,那么测试运行正常。

      mstest.exe /testcontainer:TestProject1.dll /detail:errormessage 
          testsettings:..\..\..\Local.testsettings
      
    6. Local.testsettings没有什么特别之处,即使我创建一个新的testsettings文件并使用它,测试也会通过。

          <?xml version="1.0" encoding="UTF-8"?>
          <TestSettings id="fc837936-41d1-4987-8526-34f9336569f5" name="TestSettings1" enableDefaultDataCollectors="false" xmlns="http://microsoft.com/schemas/VisualStudio/TeamTest/2010">
            <Description>default test run</Description>
            <Deployment enabled="false"/>
          </TestSettings>
      

      所以主要的问题是,为什么这会对我的测试运行产生影响,以及如何在不指定* .testsettings文件的情况下运行我的测试命令行。

4 个答案:

答案 0 :(得分:2)

您需要使用DeploymentItem来确保在通过命令行进行测试时将文件复制到部署目录。我为依赖于SQLite数据库的所有测试类创建了一个基类。

tf.tile(mask_tensor, [1, 1, 3])

答案 1 :(得分:1)

前一段时间我遇到类似的错误消息。如果我没记错的话,以下是问题的症结所在:(它可能与OP没有100%的相关性,但对于那些打击这个问题的人来说可能是有用的。)

问题是我的单元测试在发布模式下全部失败,但有一个例外是抱怨SQLite.Interop.dll的可用性(或缺乏)。我意识到,当在Debug模式下构建时,bin \ Debug文件夹有2个子文件夹(x64和x86),每个子文件夹都有一个SQLite.Interop.dll副本,但是在Release模式下,这些文件/文件夹不存在。

要解决此问题,我在项目中创建了x64和x86文件夹,并添加了相应版本的SQLite.Interop.dll,将Copy to ouput设置为Copy if newer。 (我最初使用&#39; Copy always&#39;但似乎MS Test引擎在测试运行完成时没有关闭 - 这可以锁定文件。因为dll不应该改变定期Copy if newer选项是一种合适的方法。)

这使我的单元测试能够通过发布模式 - 但不幸的是(在OP的情况下),从命令行运行时它们不起作用。仍然试图找出那个 - 我认为它是因为MSTest是32位而SQLite使用的本机代码(可能)是64位但是目前解决这个问题所需的更精细的细节使我望而却步。

答案 2 :(得分:1)

两年后,让SQLite在单元测试中工作仍然很痛苦。

昨天我将当前的SQLite nuget包包含到启用了<Deployment enabled="true"/>的单元测试项目中,并且无法通过dbproviderfactories方法访问sqlite。

我在

中包含了SQLite互操作目录
<Deployment>
  <DeploymentItem filename="packages\System.Data.SQLite.Core.1.0.98.1\build\net40\" />
</Deployment>

但这还不够。使用

访问提供商
DbProviderFactories.GetFactory("System.Data.SQLite");

仍然抛出错误Failed to find or load the registered .Net Data Provider error,除非我进行了此调用var factory = new System.Data.SQLite.SQLiteFactory();之后我可以使用DbProviderFactories访问SQLite。

我将其包含在ClassInitialize方法中,因此只执行一次。

答案 3 :(得分:0)

我遇到过类似的问题,其中测试在Visual Studio 2013中运行良好但如果直接由MSTest运行,很多都会失败。没有使用SQL Lite!

最后,我刚刚在MSTest调用中添加了一个默认的.testsettings文件,现在结果是一致的。