Nunit中如何进行事务性单元测试
单元测试要求:单元测试方法并不真正去变更数据库,也就是说单元测试不依赖于数据库中的数据。那我们如何解决执行单元测试方法后,不变更数据库中数据呢?
一般的解决方案有两种:
1、 新建一个单元测试数据库,开发数据库与单元测试数据库分离,单元测试方法完全基于单元测试数据库。
此中方法的优点是:,开发人员在开发期间不会对单元测试数据库中数据进行变更,也就不会影响单元测试方法 在任何时间执行。
缺点:单元测试数据库和开发数据库同步问题,特别是对迭代式开发项目,数据库是根据需求在不断地跟进或者变更,同步问题成为了单元测试正常运行的瓶颈。
2、 使用事务对单元测试方法的执行进行回滚。
此种方法的优点:解决了方法一中缺点,不会出现数据库结构不同步的问题。
缺点:在进行CRUD(Create/Read/Update/Delete)操作时,需要在单元测试方法中进行一些插入数据操作,从而保证单元测试与开发数据库的独立,造成了单元测试工作量增加。
在实际的项目中,可以根据需要选择符合自己的解决方案,如果数据库结构在项目进入开发阶段已经确定,并且以后不会有变动,建议采用第一种方案,否则建议第二种方案。目前我们项目采用第二中方案。
一、NUnit事务性单元测试
那使用Nunit框架如果保证数据的会滚呢?这里我们使用了COM+事务。
即System.EnterpriseServices;
具体如下:
/// <summary>
///单元测试基类,所有单元测试类都需要继承此类
/// </summary>
[TestFixture]
[Transaction(TransactionOption.Required)]
public class DatabaseFixture:ServicedComponent
{
public DatabaseFixture()
{
//
// TODO: Add constructor logic here
//
}
[TearDown]
public void TransactionTearDown()
{
if (ContextUtil.IsInTransaction)
{
ContextUtil.SetAbort();
}
}
所有的单元测试方法都需要继承与此类。比如:
public class AddressSqlDAOTest : DatabaseFixture
这样,单元测试方法执行完后,会继续执行DatabaseFixture类中的TransactionTearDown()方法。从而会滚之前的数据操作,单元测试方法也就不会影响开发数据库,同样开发数据库也不会影响单元测试方法的执行,从而保证了单元测试与数据库数据的独立。
二、如何CRUD单元测试
1、测试增加方法:判断返回的主键是否>0,如果主键>0 说明单元测试方法成功,否则失败
2、测试查询方法:首先在执行单元测试类中的插入数据方法(不是被测试类中的插入方法,而是在单元测试类中写的插入方法,一定要区分开),然后执行查询方法。
3、测试更新方法:首先在执行单元测试类中的插入数据方法,然后执行更新方法。
4、测试删除方法:首先在执行单元测试类中的插入数据方法,然后执行删除方法。
三、单元测试的命名规范
为了便于后期单元测试方法的维护,建议如下命名单元测试类 和单元测试方法。
单元测试类名:被测试类名称+Test
单元测试方法名:被测试方法名称+Test
四、总结
至此,大家就可以利用Nunit中如何进行事务性单元测试已经完毕,相信大家也已经了解了如何让单元测试独立于数据库数据,从而更高效地进行单元测试,也不影响开发。
出处:http://www.cnblogs.com/ywqu/archive/2009/11/07/1598163.html
Nunit中如何进行事务性单元测试的更多相关文章
- Nunit工具做C#的单元测试
Nunit工具做C#的单元测试 学习心得 编写人:罗旭成 时间:2013年9月2日星期一 1.开发人员如何做单元测试 单元测试是针对最小的可测试软件元素(单元)的,它所测试的内容包括单元的内部结构 ...
- 在Eclipse中使用JUnit4进行单元测试
在Eclipse中使用JUnit4进行单元测试(初级篇) 在Eclipse中使用JUnit4进行单元测试(中级篇) 在Eclipse中使用JUnit4进行单元测试(高级篇)
- Nunit中文文档
NUnit中文文档:http://www.36sign.com/nunit 关于特性的使用:http://www.36sign.com/nunit/attributes.html
- 【Java】在Eclipse中使用JUnit4进行单元测试(初级篇)
本文绝大部分内容引自这篇文章: http://www.devx.com/Java/Article/31983/0/page/1 我们在编写大型程序的时候,需要写成千上万个方法或函数,这些函数的功能可能 ...
- 在Eclipse中使用JUnit4进行单元测试(图文教程一)
在Eclipse中使用JUnit4进行单元测试 单元测试,JUnit4. 这两个有什么关系呢?这就好比(草)单元测试和(割草机).用这个JUnit4工具去辅助我们进行测试.其实不理解这个也没关系,听多 ...
- 在VS Code中对Python进行单元测试
在VS Code中对Python进行单元测试 Python扩展支持使用Python的内置unittest框架以及pytest和Nose进行单元测试.要使用pytest和Nose,必须将它们安装到当前的 ...
- ASP.NET Core中使用xUnit进行单元测试
单元测试的功能自从MVC的第一个版本诞生的时候,就是作为一个重要的卖点来介绍的,通常在拿MVC与webform比较的时候,单元测试就是必杀底牌,把webform碾压得一无是处. 单元测试的重要性不用多 ...
- 记录Spring Boot大坑一个,在bean中如果有@Test单元测试,不会注入成功
记录Spring Boot大坑一个,在bean中如果有@Test单元测试,不会注入成功 记录Spring Boot大坑一个,在bean中如果有@Test单元测试,不会注入成功 记录Spring Boo ...
- Django 中的 csrf_token 与单元测试
Django 中的 csrf_token 与单元测试 在<Python Web开发:测试驱动方法>一书中作者使用的 Django 版本是 1.7,而我使用的是1.9.7版(官网已经更新到1 ...
随机推荐
- 小米2S刷Android4.4且双系统共存
视频教程 http://v.youku.com/v_show/id_XNjQxNzQ5NDAw.html 必备知识 进入Recovery模式:同时按住电源键+音量上键,等到屏幕亮起时,放开电源键. 特 ...
- 微信小程序------小程序初步学习
1:学习微信小程序,首先的会一点前端的基础会比较容易上手,比如:HTML+CSS,JS,HTML5+CSS3: H5+CSS3中的弹性盒子在微信小程序中经常用到,这是必须掌握的.不会的可以去W3C文档 ...
- python报错:TypeError: 'int' object is not subscriptable
检查一遍报错的所在行,此报错一般是在整数上加了下标: 比如: a = 4 c=a[2] 报错:line 2, in <module> c=a[2] TypeError: 'i ...
- 【Error】 : make 不是内部或外部命令,也不是可运行的程序
之前有段源码需要编译,一开始选择在Windows上编译,由于没有安装VS,只能采取Make + Gcc 的方式,虽然后来还是在ubuntu上编译的,但是遇到的问题还是要记录下来. 虽然我也把make的 ...
- 基于Python的XSS测试工具XSStrike使用方法
基于Python的XSS测试工具XSStrike使用方法 简介 XSStrike 是一款用于探测并利用XSS漏洞的脚本 XSStrike目前所提供的产品特性: 对参数进行模糊测试之后构建合适的payl ...
- dump相关
命令:jmap -dump:format=b,file=/tmp/dump.hprof pid jstack -l 30087 >> text.txt
- 016PHP基础知识——流程控制(四)
<?php /** * 流程控制(四) do...while * do{ 代码段 * }while(){ * } * 特点:最少会执行一次代码段 */ /*$i=5; do{ echo $i; ...
- js获取显示器、页面等高度 (转)
网页可见区域宽:document.body.clientWidth网页可见区域高:document.body.clientHeight网页可见区域宽:document.body.offsetWidth ...
- Java进阶5 面向对象的陷阱
Java进阶5 面向对象的陷阱 20131103 Java是一门纯粹面向对象的编程语言,Java面向对象是基础,而且面向对象的基本语法非常多,非常的细,需要程序员经过长时间的学习才可以掌握.本章重点介 ...
- Visual Studio 2017再现C语言经典例题(一)
1.编写一个程序,输入a.b.c这3个值,输出其中最大者. 2.将“China”译成密码.密码规律:用原来的字母后面第4个字母代替原来的字母.例如,字母A后面第4个字母是E,用E代替A,因此,Chin ...