使用 xUnit 编写 ASP.NET Core WebAPI单元测试
本文使用xunit对asp.net core webapi做单元测试,使用httpclient的同步和异步请求,下面详细介绍xunit的使用过程:
一、创建示例项目
模板为我们自动创建了一个valuescontroller控制器,保留里面的一个get请求和post请求方法,代码如下:
[route("api/[controller]")] [apicontroller] public class valuescontroller : controllerbase { // get api/values/5 [httpget("{id}")] public actionresult<string> get(int id) { return $"value:{id}"; } // post api/values [httppost] public actionresult<string> post(dynamic obj) { return $"姓名:{obj.name},年龄:{obj.age}"; } }
使用.net core创建一个xunit单元测试项目,如图:
项目的模板页已经为我们添加好了xunit的引用,不需要我们手动去nuget导入了,现在从nuget中添加microsoft.aspnetcore.app和microsoft.aspnetcore.testhost,xunit项目并添加webapi的项目引用,如下图所示:
二、编写单元用例
写单元测试一般有三个步骤:arrange,act 和 assert。
- arrange 是准备阶段,这个阶段是准备工作,比如模拟数据、初始化对象等;
- act 是行为阶段,这个阶段是用准备好的数据去调用要测试的方法;
- assert 是断定阶段,就是把调用目标方法返回的值和预期的值进行比较,如果和预期一致说明测试通过,否则为失败。
新建一个单元测试类:valuestest.cs;用于对valuescontroller进行单元测试。
1、使用httpclient进行get请求测试,单元测试代码如下:
using microsoft.aspnetcore; using microsoft.aspnetcore.hosting; using microsoft.aspnetcore.testhost; using newtonsoft.json; using system.net; using system.net.http; using system.net.mime; using system.text; using system.threading.tasks; using xunit; using xunit.abstractions; namespace webapi.xunit { public class valuestests { public valuestests(itestoutputhelper outputhelper) { var server = new testserver(webhost.createdefaultbuilder() .usestartup<startup>()); client = server.createclient(); } public httpclient client { get; } [fact] public async task getbyid_shouldbe_ok() { // arrange var id = 1; // act var response = await client.getasync($"/api/values/{id}"); // assert assert.equal(httpstatuscode.ok, response.statuscode); } } }
这里我们通过 testserver 拿到一个 httpclient 对象,用它我们可以模拟 http 请求。我们写了一个非常简单的测试用例,完整演示了单元测试的 arrange,act 和 assert 三个步骤。
2、使用httpclient进行post请求测试,并用itestoutputhelper输出请求信息,单元测试代码如下:
using microsoft.aspnetcore; using microsoft.aspnetcore.hosting; using microsoft.aspnetcore.testhost; using newtonsoft.json; using system.net; using system.net.http; using system.net.mime; using system.text; using system.threading.tasks; using xunit; using xunit.abstractions; namespace webapi.xunit { public class valuestests { public valuestests(itestoutputhelper outputhelper) { var server = new testserver(webhost.createdefaultbuilder() .usestartup<startup>()); client = server.createclient(); output = outputhelper; } public httpclient client { get; } public itestoutputhelper output { get; } [fact] public async task post_shouldbe_ok() { var content = new stringcontent(jsonconvert.serializeobject(new { name = "cxt", age = 22 }), encoding.utf8, mediatypenames.application.json); var response = await client.postasync("/api/values", content); // output var responsetest = await response.content.readasstringasync(); output.writeline(responsetest); assert.equal(httpstatuscode.ok, response.statuscode); } } }
3、运行测试用例,得到测试结果。
在当前的方法内,如getbyid_shouldbe_ok()、post_shouldbe_ok()代码块内右键->运行测试,或者打开测试资源管理器,运行所选测试
绿色的勾表示已经测试通过。
下面查看post请求的output打印结果:
通过上面两个测试用例,发现使用起来超级方便。
推荐阅读
-
使用 xUnit 编写 ASP.NET Core WebAPI单元测试
-
Asp.net core WebApi 使用Swagger生成帮助页实例
-
Asp.Net Core WebAPI使用Swagger时API隐藏和分组详解
-
ASP.NET Core 3.0 WebApi中使用Swagger生成API文档简介
-
Asp.net core WebApi 使用Swagger生成帮助页实例
-
ASP.NET Core 2.2 WebApi 系列【九】使用SignalR
-
【翻译】使用WebApi和Asp.Net Core Identity 认证 Blazor WebAssembly(Blazor客户端应用)
-
ASP.NET Core WebApi使用Swagger生成api说明文档看这篇就够了
-
net core WebApi——使用xUnits来实现单元测试
-
asp.net core webapi 使用ef 对mysql进行增删改查,并生成Docker镜像构建容器运行