软件的单元测试关注是的软件最小可执行单元是否能够正常执行,但是软件是由一个个最小执行单元组成的集合体,单元与单元之间存在着种种依赖或联系,所以在软件开发时仅仅确保最小单元的正确往往是不够的,为了保证软件能够正确运行,单元与单元之间的集成测试是非常必要。
另外上一篇文章只是介绍了如何使用xUnit.net对.Net Core程序进行简单(无参)的单元测试以及计算代码的覆盖率,但是在实际的测试工作中,往往会通过语句覆盖、条件/分支覆盖(白盒)方式以及等价类、边界值等(黑盒)方式来设计测试用例,这些用例的测试的关键点在于传入测试方法的参数是不同的,如果使用无参测试方法那么针对不同的测试用例就需要编写大量的测试方法,这是不现实的。
本文将从以下几个方面,在单元测试的基础上介绍如何完成数据驱动测试以及代码依赖的集成测试:
集成测试简介
集成测试简单的理解就是在单元测试的基础上,将各个单元根据其依赖关系集成起来,检查代码是否能够正确运行,集成测试根据软件开发方式的不同或者软件架构不同也有不同的集成方式,比如面向过程的设计方式和面向对象设计方式、单体架构以及微服务分布式架构等等。
本文涉及到的仅仅是面向对象编程中类与类之间依赖的集成测试。
数据库是大部分软件系统不可缺少的组件,所以在集成测试时与数据库集成是一种常见的测试场景,下面就开始介绍如何通过xUnit.Net来测试。
1. 编写被测试代码:
在被测试项目中引入EFCore以及相关组件:
添加DBContext以及相应的数据操作代码:
注:此处使用LocalDB作为数据库完成测试,如果使用SQL Server修改连接字符串即可。
用户仓储中实现了用户添加以及根据姓名查询的方法。
注:完成代码编写后,需要将实体代码迁移到数据库,先通过Add-Migration添加迁移代码,然后通过update-database命令将数据更新到数据库,迁移方法可参考:https://docs.microsoft.com/en-us/ef/core/get-started/full-dotnet/new-db
2.编写测试代码:
测试代码也非常简单,就是创建一个SQLServer的用户仓储实例,然后通过构造的方式将其注入到UserManager类型中使用,后续UserManager的创建、查询用户的方法将通过该仓储实现。
3.测试运行结果:
可回归的数据库集成测试
这里的回归指的是回归测试,回归测试是指当修改了旧的代码后需要重新对旧代码进行测试确认此次修改没有影响到已有代码。一般来说使用xUnit.Net实现的测试均是可回归的,因为测试代码不变,且测试代码可以重复执行,另外测试代码也被代码版本管理工具管理,当修改代码后重新执行所有测试方法即可。
但是与数据库相关的测试又有所区别,数据库是数据持久化工具,对数据的每一次操作都会被持久化,假设有两个测试用例,第一是添加一条数据,第二是查询这条数据的数量是否为1,那么这两个测试在第一次运行的时候是没有问题的,但是再次运行时第一个用例可能主键冲突无法被添加,或者添加成功后第二个用例查询结果为2,导致测试失败,这样的测试视为不可回归。
下面就介绍如何使用xUnit.Net实现数据库集成的回归测试:
要实现数据库集成测试的可回归性,其实最主要的问题在于每次执行完单元测试后数据库的状态都是不同的,那么解决这个问题在每次执行测试前将数据库初始化是否就可以解决了呢?
看下面代码: