首页 > 代码库 > 大家一起来学 NHibernate+NUnit (VS2012+SQL Server2008)
大家一起来学 NHibernate+NUnit (VS2012+SQL Server2008)
大家一起来学 NHibernate+NUnit (VS2012+SQL Server2008)
分类: C#2013-08-10 18:47 1589人阅读 评论(5) 收藏 举报
NHibernateNUnitVisual Studio 2012
如果你没听过Nhibernate or NUnit,那么,恭喜你,和我一样,握个手吧。如果你已经是个老酱油了,那就道不同不带你玩了,请自觉绕行,,,。谨以此文献给像我这样广大的小白同胞们(鼓掌)!
话说2013年某月某日,听一武林前辈提起 NHibernate ,小白我顿时大脑空白,这是个啥么东东啊,在强烈好奇心的驱使下,我决定先去吃晚饭,回来后便将此事忘掉了,。。。在此我只想说一句:我不是故意的!前几日,又偶闻坊间传言,话说欧特曼打小怪兽时,所使用的招式中就有NHibernate ANDNUnit,这下小白我可长记性了,为啥妮?因为像我这样广大小白的终极愿望就是穷极毕生之所学,打倒人世间一切妖魔鬼怪啊。话不多说,立马招来谷歌度娘拷打一番,根据“坦白从宽、抗拒从严”的原则,这俩小子把NHibernate和Nunit的勾当一五一十的全都招了出来,我心甚慰啊……原来NHibernate起源于java学派久负盛名的三大框架SSH之一:Hibernate。好吧,如果你和我一样,对java学派嗤之以鼻的话,那我就再废话一些:首先,你要明白,NHibernate在.NET中的作用和Hibernate在JAVA中的作用一样;第二,他们都是开源的东东;第三,他们都是一种对象关系数据库映射框架。第三点要好好理解哦,“对象”,.NET和java都是面向对象的,通俗点就是里面都是各种class类;“关系数据库”,MS SQL,ORACLE,etc,就是指的它们了;“映射“,就是在指hibernate在关系数据库和我们面向对象class之间搭起了一座桥梁。因此,有了这个,我们就可以轻松的使用面向对象的思维来编写数据层了,至于数据层如何与数据库打交道,就交给hibernate去处理了。那么NUnit 呢?这个简单,说白了,就一个测试工具,我们在里面写好测试代码,程序自动帮我们做测试,吼吼。说了那么多,其实,我也搞不明白,你们到底懂没懂……,至此,如果广大同胞们脑海中还是没有一丝波澜的话,那就请各位自己去拷打一番谷歌度娘吧。
由于NHibernate和NUnit 的东西实在太多,而小白我功力有限,所以,给大家推荐两个很好的博客,里面写的都很详细了:
1,NHibernate之旅系列文章导航 http://www.cnblogs.com/lyj/archive/2008/10/30/1323099.html
2,NHibernate从入门到精通系列http://www.cnblogs.com/GoodHelper/archive/2011/02/14/nhiberante_01.html
这两个博客里有些内容重叠了,但我还是建议大家都从头到尾好好读一下,毕竟我们是小白嘛,
不过两个博客千好万好,只有一点不好,就是年代久远,里面的示例很多地方语法都改变了,这下可把我这小伙伴给惊呆了,。还好小白我心里素质好,经过一番冥思苦想,总算一切搞定,下周二就七夕了,我也没啥好送的,就带大家一起来做一个NHibernate+NUnit的Demo吧,
开发环境:VS 2012 ,SQL Server 2008,NHibernate 3.3.3 ,NUnit 2.6.2
NHibernate 下载地址:NHibernate Forge
NUnit 下载地址:NUnit
当然了,稍后我会把Demo+NHibernate3.3.3+NUnit 2.6.2 一起打包,大家可以直接去下载。
Demo 下载地址:Demo
下面就正式开始了:
1,打开VS2012,新建项目,选择类库,起名为:Domain。确定
2,把自带的Class1.cs删掉,新建一个Student类。代码如下:
[csharp] view plaincopyprint?
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- namespace Domain
- {
- /// <summary>
- /// 学生类
- /// </summary>
- public class Student
- {
- /// <summary>
- /// ID
- /// </summary>
- public virtual int ID { get; set; }
- /// <summary>
- /// 学生姓名
- /// </summary>
- public virtual string Name { get; set; }
- /// <summary>
- /// 学生性别
- /// </summary>
- public virtual string Sex { get; set; }
- /// <summary>
- /// 学生年龄
- /// </summary>
- public virtual int Age { get; set; }
- }
- }
3,添加一个XML文件,取名为:Student.hbm.xml,如图:
此时,目录结构是这样的:
4,编写Student.hbm.xml 映射文件,代码如下:
[html] view plaincopyprint?
- <?xml version="1.0" encoding="utf-8" ?>
- <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Domain" namespace="Domain">
- <class name="Student" table="T_Student" lazy="true">
- <id name="ID" column="ID" unsaved-value="http://www.mamicode.com/0">
- <generator class="native"></generator>
- </id>
- <property name="Name" type="string" column="StuName" length="20" not-null="true"></property>
- <property name="Sex" type="string" column="StuSex" length="2"></property>
- <property name="Age" type="Int32" column="StuAge"></property>
- </class>
- </hibernate-mapping>
XML 映射文件的编写是NHibernate中关键的一步,如果你没有预读那两篇博客的话,估计这里就看不懂了。注意:编写XML文件之前,记得把下载的NHibernate中的nhibernate-mapping.xsd文件和nhibernate-configuration.xsd文件放到C:\Program Files (x86)\Microsoft Visual Studio 11.0\Xml\Schemas目录下(我的是win7 64, 因机器不一,如果不知道放哪的话,就百度下吧),这样,编写xml文件时,VS就会有智能提示了。
5,在Student.hbm.xml 文件上右击,选择”属性“,将xml文件的生成操作属性由”内容“改为”嵌入的资源“。如下图:
6,在项目解决方案上右击,选择添加新建项目,添加一个新的类库,取名为:NHibernateTest。(其实,这就是我们利用UNit 进行单元测试的地方)如图:
将新建类库中默认的Class1.cs删掉,此时,目录结构是这样的:
7,在NHibernateTest 项目中,添加对我们刚才新建的Domain类库的引用,以及添加我们下载的NHibernate和NUnit 程序集的引用。如图:
引用添加完毕后,就是下面这个样子的,
10,把下载的NHibernate 中Configuration_Templates文件夹下的MSSQL.cfg.xml文件复制粘贴到NHibernateTest 类库中,并重命名为:hibernate.cfg.xml 并修改文件如下:
[html] view plaincopyprint?
- <?xml version="1.0" encoding="utf-8"?>
- <!--
- This template was written to work with NHibernate.Test.
- Copy the template to your NHibernate.Test project folder and rename it in hibernate.cfg.xml and change it
- for your own use before compile tests in VisualStudio.
- -->
- <!-- This is the System.Data.dll provider for SQL Server -->
- <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2" >
- <session-factory name="NHibernate.Test">
- <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
- <property name="connection.connection_string">
- Server=(local);initial catalog=nhibernate;Integrated Security=SSPI
- </property>
- <property name="dialect">NHibernate.Dialect.MsSql2008Dialect</property>
- <!--添加下面这行代码,除此之外,其它都不用改动,当然,你也可以修改上面的数据库链接字符串-->
- <mapping assembly="Domain"/>
- </session-factory>
- </hibernate-configuration>
然后,在hibernate.cfg.xml文件上右击,选择属性,将xml文件的复制到输入目录属性修改为:始终复制
11,添加NHibernateTest.cs类,代码如下:
[csharp] view plaincopyprint?
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using NHibernate;
- using NHibernate.Tool.hbm2ddl;
- using NUnit.Framework;
- namespace NHibernateTest
- {
- [TestFixture]
- public class NHibernateInit
- {
- [Test]
- public void InitTest()
- {
- var cfg = new NHibernate.Cfg.Configuration().Configure(System.AppDomain.CurrentDomain.BaseDirectory + "\\hibernate.cfg.xml");
- new SchemaExport(cfg).Execute(true, true, false);
- using (ISessionFactory sessionFactory = cfg.BuildSessionFactory()) { }
- }
- }
- }
12,打开SQL Server 08,新建一个nhibernate 数据库
[sql] view plaincopyprint?
- create database nhibernate
13,在 NHibernateTest 类库上右键,选择属性,切换到”调试“选项卡,单击”启动外部调试“,浏览,选择Nunit.exe 程序。(注意:前提是你已经安装了文章开头时让你下载的Nunit 2.6.2.msi程序),效果如下图所示:
14,点击一下”全部保存“,然后在整个的项目解决方案上右键,选择”生成解决方案“。然后,将NHibernateTest 类库右键,设为启动项目。F5,运行程序
此时,我们看到NUnit.exe已经启动了,在NUnit窗口中,选择:"File"->”new project“,文件名为:NHibernateTest.nunit,点击保存。此时,窗口依然什么都没有。再选择:"Project"->"Add assembly",在弹出的对话框中,找到我们的NHibernateTest类库生成的dll文件,点击打开,如下图:
15,单击NUnit窗口中的Run按钮,此时,NUnit 会自动执行我们的NHibernateTest 类库中的方法。这时,窗口应该是下面这样的:
16,此时,打开数据库,会发现,我们的T_Student数据表已经被自动创建好了。
小伙伴们,你们有没有被惊呆呢?是不是很神奇的东东?哈哈……我发现写文章真是个体力活,受不了了……
唉,没办法,本着对广大的小伙伴尽职尽责的高度使命感,小白我决定继续码字……(鼓掌)
这样测试的话,每次我们都还要启动外部程序NUnit,相信有的小伙伴不乐意了,放心好了,我们可以通过安装插件的方式,解决这个问题(注意:此过程需联网)。
在 VS2012 中,选择:”工具“=》”扩展和更新“,在弹出的对话框中,单击”联机“标签,之后再在搜索框中输入:”NUnit“ ,回车,效果如下图所示:
选择”下载“,下载完毕后,会提示你安装,你直接选择安装就可以了。安装完毕后,重启一下VS。重启之后,选择菜单栏中的:”测试“-》”窗口“-》”测试资源管理器“。然后再重新生成一下整个项目解决方案,这时候,我们在”测试资源管理器“中就可以看到我们的NHibernateTest 测试类了。在这里,我们可以选择全部运行,也可以在单独的方法上右键,选择运行或调试。
下面,我又新写了几个测试方法,分别测试往T_Student表中存入数据,取出数据。NHibernateInit.cs 文件代码如下:
[csharp] view plaincopyprint?
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using NHibernate;
- using NHibernate.Tool.hbm2ddl;
- using NUnit.Framework;
- namespace NHibernateTest
- {
- [TestFixture]//定义一个测试类,里面可以包含很多测试函数和初始化、销毁函数。
- public class NHibernateInit
- {
- [Test]//定义一个独立的测试函数。
- public void InitTest()
- {
- var cfg = new NHibernate.Cfg.Configuration().Configure(System.AppDomain.CurrentDomain.BaseDirectory + "\\hibernate.cfg.xml");
- new SchemaExport(cfg).Execute(true, true, false);
- using (ISessionFactory sessionFactory = cfg.BuildSessionFactory()) { }
- }
- private ISessionFactory _sessionFactory;
- [SetUp]//定义测试函数初始化函数,每个测试函数运行前都会被调用一次。
- public void InitSessionFactory()
- {
- var cfg = new NHibernate.Cfg.Configuration().Configure(System.AppDomain.CurrentDomain.BaseDirectory + "\\hibernate.cfg.xml");
- _sessionFactory = cfg.BuildSessionFactory();
- }
- [Test]
- public void SaveTest()
- {
- var stu = new Domain.Student()
- {
- Name = "张三",
- Sex = "M",
- Age = 20
- };
- using (ISession session = _sessionFactory.OpenSession())
- {
- try
- {
- object obj = session.Save(stu);
- session.Flush();
- Assert.NotNull(obj);
- }
- catch (Exception ex)
- {
- throw ex;
- }
- }
- }
- [Test]
- public void SelectTest()
- {
- using (ISession session = _sessionFactory.OpenSession())
- {
- Domain.Student stu = session.Get<Domain.Student>(1);
- Assert.NotNull(stu);
- Console.WriteLine(stu.Name);
- }
- }
- }
- }
测试结果如下图所示:
OK了,到此为止,算是把NHibernate+NUnit 的demo完整演示一遍了,不知道各位小伙伴们看懂了没?末尾了,免不得再唠叨一句:珍爱生命,远离IT。。。。
注:关于使用NUnit 测试和 MS 测试框架之间的区别,大家可以去看我转载的一篇文章:Nunit Test 和 MS Test 的区别
大家一起来学 NHibernate+NUnit (VS2012+SQL Server2008)