文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>visual studio 2010 单元测试{整合NDbUnit}

visual studio 2010 单元测试{整合NDbUnit}

时间:2010-08-28  来源:.net's

开场白

表结构的准备

Table: Customer
CustomerId: int, auto-increment PK
Firstname: varchar50, nullable
Lastname: varchar50, nullable
CREATE TABLE [dbo].[Customer]( 
        [CustomerId] [int] IDENTITY(1,1) NOT NULL, 
        [Firstname] [varchar](50) NULL, 
        [Lastname] [varchar](50) NULL, 
 CONSTRAINT [PK_Customer] PRIMARY KEY CLUSTERED  
( 
        [CustomerId] ASC 
)WITH (PAD_INDEX  = OFF, 
  STATISTICS_NORECOMPUTE  = OFF, 
  IGNORE_DUP_KEY = OFF, 
  ALLOW_ROW_LOCKS  = ON, 
  ALLOW_PAGE_LOCKS  = ON) 
    ON [PRIMARY] 
) ON [PRIMARY] 
 
GO

创建强类型数据集

  • 添加Database.xsd数据集

在单元测试的项目中右击添加项目,添加一个Database.xsd

  • 在visual studio的Server Explorer中打开测试数据库
  • 将表Customer拖到DataSet设计窗口中,并删除其中的DataAdapter适配器(因不需要)

  • 保存Database.xsd

添加单元测试所需文件

创建一个单元测试项目, 双击解决方案下的单元测试配置文件Local.testsettings,

在部署项目中添加需要的文件,这样当运行单元测试的时候,将会所添加的文件拷贝到当前解决方案下的文件夹TestResults的子目录Out中,

即单元测试运行的应用程序域目录。

创建测试数据的XML文件

<?xml version="1.0" standalone="yes"?>
<Database xmlns="http://tempuri.org/Database.xsd">
  <Customer>
    <CustomerId>5</CustomerId>
    <Firstname>joe</Firstname>
    <Lastname>yang</Lastname>
  </Customer>
  <Customer>
    <CustomerId>6</CustomerId>
    <Firstname>steve</Firstname>
    <Lastname>gu</Lastname>
  </Customer>
  <Customer>
    <CustomerId>7</CustomerId>
    <Firstname>steve</Firstname>
    <Lastname>gu</Lastname>
  </Customer>
</Database>

我们使用NDbUnit自带的函数来生成该文件,调用如下接口:

_connectionString = GetConnectionString();
NDbUnit.Core.INDbUnitTest _mySqlDatabase = new NDbUnit.Core.SqlClient.SqlDbUnitTest(_connectionString);
 _mySqlDatabase.ReadXmlSchema(@"Database.xsd");
//为了方便,直接从数据库中抓取数据来测试
System.Data.DataSet ds = _mySqlDatabase.GetDataSetFromDb();
ds.WriteXml("TestData.xml");

在测试类初始化的时候,我们将调用以上方法。

创建单元测试类

  • 通知NDbunit我们所使用的schema以及数据文件
[TestMethod]
        public void TestMethod1()
        {
            string connectionString = "server=localhost;user=dbuser;password=dbpassword;initial catalog=MyDatabase;";
            NDbUnit.Core.INDbUnitTest mySqlDatabase = new NDbUnit.Core.SqlClient.SqlDbUnitTest(connectionString);

            mySqlDatabase.ReadXmlSchema(@"Database.xsd");
            mySqlDatabase.ReadXml(@"Testdata.xml"); 

        }
  • 运行依赖于数据库的测试
[TestMethod]
        public void TestMethod1()
        {
            string connectionString = "server=localhost;user=dbuser;password=dbpassword;initial catalog=MyDatabase;";
            NDbUnit.Core.INDbUnitTest mySqlDatabase = new NDbUnit.Core.SqlClient.SqlDbUnitTest(connectionString);

            mySqlDatabase.ReadXmlSchema(@"Database.xsd");
            mySqlDatabase.ReadXml(@"Testdata.xml");

            mySqlDatabase.PerformDbOperation(NDbUnit.Core.DbOperationFlag.CleanInsertIdentity);

            CustomerRepository repository = new CustomerRepository();

            Assert.AreEqual(2, repository.GetAllCustomers().Count); 

        }
  • 清楚数据库测试痕迹
// Use TestCleanup to run code after each test has run
        [TestCleanup()]
        public void MyTestCleanup() {
            _mySqlDatabase.PerformDbOperation(NDbUnit.Core.DbOperationFlag.CleanInsertIdentity); 

        }

完整测试类代码如下:

namespace DataAccessLayer.Test
{


    /// <summary>
    ///This is a test class for NhibernateDataProviderTest and is intended
    ///to contain all NhibernateDataProviderTest Unit Tests
    ///</summary>
    [TestClass()]
    public class NhibernateDataProviderTest
    {
        private static string _connectionString;

        private static NDbUnit.Core.INDbUnitTest _mySqlDatabase; 


        private TestContext testContextInstance;


        /// <summary>
        ///Gets or sets the test context which provides
        ///information about and functionality for the current test run.
        ///</summary>
        public TestContext TestContext
        {
            get
            {
                return testContextInstance;
            }
            set
            {
                testContextInstance = value;
            }
        }

        public static string GetConnectionString()
        {
            string conn = System.Configuration.ConfigurationManager.ConnectionStrings["DataAccessLayer.Test.Properties.Settings.DineDiscussExampleConnectionString"].ConnectionString;
            return conn;
        }

        #region Additional test attributes
        // 
        //You can use the following additional attributes as you write your tests:
        //
        //Use ClassInitialize to run code before running the first test in the class
        [ClassInitialize()]
        public static void MyClassInitialize(TestContext testContext)
        {
            //when the fixture is setup, we configure our NDbUnit class instance and save it in the fixture 
            _connectionString = GetConnectionString();
            _mySqlDatabase = new NDbUnit.Core.SqlClient.SqlDbUnitTest(_connectionString);


            _mySqlDatabase.ReadXmlSchema(@"Database.xsd");

            System.Data.DataSet ds = _mySqlDatabase.GetDataSetFromDb();
            ds.WriteXml("TestData.xml");


            _mySqlDatabase.ReadXmlSchema(@"Database.xsd");
            _mySqlDatabase.ReadXml(@"Testdata.xml"); 

        }
        //
        //Use TestCleanup to run code after each test has run
        [TestCleanup()]
        public void MyTestCleanup()
        {
            _mySqlDatabase.PerformDbOperation(NDbUnit.Core.DbOperationFlag.CleanInsertIdentity); 
        }
        //
        #endregion

        [TestMethod()]
        public void TestMethod1()
        {
            //invoke the test; with the setup moved out of here, the test is simpler and cleaner! 

            CustomerRepository repository = new CustomerRepository();

            Assert.AreEqual(2, repository.GetAllCustomers().Count);


        }
           
    }
}

题外话

如果使用Nunit或MbUnit, 则可以整合Proteus,或Microdesk.Utility.UnitTest使用。

 

参考:NDbUnit Quick-start examples and walk-through

相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载