目前我正在使用一些单元测试,这些测试在visual studio中运行良好但在Teamcity中失败
我将问题追溯到mstests.exe
假设我执行以下步骤:
使用以下测试添加新的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"));
}
添加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>
通过nuget安装“System.Data.SQLite(x86 / x64)”
从Visual Studio(2010)运行测试。它运行良好:
现在我想通过mstest.exe运行相同的测试,所以我:
打开Visual Studio 2010命令提示符
导航到bin \ debug文件夹
执行
mstest.exe /testcontainer:TestProject1.dll /detail:errormessage
测试最终会失败
System.DllNotFoundException: Unable to load DLL 'SQLite.Interop.DLL':
The specified module could not be found. (Exception from HRESULT:0x8007007E)
现在,如果我使用testsettings将调用扩展到mstest.exe,那么测试运行正常。
mstest.exe /testcontainer:TestProject1.dll /detail:errormessage
testsettings:..\..\..\Local.testsettings
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文件的情况下运行我的测试命令行。
答案 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文件,现在结果是一致的。