单元测试和集成测试业务应用程序

发表于:2016-06-01来源:不详作者:Omar Al Zabir点击数: 标签:单元测试
本文主要通过小例子介绍下单元测试,集成测试,测试驱动开发等概念。

  本文主要通过小例子介绍下单元测试,集成测试,测试驱动开发等概念。

  切入正文:

  单元测试是通过写代码来测试代码的一个小单位测试方式。在一个单元测试中,一次只能测试一个类。例如,如果你正在测试一个使用类File,而另一个测试类DummyFile是用来消除对物理文件系统的需要,单元测试的测试类逻辑应该被测试。为了使class实现从真实到虚/存根之间切换,接口代替真正的类使用。所以,你的类应使用IFile或IDatabase而不是直接使用File和Database。

  集成测试,也叫组装测试或联合测试。在单元测试的基础上,将所有模块按照设计要求(如根据结构图)组装成为子系统或系统,进行集成测试。例如:正在测试CunsomerData,它依赖于LINQ to SQL数据库连接,在集成测试中,确保能正常调动所有相关类的方法。

  测试驱动开发(TDD)是单元测试的极端形式。总的原则是先写单元测试,然后编写实际的代码。例如,先写单元测试,测试CustomerData与在没有真正的代码类CustomerData。该CustomerData类可能包含类似功能InsertCustomer ,DeleteCustomer , GetCustomer等,它们做的不外乎返回一些虚拟Customer对象,以满足单元测试。 一旦单元测试都与虚拟数据相连,然后你开始写的CustomerData实际代码,它就会访问数据库做真正的处理。编写真正的代码后,单元测试并没有改变测试代码。TDD要求类被设计在没有直接依赖于其他类中。所有的依赖关系通过接口。例如,CustomerData不直接使用SqlConnection,而是使用ISqlConnection ,所有的依赖提供给CustomerData构造。

  使用行为驱动开发测试

  测试的单一方法用于单个期望是麻烦的。你必须写更多的测试方法来测试每个方法的整体行为。此外,在每个测试方法中,你必须在适当环境下建立测试类,只是为了验证一个特定的期望方式。

  例如:给定一个空Stack 当一个项目被压入堆栈和Pop被称为对象然后压入堆栈中的最后一项被返回时,该项目从堆栈中移除,以及任何额外调用Pop都抛出异常。这里定义完整行为的Pop方法。测试这种行为方法的所有预期和相关行为Pop 。

  使用BDD单元测试

  在第一个例子中,我们将进行单元测试数据访问层。使用LINQ到SQL对象持久化数据访问层交易缓存在实体层面。例如,当你要加载一个用户,它首先检查高速缓存,看看用户是否已经缓存,如果没有,它从数据库中加载用户,然后缓存它。我们来看看PageRepository ,其中所涉及Page实体持久性。共同创建,读取,更新和销毁(CRUD)方法。举一个例子方法GetPageById ,需要一个PageId并加载该Page从数据库中。

  public class PageRepository : IPageRepository

  {

  #region Fields

  private readonly IDropthingsDataContext _database;

  private readonly ICache _cacheResolver;

  #endregion Fields

  #region Constructors

  public PageRepository(IDropthingsDataContext database, ICache cacheResolver)

  {

  this._database = database;

  this._cacheResolver = cacheResolver;

  }

  #endregion Constructors

  #region Methods

  public Page GetPageById(int pageId)

  {

  string cacheKey = CacheSetup.CacheKeys.PageId(pageId);

  object cachedPage = _cacheResolver.Get(cacheKey);

  if (null == cachedPage)

  {

  var page = _database.GetSingle(

  DropthingsDataContext.SubsystemEnum.Page,

  pageId,

  LinqQueries.CompiledQuery_GetPageById);

  page.Detach();

  _cacheResolver.Add(cacheKey, page);

  return page;

  }

  else

  {

  return cachedPage as Page;

  }

  }

  }

  PageRepository需要IDropthingsDataContext ,这是测试与LINQ to SQL的一个单位DataContext 。默认情况下,LINQ到SQL不会生成DataContext就是单元测试。你将不得不尝试做一个DataContext单元测试。接着,它需要一个ICache其是与缓存涉及的接口。在这个例子中,假设有一个名为类EnterpriseLibraryCache它将实现ICache 。

  测试及预期结果确保:鉴于新PageRepository和一个空的缓存,当 GetPageById是带一个PageId 。它首先检查缓存,如果发现没有,它从数据库中的网页中加载,并返回预期页面。

原文转自:http://www.codeproject.com/Articles/44276/Unit-Testing-and-Integration-Testing-in-Business-A