在 NHibernate 环境中创建数据驱动的单元测试

Create Data Driven Unit Tests in an NHibernate Environment

Background

We are slowly updating a very old application (based on "normal" SqlCommand queries and everything that comes with it) with some new code. To enhance stability and ease further development, we introduced NHibernate into the mix, along with good programming practices and what not.

So now, whenever a new module (not that the application is actually modular, but lets call it that) needs a large enough update, we break out all functionality into the "new" world of NHibernate and create a facade for the old code, so it keeps working.

设置

我正在为外观创建单元测试。为此,我创建了一个 base class,所有单元测试 classes 都继承自该基础。这个 class,在 TestInitialize

每个 TestClass(继承自上面的那个)都有自己的 DataSet.sql,它在 TestInitialize 上执行,

每个 TestClassTestMethod 然后遍历 testExecutions 行,创建所需的对象 (NHibernate),调用它测试的外观,然后 Asserts return根据 testExecutions table.

中定义的数据编辑数据

问题

测试工作正常,我得到了我期望的结果,但是...

我对这种方法有一个大问题:在测试输出中可见的每个测试 运行 实际上是很多很多测试执行。但从外面看,它看起来就像一个单一的测试,即使测试本身实际上 运行 多次测试 facade 方法,每次都有新数据

我读到 Data Driven Unit Tests 并认为这正是我已经在做的事情。所以,我决定不使用我自己的东西,而是使用它。

但问题是:TestContext.DataRow显然不了解NHibernate,所以我实际上并没有得到测试所需的对象,而是一个DataRow的对象,其中填充了所有数据Sql 对象的“旧”方式。

有没有办法“教”DataSource return Nhibernate 对象?我是否必须编写自己的 DataSource 属性才能完成此操作?那需要看起来怎么样?

或者有别的办法

有没有办法让我的 TestMethods 像数据驱动测试那样记录 testExecutions 上的迭代?所以我没有一个测试,但是方法内部的实际测试量运行?

您绑定了 MsTest 吗?考虑使用 NUnit,它具有完全适合您的场景的扩展点。查看 [TestCaseSource] 属性 http://www.nunit.org/index.php?p=testCaseSource&r=2.5.9,它允许您引用一个方法来从中获取测试数据。您从那里获取的数据将显示为单独的单元测试。

该方法必须是静态的,即您必须通过使用静态成员来解决传递 NHibernate 会话的问题,您可以在 class 或测试设置方法中进行设置。

好的,我现在设法让它工作了,尽管我不得不更改相当多的代码。

我的问题的根源是,我使用 [TestInitialize] 创建数据库结构(架构、tables 等),包括设置数据和测试-运行他们自己。

MSTest 和 NUnit 对事物的看法都不同。在测试 运行 之前,测试 运行 需要存在。这意味着,到 [TestInitialize](或 [SetUp] 分别)为 运行 时,查询 [DataSource](或 [TestCaseSource])。

显然这在我的情况下不起作用,因为我只使用生成 table 结构的相同方法为测试 运行 创建了数据。

我修改了我的测试套件,以便测试 运行 数据包含在一个单独的文件 (Access DB) 中,而 conext(模式,tables,初始数据)是新创建的对于每种测试方法。

如果不是烦人的 Visual Studio 2010 Bug 导致 [TestInitialize][TestCleanup] 方法在 运行 的第一次迭代中,这已经可以正常工作了 [DataSource]d 测试,所以我不得不将所有这些放在 class...

的普通构造函数中

尽管如此,现在一切正常,我可以看到实际的测试量 运行 :-)