好代码是管出来的——.Net Core中的单元测试与代码覆盖率

  测试对于软件来说,是保证其质量的一个重要过程,而测试又分为很多种,单元测试、集成测试、系统测试、压力测试等等,不同的测试的测试粒度和测试目标也不同,如单元测试关注每一行代码,集成测试关注的是多个模块是否能正常的协同工作。
  当我们在衡量代码好坏时,其中一点就是这些代码是否进行了单元测试,测试的质量、代码覆盖率怎么样?本文将从以下几个方面介绍.Net Core中的单元测试:

单元测试简介

  单元测试是指对软件中的最小可测试单元进行检查验证,而.Net中最小可测试单元就是类和方法,单元测试是白盒测试关注于代码执行逻辑,所以单元测试代码一般也由开发人员编写。
  单元测试关注的两个重点就是最小可测试单元和代码逻辑,但是很多情况下,一个类或者是方法它会依赖一些外部组件,如其他开发人员写的代码、第三方类库、数据库、网络等,当被测试的代码与这些组件紧耦合时,那么这段代码将可能是不可测的,如一个方法中依赖一个数据库组件去访问数据库,那么在执行这个方法时,必然要与数据库交互,如果没有数据库,那么该方法就无法运行。
  所以单元测试不仅是对代码逻辑进行检查,同时还对整个代码结构有所限制,面向对象编程时应当遵循“依赖倒置”原则,模块应该依赖抽象,抽象不应该依赖实现。并且所依赖的抽象,应该显示的通过构造或者方法参数进行暴露,让组件的使用者对组件的依赖一目了然。
  而在单元测试时为了屏蔽这些抽象依赖,不同测试框架中提供了stub、mock、fake等方式对抽象进行模拟,以便于代码能够正常执行。

.Net Core中的单元测试框架

  .Net Core中常用的单元测试的框架有MSTest、NUnit和xUnit.net,它们的使用方法都非常相似,都是通过特性标记的方式声明测试方法,然后在方法中使用断言(Assertions)来判别方法执行结果是否达到预期。
  这三个框架中MSTest是与VS集成的,而NUnit和xUnit.net都加入了.Net基金会,下面两个图分别是三个框架特性和断言的比较(内容来自:https://xunit.github.io/docs/comparisons):
  特性:

  

好代码是管出来的——.Net Core中的单元测试与代码覆盖率

  断言(部分):

  

好代码是管出来的——.Net Core中的单元测试与代码覆盖率

 

  三个框架自有优点,但xUnit.net使用更广泛一些(许多开源项目都使用xUnit.net,包括ASP.NET Core MVC、EF Core等项目),支持.Net下的大部分平台(.Net Fx、.Net Core、UWP、Xamarin),并且具有非常好的可拓展性。

使用xUnit.Net对.Net Core应用进行单元测试

  本文使用xUnit.Net框架来对.Net Core程序进行单元测。

创建xUnit.Net测试项目

  在解决方案中添加.Net Core的被测试项目以及xUnit测试项目:

  

好代码是管出来的——.Net Core中的单元测试与代码覆盖率

  目录结构:

  

好代码是管出来的——.Net Core中的单元测试与代码覆盖率

  xUnit测试项目还提供了相应的代码分析器来帮助编写测试代码:

  

好代码是管出来的——.Net Core中的单元测试与代码覆盖率

编写测试方法

  在被测试的项目中添加一个计算器类型,并添加加法运算的方法:

   

好代码是管出来的——.Net Core中的单元测试与代码覆盖率

  在测试项目中添加Calulator方法的测试代码:

  

好代码是管出来的——.Net Core中的单元测试与代码覆盖率

断言

  在程序中,断言指的是一个表达式语句执行时总是为真(True),它有助于代码阅读、调试、编译和缺陷检测,当断言内表达式执行为True时,不会执行任何操作,当结果为false时将会输出一些异常信息,下图是.Net中System.Diagnositics命名空间下提供的代码调试使用的断言用法(在调试程序时,当参数x < y就会中断并抛出异常信息):

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyjfgy.html