XUnit单元测试工具,对Asp.net core Web API进行测试
Past
我在刚开始学习web开发的时候,要测试某个API是否正常,通常就是先用Visual Studio或者IDEA 的调试模式,打开浏览器输入URL,看看返回的JSON,如果出现错误,就在代码上打个断点。如果是POST或者PUT请求,还得借助额外的工具,例如PostMan。这样无疑效率很低。
虽然老早听闻过单元测试,但一直没重点关注。最近尝试使用了一下XUnit,发现真的特别方便,而且一个成功的用例测试时间非常快,一秒钟左右。传统调试的方式光启动就好几秒。并且也支持调试模式,通过灵活的配置文件,编译预处理,能达到非常好的效果,几乎完全不用改被测试代码。
XUnit
用我的Mukai Music做例子吧,最近新增几个用户自己创建的歌单的相关API,思来想去打算用MongoDB来存储。用NoSQL Manager For MongoDB的时候脚本写的好好的,但是对于 dotNet的driver我不是特别熟,所以打算引入单元测试。
我的开发工具是Visual Studio 2019 Community,包含了完整的 dotNet Core工作负载,SDK版本3.1。
首先对需要测试的解决方案,新建一个XUNIT项目:
dotNet上支持好几种测试方案,我这里就拿XUnit举例。
添加后会得到一个测试项目,先不用着急,我们先为测试做一些准备:
首先是数据库,我新建了一个专门的test数据库,用于和部署时区分开。
然后是一些用户啊,中间件,可能都和部署时是由差别的。
我们直到aspnet core有一个Startup配置了整个项目依赖的服务,中间管道等等。我们可以新建一个TestStartup,专门用于我们的测试,这样就能保证我们测试的时候,业务逻辑层完全不受影响,但是不影响我们最终的部署,当测试通过后,直接编译部署就可以了。
一个专门用于测试的Startup:
在这里面我禁用了缓存中间件,并且对数据库连接的配置进行了改变,项目会连接到专门用于测试的数据库。
还有一点地方需要处理:
这是一个获取用户歌单详情的API,它必须登录才能使用,因为被访问的用户歌单可能是私有的。
[Authorize]注解来自Microsoft.AspNetCore.Authorization,带这个注解的方法需要登录才能使用.
[Authorization]注解其实是我自己写的一个Filter筛选器,作用是尝试读取Http请求头部的Authorization信息,读取里面的用户Id,并且注入到Action的参数中。
这其实是一个非常非常好用的东西,对请求处理相比中间件更加细化,或许会再写一篇博客来介绍它,也是最让我感叹,像Spring boot或者asp net core这样的框架最奇妙的东西大概莫过于此吧,让编程变得如此美妙,正如“在计算机领域,只需要通过添加中间层的方式,就能解决任何问题”。
扯远了。回到这个API上来,我们在测试的时候,可能是不要求一定要登录的,并且,因为登录需要额外的步骤,当然也可以手动添加一个token上去,但是为了减少代码的改动,我们可以使用如图中的编译预处理的方式,然后对loginUserId手动赋值。
说完了API,现在看看测试代码怎么写:
通过构建一个TestServer,接收一个IWebHost类型的参数,就能构建一个用于测试的server,这里其实和asp net core项目的Program.cs中的Main方法的做法是一样的。并且为了测试,我配置了我使用的appsettings.json,为开发环境的。这个文件我主要记录了远程服务的地址,缓存策略,图片存储地址,数据库连接字符串等等信息。它们和实际部署时是不同的。
并且我基于这个TestServer,创建了一个HttpClient,它的作用就是发送Htpp请求啦,为了测试项目IOC容器中的服务是否工作正常,我还拿到了IServiceProvider,它允许我们主动获取已经在IOC容器中进行注册的服务对象。
下面我们编写一个测试用例:
这是一个创建用户歌单的API测试。
Client.PostAsync<T,R>是我通过扩展方法实现的工具方法,它可以避免每次都手动写序列化的代码,Assert.Equal()和Assert.NotNull()方法是对结果返回结果进行验证,如果结果不符合测试预期,它们会抛出异常,从而导致测试失败。
要进行测试非常简单,打开Visual Studio的测试管理器,动动鼠标就行了。
四个API全部测试通过,只用了几秒钟时间,包含Post请求的手动测试即使全部成功怕是也得好几分钟吧。
- 0
- 0
-
分享