當前位置:
首頁 >
利用COM+对数据库操作进行单元测试
發布時間:2025/3/21
17
豆豆
生活随笔
收集整理的這篇文章主要介紹了
利用COM+对数据库操作进行单元测试
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
當單元測試需要對數據庫執行CRUD(Create,Retrieve,Update,Delete)操作時,測試過后會在我們的數據庫中留下大量重復的垃圾數據,這些垃圾很礙眼不是嗎?而且我們的下一個測試有可能因為這些垃圾產生一些錯誤。
那么我們要如何處理這些垃圾數據和保證測試的穩定的呢?顯然,我們需要在每次測試之前和測試完成之后讓數據庫都保持相同的狀態。換句話說,就是我們需要"undo"這些在測試中對數據庫執行的CRUD操作。
對于我們需要的這種"undo"操作,你以前是怎么做的呢?手動的移除還是使用ADO.NET的事物處理呢?這些方法都可行,但對我們來說還不夠好。因為它們都需要我們編寫更多的代碼,影響我們的開發效率。
現在,就要開始說本文的重點了,利用COM+的自動事務處理功能來幫助我們實現我們的"undo"。
首先,寫一個基類,此類能夠在每一個方法完成后自動回滾對數據庫的操作:
using?System;
using?NUnit.Framework;
using?System.EnterpriseServices;
namespace?TransactionTest
{
????[TestFixture]
????[Transaction(TransactionOption.Required)]
????public?class?DatabaseFixture:ServicedComponent
????{
????????[TearDown]
????????public?void?TransactionTearDown()
????????{
????????????if(ContextUtil.IsInTransaction)
????????????{
????????????????ContextUtil.SetAbort();
????????????}
????????}
????}
}
下面再寫一個使用此基類的示例程序:
using?System;
using?NUnit.Framework;
using?System.Data;
using?System.Data.SqlClient;
namespace?TransactionTest
{
????public?class?CategoryTests:DatabaseFixture
????{
????????string?CONN?=?@"Server=192.168.0.58\sun;Database=Northwind;uid=帳號;pwd=密碼";
????????[Test]
????????public?void?InsertTest()
????????{
????????????string?categoryName?=?Insert("Test?category");
????????????VerifyRowExists(categoryName,?true);
????????}
????????[Test]
????????public?void?DeleteTest()
????????{
????????????string?categoryName?=?Insert("Test?category");
????????????Delete(categoryName);
????????????VerifyRowExists(categoryName,?false);
????????}
????????/**////?<summary>
????????///?新增一條記錄
????????///?</summary>
????????///?<param?name="categoryName"></param>
????????///?<returns></returns>
????????private?string?Insert(string?categoryName)
????????{
????????????using?(SqlConnection?conn?=?new?SqlConnection(CONN))
????????????{
????????????????string?strSQL?=?"Insert?Categories?(CategoryName)?values('"?+?categoryName?+?"')";
????????????????SqlCommand?cmd?=?new?SqlCommand(strSQL,?conn);
????????????????conn.Open();
????????????????cmd.ExecuteNonQuery();
????????????}
????????????return?categoryName;
????????}
????????/**////?<summary>
????????///?刪除一條記錄
????????///?</summary>
????????///?<param?name="categoryName"></param>
????????///?<returns></returns>
????????private?string?Delete(string?categoryName)
????????{
????????????using?(SqlConnection?conn?=?new?SqlConnection(CONN))
????????????{
????????????????string?strSQL?=?"Delete?from?Categories?Where?CategoryName='"?+?categoryName?+?"'";
????????????????SqlCommand?cmd?=?new?SqlCommand(strSQL,?conn);
????????????????conn.Open();
????????????????cmd.ExecuteNonQuery();
????????????}
????????????return?categoryName;
????????}
????????/**////?<summary>
????????///?對執行的數據庫操作進行驗證
????????///?</summary>
????????///?<param?name="categoryName"></param>
????????///?<param?name="shouldExist"></param>
????????private?void?VerifyRowExists(string?categoryName,bool?shouldExist)
????????{
????????????SqlConnection?conn?=?new?SqlConnection(CONN);
????????????conn.Open();
????????????string?strSQL?=?"Select?*?from?Categories?where?CategoryName='"?+?categoryName?+?"'";
????????????SqlCommand?cmd?=?new?SqlCommand(strSQL,?conn);
????????????SqlDataReader?dr?=?cmd.ExecuteReader(CommandBehavior.CloseConnection);
????????????Assert.AreEqual(shouldExist,dr.HasRows);
????????????dr.Close();
????????}
????}
}
原文:http://weblogs.asp.net/rosherove/articles/dbunittesting.aspx
那么我們要如何處理這些垃圾數據和保證測試的穩定的呢?顯然,我們需要在每次測試之前和測試完成之后讓數據庫都保持相同的狀態。換句話說,就是我們需要"undo"這些在測試中對數據庫執行的CRUD操作。
對于我們需要的這種"undo"操作,你以前是怎么做的呢?手動的移除還是使用ADO.NET的事物處理呢?這些方法都可行,但對我們來說還不夠好。因為它們都需要我們編寫更多的代碼,影響我們的開發效率。
現在,就要開始說本文的重點了,利用COM+的自動事務處理功能來幫助我們實現我們的"undo"。
首先,寫一個基類,此類能夠在每一個方法完成后自動回滾對數據庫的操作:
using?System;
using?NUnit.Framework;
using?System.EnterpriseServices;
namespace?TransactionTest
{
????[TestFixture]
????[Transaction(TransactionOption.Required)]
????public?class?DatabaseFixture:ServicedComponent
????{
????????[TearDown]
????????public?void?TransactionTearDown()
????????{
????????????if(ContextUtil.IsInTransaction)
????????????{
????????????????ContextUtil.SetAbort();
????????????}
????????}
????}
}
下面再寫一個使用此基類的示例程序:
using?System;
using?NUnit.Framework;
using?System.Data;
using?System.Data.SqlClient;
namespace?TransactionTest
{
????public?class?CategoryTests:DatabaseFixture
????{
????????string?CONN?=?@"Server=192.168.0.58\sun;Database=Northwind;uid=帳號;pwd=密碼";
????????[Test]
????????public?void?InsertTest()
????????{
????????????string?categoryName?=?Insert("Test?category");
????????????VerifyRowExists(categoryName,?true);
????????}
????????[Test]
????????public?void?DeleteTest()
????????{
????????????string?categoryName?=?Insert("Test?category");
????????????Delete(categoryName);
????????????VerifyRowExists(categoryName,?false);
????????}
????????/**////?<summary>
????????///?新增一條記錄
????????///?</summary>
????????///?<param?name="categoryName"></param>
????????///?<returns></returns>
????????private?string?Insert(string?categoryName)
????????{
????????????using?(SqlConnection?conn?=?new?SqlConnection(CONN))
????????????{
????????????????string?strSQL?=?"Insert?Categories?(CategoryName)?values('"?+?categoryName?+?"')";
????????????????SqlCommand?cmd?=?new?SqlCommand(strSQL,?conn);
????????????????conn.Open();
????????????????cmd.ExecuteNonQuery();
????????????}
????????????return?categoryName;
????????}
????????/**////?<summary>
????????///?刪除一條記錄
????????///?</summary>
????????///?<param?name="categoryName"></param>
????????///?<returns></returns>
????????private?string?Delete(string?categoryName)
????????{
????????????using?(SqlConnection?conn?=?new?SqlConnection(CONN))
????????????{
????????????????string?strSQL?=?"Delete?from?Categories?Where?CategoryName='"?+?categoryName?+?"'";
????????????????SqlCommand?cmd?=?new?SqlCommand(strSQL,?conn);
????????????????conn.Open();
????????????????cmd.ExecuteNonQuery();
????????????}
????????????return?categoryName;
????????}
????????/**////?<summary>
????????///?對執行的數據庫操作進行驗證
????????///?</summary>
????????///?<param?name="categoryName"></param>
????????///?<param?name="shouldExist"></param>
????????private?void?VerifyRowExists(string?categoryName,bool?shouldExist)
????????{
????????????SqlConnection?conn?=?new?SqlConnection(CONN);
????????????conn.Open();
????????????string?strSQL?=?"Select?*?from?Categories?where?CategoryName='"?+?categoryName?+?"'";
????????????SqlCommand?cmd?=?new?SqlCommand(strSQL,?conn);
????????????SqlDataReader?dr?=?cmd.ExecuteReader(CommandBehavior.CloseConnection);
????????????Assert.AreEqual(shouldExist,dr.HasRows);
????????????dr.Close();
????????}
????}
}
如果編譯上面的程序,還需要給程序加一個強名稱,否則是無法通過的
?
在命令行使用 sn -k test.snk
然后把 test.snk 拷貝到程序目錄中,再設置
[assembly: AssemblyKeyFile(@"..\..\..\test.snk")]
原文:http://weblogs.asp.net/rosherove/articles/dbunittesting.aspx
轉載于:https://www.cnblogs.com/netflu/archive/2005/07/29/202805.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的利用COM+对数据库操作进行单元测试的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 很久没写东西了,留个言。
- 下一篇: SEO:影响网站排名的一些问题