利用COM+对数据库操作进行单元测试
生活随笔
收集整理的這篇文章主要介紹了
利用COM+对数据库操作进行单元测试
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
當(dāng)單元測(cè)試需要對(duì)數(shù)據(jù)庫(kù)執(zhí)行CRUD(Create,Retrieve,Update,Delete)操作時(shí),測(cè)試過后會(huì)在我們的數(shù)據(jù)庫(kù)中留下大量重復(fù)的垃圾數(shù)據(jù),這些垃圾很礙眼不是嗎?而且我們的下一個(gè)測(cè)試有可能因?yàn)檫@些垃圾產(chǎn)生一些錯(cuò)誤。
那么我們要如何處理這些垃圾數(shù)據(jù)和保證測(cè)試的穩(wěn)定的呢?顯然,我們需要在每次測(cè)試之前和測(cè)試完成之后讓數(shù)據(jù)庫(kù)都保持相同的狀態(tài)。換句話說,就是我們需要"undo"這些在測(cè)試中對(duì)數(shù)據(jù)庫(kù)執(zhí)行的CRUD操作。
對(duì)于我們需要的這種"undo"操作,你以前是怎么做的呢?手動(dòng)的移除還是使用ADO.NET的事物處理呢?這些方法都可行,但對(duì)我們來說還不夠好。因?yàn)樗鼈兌夹枰覀兙帉懜嗟拇a,影響我們的開發(fā)效率。
現(xiàn)在,就要開始說本文的重點(diǎn)了,利用COM+的自動(dòng)事務(wù)處理功能來幫助我們實(shí)現(xiàn)我們的"undo"。
首先,寫一個(gè)基類,此類能夠在每一個(gè)方法完成后自動(dòng)回滾對(duì)數(shù)據(jù)庫(kù)的操作:
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();
????????????}
????????}
????}
}
下面再寫一個(gè)使用此基類的示例程序:
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=帳號(hào);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>
????????///?對(duì)執(zhí)行的數(shù)據(jù)庫(kù)操作進(jìn)行驗(yàn)證
????????///?</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
那么我們要如何處理這些垃圾數(shù)據(jù)和保證測(cè)試的穩(wěn)定的呢?顯然,我們需要在每次測(cè)試之前和測(cè)試完成之后讓數(shù)據(jù)庫(kù)都保持相同的狀態(tài)。換句話說,就是我們需要"undo"這些在測(cè)試中對(duì)數(shù)據(jù)庫(kù)執(zhí)行的CRUD操作。
對(duì)于我們需要的這種"undo"操作,你以前是怎么做的呢?手動(dòng)的移除還是使用ADO.NET的事物處理呢?這些方法都可行,但對(duì)我們來說還不夠好。因?yàn)樗鼈兌夹枰覀兙帉懜嗟拇a,影響我們的開發(fā)效率。
現(xiàn)在,就要開始說本文的重點(diǎn)了,利用COM+的自動(dòng)事務(wù)處理功能來幫助我們實(shí)現(xiàn)我們的"undo"。
首先,寫一個(gè)基類,此類能夠在每一個(gè)方法完成后自動(dòng)回滾對(duì)數(shù)據(jù)庫(kù)的操作:
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();
????????????}
????????}
????}
}
下面再寫一個(gè)使用此基類的示例程序:
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=帳號(hào);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>
????????///?對(duì)執(zhí)行的數(shù)據(jù)庫(kù)操作進(jìn)行驗(yàn)證
????????///?</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();
????????}
????}
}
如果編譯上面的程序,還需要給程序加一個(gè)強(qiáng)名稱,否則是無(wú)法通過的
?
在命令行使用 sn -k test.snk
然后把 test.snk 拷貝到程序目錄中,再設(shè)置
[assembly: AssemblyKeyFile(@"..\..\..\test.snk")]
原文:http://weblogs.asp.net/rosherove/articles/dbunittesting.aspx
轉(zhuǎn)載于:https://www.cnblogs.com/netflu/archive/2005/07/29/202805.html
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的利用COM+对数据库操作进行单元测试的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 很久没写东西了,留个言。
- 下一篇: SEO:影响网站排名的一些问题