天高任鸟飞, 海阔凭鱼跃
海粟007
关键字:NUnit 单元测试 VS2003 SQL Server 数据库

引言

        前兩天寫了一篇VS2005下應用NUnit進行關于數據庫的單元測試的隨筆,由于工作的需要,又給部門人員寫了一個vs003下的快速入門,今天稍作整理發了上來。由于我在臺資公司工作,因此工作的時候都是使用繁體,這里就懶得轉換為簡體了,希望看繁体不習題的朋友見諒。

        为了避免数据库测试产生不必要的垃圾数据以及测试造成的数据库异常,因此要建立资料库操作的事务机制,在测试后进行事务回滚即可。如果用NUnit自己手工编写事务显然代码量大,而且容易出现错误,因此建议使用NotNet提供的EnterpriseServices组件进行編程,這樣可以大大降低编码的复杂度和提高數據庫的安全性。

閱讀對象

  • 對NUnit有一定了解
  • 有VS2003開發經驗
  • 其他對單元測試有興趣的人員

環境需求和設置

  • Vs2003
  • NUnit(我安裝的NUnit2.4.6)
  • 所需OS: win2000Sever、WinXP、Win2003
  • DB: SQL Server2000或更高
  • OS環境必須包含MSDTC(后面有關于此的詳細論述)。

編寫步驟

第一步:新建測試工程
            新建測試工程為AccountTest,并為該工程添加NUnit框架以及EnterpriseServices組件引用。 如下圖
 

添加后的工程設置如下

第二步:編寫測試單元文件
           在這里我建立了一個通用的測試數據庫的基礎類,其他單元測試類都從此類繼承實現。(代碼如下)
using System;
using System.Text;
using System.EnterpriseServices;
using NUnit.Framework;
using System.Runtime.InteropServices;
using System.Data.SqlClient;
namespace Bank
{
/// 
/// 這是一個測試各種单元测试的基礎類,所有的要操作數據庫的測試類都從它繼承
/// 這樣就能保證所有的測試操作無論是新增、修改、刪除都能順利測試成功,但是并吧產生任何垃圾數據
/// 也不會修改任何實際運行的數據庫
/// 
[Transaction(TransactionOption.Required)]
[TestFixture]
public class DatabaseFixture : ServicedComponent
{
protected SqlConnection Connect = null;
/// 
/// 构造函数
/// 
public DatabaseFixture()
{
}
/// 
/// 本属性标识此测试方法结束后调用,所有事务的撤销工作都是由它来实现的
/// 
[TearDown]
public void TransactionTearDown()
{
if (ContextUtil.IsInTransaction)
{
ContextUtil.SetAbort();
}
}
/// 
/// 我在这里建立了数据库链接,其实不建立也行
/// 
[SetUp]
public void SetFirst()
{
try
{
Connect = new SqlConnection("Integrated Security=SSPI;Persist Security Info=False;User ID=sa;Initial Catalog=NorthWind;Data Source=127.0.0.1");
Connect.Open();
}
catch (Exception ex)
{
}
}
}
}
然后編寫測試單元類(代碼如下)
         using System;
