.NET TDD 与数据库和 ADO.NET 实体框架 - 集成测试

发布于 2024-09-05 16:31:13 字数 190 浏览 4 评论 0原文

我正在使用 ADO.NET 实体框架,并使用附加到本地数据库服务器的 AdventureWorks 数据库。对于单元测试,人们采用什么方法来使用数据库?

显然,数据库必须处于预定义的更改状态,以便测试可以彼此隔离......所以我需要能够运行插入和更新,然后在测试之间或之后回滚该批测试已完成。

有什么建议吗?

谢谢。

I'm using ADO.NET entity framework, and am using an AdventureWorks database attached to my local database server. For unit testing, what approaches have people taken to work with a database?

Obviously, the database has to be in a pre-defined state of change so that the tests can have some isolation from each other... so I need to be able to run through the inserts and updates, then rollback either between tests or after the batch of tests are done.

Any advice?

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

沉睡月亮 2024-09-12 16:31:13

我也经历过类似的情况。

将数据存储到数据库并将其保留到之前的状态并不是理想的单元测试。它们是集成测试用例。

为了执行集成测试(插入/更新操作)而不影响实际数据,我建议以下

1.使用不同的数据库(更改实际数据库的名称),并让架构与实际数据库保持相同。

2.将单元测试指向新创建的数据库。

3.现在我们如何创建一个新的数据库,以自动方式单独运行测试?

答:将 SQL 脚本列在批处理文件中,例如这个。(这里我假设您正在使用 SQL SERVER)

例如,sqlcmd -ic:\data\runscripts\InventoryMonthEnd.sql

指定批处理文件,该文件存放要在 MSBuild 进程中执行的 SQL 语句。

示例 MSBuild 任务。

<ItemGroup>
<StoredProcScripts Include="$(RelativeSPDir)/*.sql" />
</ItemGroup>

<Target>
<Exec Command="isql -E -n -b -d DBName -i %(StoredProcScripts.Identity)" Condition="'%(StoredProcScripts.Identity)' != ''"/>
</Target>

I have experienced a similar kind of situation.

Storing data to DB and retaining them to previous state are not ideally unit tests. They are Integration test cases.

In order to perform the integration tests (insert / update operations ) without affecting the actual data ,I would suggest the following

1. Use different database(change the name of the actual DB) , and let the schema remain the same as the actual DB.

2. Point the unit tests to the newly created DB.

3. Now how do we create a new DB , for running the tests alone in an automated way ?

Ans : Have the SQL scripts listed in a batch file , such as this.(here i presume you are using SQL SERVER)

E.g., sqlcmd -i c:\data\runscripts\InventoryMonthEnd.sql

Specify the batch file , which lodges this sql statement(s) to be executed in MSBuild process.

Sample MSBuild Task .

<ItemGroup>
<StoredProcScripts Include="$(RelativeSPDir)/*.sql" />
</ItemGroup>

<Target>
<Exec Command="isql -E -n -b -d DBName -i %(StoredProcScripts.Identity)" Condition="'%(StoredProcScripts.Identity)' != ''"/>
</Target>
肥爪爪 2024-09-12 16:31:13

就我个人而言,我让每个测试创建自己的数据并在测试完成时将其删除。这样,测试所需的数据和测试本身就紧密地结合在一起,并且可以作为一个单元进行维护。对于一组相关测试(在同一个 *Test.cs 文件中)共享的数据,我使用 [TestInitialize] Start()[TestCleanup] Finish()

我还有一个实用程序,可以重新创建一个空的测试数据库,因为如果我正在调试测试并在调试器中终止它,则单元测试的清理代码将不会运行。为了重新创建数据库,我使用 EF 4 的 ObjectContext.CreateDatabase() 方法。

Personally I have each test create it's own data and delete it when the test completes. This way, the data a test requires and the test itself are kept closely together and can be maintained as one unit. For data shared by a set of related tests (in the same *Test.cs file), I use [TestInitialize] Start() and [TestCleanup] Finish().

I also have a utility program that re-creates an empty test database, as the unit test's cleanup code will not run if I'm debugging a test and terminate it in the debugger. To re-create the database, I use EF 4's ObjectContext.CreateDatabase() method.

北斗星光 2024-09-12 16:31:13

您可以使用具有回滚属性的 MbUnit。这将确保测试中所做的所有更改都将被回滚。

http: //weblogs.asp.net/astopford/archive/2006/07/25/MbUnit-database-testing_2C00_-and-thanks-to-Roy.aspx

You can use MbUnit which has a rollback attribute. This will make sure that all the changes made in the Test will be rolled back.

http://weblogs.asp.net/astopford/archive/2006/07/25/MbUnit-database-testing_2C00_-and-thanks-to-Roy.aspx

够钟 2024-09-12 16:31:13

这就是我们解决这个问题的方法:

  1. 首先使用沙盒数据库进行开发/测试
  2. 在测试中创建所有必要的数据在测试
  3. 通过/失败后删除测试创建的所有测试数据。类似尝试...终于

This is how we solved it:

  1. Use a Sandbox database in first place for development/testing
  2. Create all necessary data in the tests
  3. Delete all of the test data created by the tests after they pass/fail. Something like a try...finally
等风也等你 2024-09-12 16:31:13

在测试中管理数据的一种真正有效的方法是使用事务。一位同事向我介绍了这一点,后来我在 C# 中的很多地方看到了它的使用(GOOS),

如果您使用 TransactionScope 并且不提交事务,那么您就有了一种非常有效的保持事物整洁的方法。

A really effective way to manage data in your tests is to use a transaction. A colleague introduced this to me and I later saw it used in a number of places (GOOS)

In C# if you use a TransactionScope and dont comit the transaction you have a really effective way of keeping things clean.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文