首页 app开发 正文

net单元测试数据库(net core 单元测试)

app开发 40
今天给各位分享net单元测试数据库的知识,其中也会对net core 单元测试进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!.net如何去写一个接口的单元测试? 代码级的接口(interface)不需要单元测试,因为接口没有实现如果是要测试一个数据接口(比如Sevice服务)的话,那就不是单元测试而是功能测试了

今天给各位分享net单元测试数据库的知识,其中也会对net core 单元测试进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

.net如何去写一个接口的单元测试?

代码级的接口(interface)不需要单元测试,因为接口没有实现

如果是要测试一个数据接口(比如Sevice服务)的话,那就不是单元测试而是功能测试了

该怎么办.NET中使用真实的文件集成测试

首先,我认为,这是更好地编写单元测试时不接触任何外部资源,以测试你的逻辑。在这里,您有两种选择: 你需要抽象层从外部依赖项,如文件系统隔离你的逻辑。您可以轻松地存根或模拟(手工或constraints隔离,如NSubstitute CodeGo.net,FakeItEasy或起订量帮助)这个抽象的单元测试。我喜欢这个选项,在这种情况下,测试你推到更好的设计。 如果你有一个处理遗留代码(只有在这种情况下),你的无constraints隔离(如TypeMock隔离,JustMock或Microsoft正版正货)可存根/模拟几乎一切(例如,密封和静态类,一个非-但是他们的成本钱只有“free”选项是微软正版正货,除非Visual Studio中的你2012/2013高级版/旗舰版。 在单元测试中你并不需要测试外部库,如MEF的逻辑。 其次,如果你想要写集成测试,那么你需要写“幸福路径”测试(当一切都OK),并且测试你的逻辑border情况(文件或目录未找到)测试。不像@谢尔盖Berezovskiy,我要为每个测试用例单独的文件夹。的主要优点是: 你可以给你更清晰表达你的 意图; 你不需要(也就是脆弱的)安装/拆卸逻辑。 即使你决定以后另一个文件夹结构,那么你就可以更轻松地改变它,你就已经有工作代码和测试(在测试工具的重构是非常容易)。 对于这两种,单元测试和集成测试,你普通的单元测试(如NUnit的或xUnit.NET)。有了这个是很容易发动你的测试中集成方案生成服务器上。 如果您决定写这两种类型的测试,那么你需要从集成测试分离单元测试(你可以为每一种测试创建单独的项目)。原因是: 单元测试是一个用于开发。他们必须提供有关系统单位后,最后的代码更改(错误修正,新函数)预期行为的快速反馈。如果他们经常运行,那么开发人员可以快速,轻松地识别一段代码,这打破了该系统。没有人想运行缓慢的单元测试。 集成测试一般比单元测试慢。但是他们有不同的目的。他们会检查是否按预期与真正的依赖关系单位工程。

我会去与一个test文件夹。对于测试用例,你可以把不同的有效/无效的文件到该文件夹为背景设置的一部分。在测试拆机刚刚从文件夹中删除这些文件。 例如与Specflow:Given configuration file not exist

When something

Then foo

Given configuration file exists

And some dll not exists

When something

Then bar

定义每个上下文设置步骤如复制/不复制相应的文件到你的文件夹。您也表定义哪些文件应该被复制到文件夹:

Given some scenario

| FileName   |

| a.config   |

| b.invalid.config |

When something

Then foobar

您应该测试尽可能多的逻辑尽可能与单元测试,通过抽象调用接口背后的文件系统。使用依赖注入和测试,如FakeItEasy可以让你测试你的接口实际上是对文件和文件夹进行操作。

在点但是,您将需要测试的文件系统上工作过,而这正是你需要的集成测试。

你需要测试的东西似乎是相对孤立的,因为所有你要测试的是你自己的文件和目录,你自己的文件系统上。如果你想用等测试数据库或其他外部系统,事情可能是

我不认为你会找到如何最好地做这种类型的集成测试任何“正式规则”,但我相信你是在正确的轨道。想法,你应该努力实现:

明确的标准:让每个测试的规则和目的非常明确。

自动化:能够重新运行测试迅速,没有太多的手动调整。

重复性:一个测试的情况,你可以“重置”,这样你就可以重新运行测试快速,只有轻微的变化。

创建一个可重复的测试场景

在你的情况,我会成立两个主要的文件夹:在其中一切都是因为它被认为是(即正常工作),并在其中一个所有规则被打破。

我会在其中创建这些文件夹和所有文件,然后压缩每个文件夹,并写入逻辑在测试类的解压缩它们。

这些都不是真正的测试;想到他们,而不是为“脚本”设置你的测试方案,使您能够删除和轻松,快速地重新创建文件夹和文件,即使你的主要集成测试应在测试过程中改变它们。之所以把它们放在一个测试类,仅仅是为了让那么容易从界面,你将在测试期间的工作运行。

测试

创建两套测试类,一组对每一种情况(正确设置文件夹与文件夹碎规则)的。将这些测试中文件夹到你(取决于您的情况)的层次结构。

目前尚不清楚如何熟悉与unit-/integration-testing。在任何情况下,我会NUnit的。我喜欢在扩展Should为好。你可以得到这两个来自的NuGet:

install-package Nunit

install-package Should

本应包将让你编写测试代码的方式如下所示:

someCalculatedIntValue.ShouldEqual(3);

someFoundBoolValue.ShouldBeTrue();

请注意,有几个测试的车手提供,与运行测试。我个人只与内置到ReSharper的亚军任何实际经验,但我很满意,它和我没有问题了。

下面是一个简单的测试类具有两个测试的一个例子。请注意,在优先,我们检查了预期的从应,而我们并没有明确的第二个测试任何东西。这就是被打上了[ExpectedException],这意味着如果指定类型的异常在测试运行时不抛出它会失败。你这来验证一个适当的异常被抛出,每当你的一个规则被打破。

[TestFixture]

public class When_calculating_sums

{    

private MyCalculator _calc;

private int _result;

[SetUp] // Runs before each test

public void SetUp()

{

 // Create an instance of the class to test:

 _calc = new MyCalculator();

 // Logic to test the result of:

 _result = _calc.Add(1, 1);

}

[Test] // First test

public void Should_return_correct_sum()

{

 _result.ShouldEqual(2);

}

[Test] // Second test

[ExpectedException(typeof (DivideByZeroException))]

public void Should_throw_exception_for_invalid_values()

{

 // Divide by 0 should throw a DivideByZeroException:

 var otherResult = _calc.Divide(5, 0);

}  

[TearDown] // Runs after each test (seldom needed in practice)

public void TearDown()

{

 _calc.Dispose();

}

}

有了这一切之后,就应该能够创建和重新创建测试场景,并在他们在一个简单的和可重复的方式运行测试。

编辑:正如在Assert.Throws()是另一种选择,以确保抛出异常作为必需的。就个人而言,我喜欢的标签变虽然,你可以检查之类的东西也有。另一个例子(假设自定义正在从你的计算器扔):

[ExpectedException(typeof(DivideByZeroException), ExpectedMessage="Attempted to divide by zero" )]

public void When_attempting_something_silly(){

...

}

我不知道你的程序的体系结构给出很好的建议,但我会尽力

我相信,你并不需要真正的测试文件结构。文件访问服务是由系统定义的/与他们不需要进行测试。你需要在相关的测试这个服务。

你也不必测试MEF。它已经经过测试。

使用SOLID原则进行单元测试。尤其是拿来看单一职责原则,这将允许您创建单元测试,这将不会涉及到每个人。只是不要忘了mocking,以避免依赖关系。

为了使集成测试,你可以创建一个helper类,这将效仿文件结构的情况下,你想测试。这将允许你留下来没有连接到机器上,您将运行这个测试。这样的做法也许不是创造真正的文件结构,但我喜欢它。

我将建立逻辑和测试并发问题和文件系统异常,以确保良好定义的测试

尝试列出的问题域的所有border。如果有太多的,然后再考虑你的问题太广泛的定义,需要被分解的概率。什么是全套的,以使您的系统通过所有测试所需的充分必要条件是什么?再看看每一个条件,把它作为一个单独的攻击点。并列出所有你能想到的方式违反了的。试图证明自己,你发现他们所有。然后写一个测试每个。

如何:编写在单个事务范围内运行的数据库单元测试

如果您使用此方法,则可以在测试结束之后回滚在测试过程中执行的任何更改。下面的过程说明了具体的做法:在使用 BEGIN TRANSACTION 和ROLLBACK TRANSACTION 的Transact-SQL 测试脚本中创建事务。为某个测试类中的单个测试方法创建一个事务。为给定测试类中的所有测试方法创建一个事务。系统必备组件对于本主题中的某些过程,运行单元测试的计算机必须正在运行 Distributed Transaction Coordinator 服务。有关更多信息,请参见本主题末尾的过程。使用Transact-SQL 创建事务使用Transact-SQL 创建事务在数据库单元测试设计器中打开单元测试。指定要创建事务的脚本类型。例如,可以指定预先测试、测试或后期测试。在Transact-SQL 编辑器中输入测试脚本。插入BEGIN TRANSACTION 和ROLLBACK TRANSACTION 语句,如下面的简单示例所示。此示例使用名为 OrderDetails 并包含 50 行数据的数据库表:BEGIN TRANSACTION TestTransaction UPDATE "OrderDetails" set Quantity = Quantity + 10 IF @@ROWCOUNT!=50 RAISERROR('Row count does not equal 50',16,1) ROLLBACK TRANSACTION TestTransaction注意在执行 COMMIT TRANSACTION 语句之后不能对事务进行回滚。有关ROLLBACK TRANSACTION 如何与存储过程和触发器一起使用的更多信息,请参见 Microsoft 网站上的 ROLLBACK TRANSACTION (Transact-SQL)。为单个测试方法创建事务在该示例中,在使用 TransactionScope 类型时,会使用环境事务。默认情况下,“执行连接”和“特权连接”将不使用环境事务,因为这些连接是在执行该方法之前创建的。SqlConnection 具有一个 EnlistTransaction 方法,该方法将活动连接与某个事务相关联。环境事务在创建之后会自行注册为当前的事务,您可以通过 Current 属性来访问它。在该示例中,环境事务在释放之后进行回滚。如果要提交在运行单元测试时进行的任何更改,则必须调用 Complete 方法。为单个测试方法创建事务在“解决方案资源管理器”中,右击测试项目中的“引用”节点,然后单击“添加引用”。将显示"添加引用"对话框。单击“.NET”选项卡。在程序集列表中,单击“System.Transactions”,然后单击“确定”。打开单元测试的 Visual Basic 或 C# 文件。包装预先测试、测试和后期测试操作,如下面的 Visual Basic 代码示例所示: TestMethod() _ Public Sub dbo_InsertTable1Test() Using ts as New System.Transactions.TransactionScope( System.Transactions.TransactionScopeOption.Required) ExecutionContext.Connection.EnlistTransaction(Transaction.Current) PrivilegedContext.Connection.EnlistTransaction(Transaction.Current) Dim testActions As DatabaseTestActions = Me.dbo_InsertTable1TestData 'Execute the pre-test script ' System.Diagnostics.Trace.WriteLineIf((Not (testActions.PretestAction) Is Nothing), "Executing pre-test script...") Dim pretestResults() As ExecutionResult = TestService.Execute(Me.PrivilegedContext, Me.PrivilegedContext, testActions.PretestAction) 'Execute the test script System.Diagnostics.Trace.WriteLineIf((Not (testActions.TestAction) Is Nothing), "Executing test script...") Dim testResults() As ExecutionResult = TestService.Execute(ExecutionContext, Me.PrivilegedContext, testActions.TestAction) 'Execute the post-test script ' System.Diagnostics.Trace.WriteLineIf((Not (testActions.PosttestAction) Is Nothing), "Executing post-test script...") Dim posttestResults() As ExecutionResult = TestService.Execute(Me.PrivilegedContext, Me.PrivilegedContext, testActions.PosttestAction) 'Because the transaction is not explicitly committed, it 'is rolled back when the ambient transaction is 'disposed. 'To commit the transaction, remove the comment delimiter 'from the following statement: 'ts.Complete() End Sub Private dbo_InsertTable1TestData As DatabaseTestActions注意如果使用的是 Visual Basic,则除了 Imports Microsoft.VisualStudio.TestTools.UnitTesting、Imports Microsoft.VisualStudio.TeamSystem.Data.UnitTesting 和Imports Microsoft.VisualStudio.TeamSystem.Data.UnitTest.Conditions,还必须添加 Imports System.Transactions。如果使用的是 Visual C#,则除了 Microsoft.VisualStudio.TestTools、Microsoft.VisualStudio.TeamSystem.Data.UnitTesting 和 Microsoft.VisualStudio.TeamSystem.Data.UnitTesting.Conditions 的 using 语句,还必须添加 using System.Transactions。还必须在这些程序集中添加对项目的引用。为某个测试类中的所有测试方法创建一个事务为某个测试类中的所有测试方法创建一个事务打开单元测试的 Visual Basic 或 C# 文件。在TestInitialize 中创建事务,并在 TestCleanup 中释放它,如下面的 Visual C# 代码示例所示:TransactionScope _trans; [TestInitialize()] public void Init() { _trans = new TransactionScope(); base.InitializeTest(); } [TestCleanup()] public void Cleanup() { base.CleanupTest(); _trans.Dispose(); } [TestMethod()] public void TransactedTest() { DatabaseTestActions testActions = this.DatabaseTestMethod1Data; // Execute the pre-test script // System.Diagnostics.Trace.WriteLineIf((testActions.PretestAction != null), "Executing pre-test script..."); ExecutionResult[] pretestResults = TestService.Execute(this.PrivilegedContext, this.PrivilegedContext, testActions.PretestAction); // Execute the test script // System.Diagnostics.Trace.WriteLineIf((testActions.TestAction != null), "Executing test script..."); ExecutionResult[] testResults = TestService.Execute(this.ExecutionContext, this.PrivilegedContext, testActions.TestAction); // Execute the post-test script // System.Diagnostics.Trace.WriteLineIf((testActions.PosttestAction != null), "Executing post-test script..."); ExecutionResult[] posttestResults = TestService.Execute(this.PrivilegedContext, this.PrivilegedContext, testActions.PosttestAction); }启动Distributed Transaction Coordinator 服务本主题中的某些过程使用 System.Transactions 程序集内的类型。在按照这些过程操作之前,必须确保要运行单元测试的计算机上正在运行 Distributed Transaction Coordinator 服务。否则,测试将失败,并出现下面的错误消息:“测试方法 项目名称.测试名称.方法名称 引发异常: System.Data.SqlClient.SqlException: 服务器‘计算机名称’上的 MSDTC 不可用”。启动Distributed Transaction Coordinator 服务打开“控制面板”。在“控制面板”中打开“管理工具”。在“管理工具”中打开“服务”。在“服务”窗格中,右击 “Distributed Transaction Coordinator” 服务,再单击“启动”。该服务的状态应当更新为“已启动”。现在应当能够运行那些使用 System.Transactions 的单元测试。重要事项即使您启动了分布式事务处理控制器服务,仍然可能出现以下错误:System.Transactions.TransactionManagerCommunicationException: Network access for Distributed Transaction Manager (MSDTC) has been disabled. Please enable DTC for network access in the security configuration for MSDTC using the Component Services Administrative tool. --- System.Runtime.InteropServices.COMException: The transaction manager has disabled its support for remote/network transactions. (Exception from HRESULT: 0x8004D024)。如果出现此错误,您必须为网络访问配置分布式事务处理控制器。有关更多信息,请参见启用网络 DTC 访问 。

net单元测试数据库的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于net core 单元测试、net单元测试数据库的信息别忘了在本站进行查找喔。

net单元测试数据库 单元测试数据库数据准备java单元测试模拟数据库数据junit 单元测试 数据库单元测试 数据库mock单元测试连接数据库单元测试怎么mock数据库单元测试需要mock外部数据库数据库单元测试工具慕课数据库及应用单元测试答案数据库慕课单元测试答案
扫码二维码