using System.Text;
using NUnit.Framework;
using System.Data;
using System.Data.SqlClient;
namespace Bank
{
[TestFixture]
public class DataTest: DatabaseFixture
{
/// 
/// 这个就是我建立的测试方法,大家发现反复执行,也不会实际把数据新增到数据库中
/// 
[Test]
public void InsertTest()
{
string SQL = "insert Categories(CategoryName, Description) values('测试类型', '测试类型描述')";
Assert.IsTrue(ExecSQLNoQuery(SQL));     //如果新增失败这行代码测试无法通过
//执行查询,看是否真的新增到数据库
DataSet ds = QueryResult("select * from Categories where CategoryName='测试类型'");
//下面两句可以测试是否真的添加到了数据库
Assert.IsNotNull(ds);
Assert.AreEqual(1, ds.Tables[0].Rows.Count);
//测试新增的数据和是否正确
StringAssert.IsMatch("测试类型描述FF", ds.Tables[0].Rows[0]["Description"].ToString());
}
/// 
/// 执行没有返回结果的SQL语句
/// 
protected bool ExecSQLNoQuery(string SQL)
{
SqlCommand Command = new SqlCommand();
Command.Connection = Connect;
Command.CommandType = CommandType.Text;
Command.CommandText = SQL;
bool retFlag = false;
try
{
Command.ExecuteNonQuery();
retFlag = true;
}
catch (Exception ex)
{
}
finally
{
Command.Dispose();
}
return retFlag;
}
/// 
/// 提供SQL语句返回查询结果
/// 
protected DataSet QueryResult(String SQL)
{
SqlCommand Command = new SqlCommand();
Command.Connection = Connect;
Command.CommandType = CommandType.Text;
Command.CommandText = SQL;
SqlDataAdapter Adapter = new SqlDataAdapter(Command);
DataSet ds = new DataSet();
bool retFlag = false;
try
{
Adapter.Fill(ds);
retFlag = true;
}
catch (Exception ex)
{
}
finally
{
Adapter.Dispose();
Command.Dispose();
}
return retFlag == true ? ds : null;
}
}
}
第三步、添加命名密鑰
        由于使用 DotNet的 EnterpriseServices 必須要有強命名機制,因此必須為工程添加密鑰,使用VS2003提供的 sn.exe(C:\Program Files\Microsoft Visual Studio .NET 2003 DK\v1.1\Bin) 即可,在命令行執行 sn.exe -k aa.snk 即可,然后復制到工程目錄aa.snk(我復制到了sln所致目錄)。
        然后在把此密鑰文件添加到工程中。 打開工程的 AssemblyInfo.cs 文件改寫AssemblyKeyFile為 [assembly: AssemblyKeyFile(@"..\..\..\aa.snk")],注意這里的相對路徑為目的文件編譯輸出路徑相對于 aa.snk 文件所在位置的的路徑。由于本工程的輸出路徑為sln所致目錄下的AccountTest\bin\debug\所以上面的路徑為 "..\..\..\"
運行NUnit查看結果
運行NUnit有兩種方式
I)   運行nunit.exe,然后在File菜單加載測試輸出檔案。
II)  也可以直接用通過配置工程屬性(Property Pages)頁的 配置選項(Configuration Properties)的 Debugging 進行Debug模式進行調試,這種方式的好處是可以跟蹤到源碼調試。配置參見下圖

通過上面設置我想您一定可以看到測試通過的綠色進度條,經過上面設置如果您測試無法通過一般是MSDTC配置的錯誤,下面會對MSDTC配置做詳細介紹



MSDTC配置以及錯誤異常

1.  什么是MSDTC
         MSDTC 是微软分布式传输协调程序,该服务用于管理多个服务器,是一個COM+服務,支持分布式事務處理,EnterpriseServices 正是依賴于它的服務組件。因此運行EnterpriseServices的前提是必須有 MSDTC 服務的支持。
2.  MSDTC 缺省安裝了嗎
         MSDTC MSDTC在 win2000 和 XP 下是缺省安裝的,但是沒有啟用。在win2003下需要手工安裝,方法是新增删除程序中,点击新增组件,然后选中Application Servers 点击详细资料,然后选中启用网络DTC存取,保存安装即可。

3.  MSDTC 如何啟用配置MSDTC
        在XP和Win2003下配置MSDTC的步驟是一樣的,进入控制面板--系统管理工具--组件服务。点击我的电脑--属性--MSDTC--安全性设定,具體設置如下图

在Win2000下配置方法為:进入控制面板--系统管理工具--组件服务,點擊我的电脑--属性--MSDTC 點擊 Start 就可以了。界面圖如下


posted on 2008-04-23 18:32  海粟007  阅读(2740)  评论(7编辑  收藏  举报