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

  

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

  更多参考:https://docs.microsoft.com/en-us/visualstudio/debugger/assertions-in-managed-code
  在单元测试中,测试方法也是使用断言的方式来判别程序执行结果与预期结果是否相符:

  

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

  xUnit.net中的断言参考:https://github.com/xunit/assert.xunit

运行单元测试

  在VS中可以使用VS的测试窗口运行测试方法:

  

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

  运行结果(测试通过):

  

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

  运行结果(测试未通过):

  

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

Mock

  在文章前面提到过,面向对象编程应该显示的依赖抽象,单元测试时应该将屏蔽依赖的影响(无论是依赖还未实现,或者实现的依赖会阻碍代码执行),为了满足这一需求出现了Mock、Fake等方式,其原理就是创建一个"假"的"空"的依赖,并用其替代真实依赖,以确保代码能够运行。
  .Net中一个常用的Mock框架是Moq,本文将使用Moq来介绍如何对依赖进行模拟:
  1. 编写需要依赖的代码:

  

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

  

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

  上面代码中UserManager依赖一个用户的仓储类型,该仓储将会与数据库交互。
  2. 为测试项目安装Moq组件:

  

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

  3. 编写测试代码:

  

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

  上面代码通过Moq组件Mock了一个IUserRepository的类型,并将其Add方法设置并返回true(注:设置方法时参数的数据要与调用时使用的一致),最后通过Mock的对象实例Object来创建UserManager实例。
  最后断言当创建用户时,年龄为负数则抛出FormatException。
  4. 运行测试:

  

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

  测试成功。

单元测试代码覆盖率

  测试代码覆盖率是对单元测试的一种度量,可以用来衡量单元测试是否达标,一般将代码测试目标定到80%-90%之间,为了保证代码覆盖率,在写测试用例时就要从语句覆盖、条件覆盖、路径覆盖等方面进行充分考虑。
  而.Net Core中如何在测试时计算代码覆盖率呢?如果使用VS的企业版,那么VS自带了代码覆盖率分析工具:

  

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

 

  详情参考:https://docs.microsoft.com/en-us/visualstudio/test/using-code-coverage-to-determine-how-much-code-is-being-tested
       
  注:VS集成了MSTest,所以代码覆盖分析工具对MSTest支持非常好,但对xUnit.Net的支持如何笔者未进行测试。

  对于xUnit.net来说,要分析测试代码覆盖率还可以通过“OpenCover”和“ReportGenerator”工具完成,下面就介绍如何通过这两个工具完成代码覆盖率的分析:
  1. 下载并安装OpenCover,在OpenCover的GitHub上下载最新release的zip包,并解压缩到指定目录下,并将OpenCover目录添加到环境变量中:

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

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