Unit Testing Web API dùng .NET Core
Đối với những lập trình viên chúng ta từ khóa Unit Test cũng như việc thực hiện công đoạn này đã trở nên quá phổ biến. Tuy nhiên có khi nào bạn đang coi nhẹ giai đoạn này vì nghĩ nó khá vô ích hay là tốn quá nhiều công sức và thời gian của team?
Trong bài viết này mình sẽ chia sẻ những giá trị mà Unit Test đem lại cho dự án và hướng dẫn viết Unit Test cho một ứng dụng WEB API sử dụng .NET CORE thông qua framework xUnit.
Unit Test không phải chỉ dùng để tìm Bug
Chúng ta thường quen với việc dùng unit test để tìm kiếm bug hoặc phát hiện hồi quy (những thứ đang làm việc tốt nhưng đã bất ngờ ngừng hoạt động), nhưng hiện nay với những test model mới và hiệu quả như trong quy trình Test Driven Development (TDD) thì unit test giúp cho lập trình viên hiểu rõ hơn về specs, có thể định hướng căn bản cho việc detail design của chương trình và xác định khung chương trình trước khi bắt tay vào implement code thực thi.
Như thế nào là một bộ unit test tốt?
Rất nhiều lập trình viên khi viết unit test đều cố gắng để pass hết các test case. Nhưng mục đích của unit test không phải là như vậy, hãy viết unit test sao cho mọi việc của bạn là modify source code implement chứ không phải là nỗ lực chỉnh sửa code test.
Viết Unit Test cho ứng dụng Web API sử dụng .NET CORE
- 1 . Tạo project test xUnit
- Thêm xUnit Test Project vào trong solution chứa project WEB API.
- Thêm những NuGET Package cần thiết
- Thêm reference tới WEB API Project
Test project sẽ phải reference tới .NET Core Project cần test hay còn được gọi là SUT (System Under Test).
- Thêm xUnit Test Project vào trong solution chứa project WEB API.
- 2 . Tạo Test Server
Sau khi thêm reference của SUT vào project test, chúng ta đã có thể tạo 1 Test Server để chạy project cần test xong xong với project test thông qua ASP NET CORE Test Host.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.TestHost;
public sealed class TestServerProvider
{
private static TestServerProvider _server = null;
public TestServer TestServer { get; private set; }
public static TestServerProvider Instance
{
get
{
if (_server == null)
{
_server = new TestServerProvider();
}
return _server;
}
}
private TestServerProvider()
{
TestServer = new TestServer(new WebHostBuilder().ConfigureAppConfiguration(builder => {
builder.AddJsonFile("appsettings.json");
}).UseStartup<Startup>());
}
}
|
- 3 . Tạo Test Client Provider
Tạo Test Client Provider để submit những request cần test tới test server.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
public class TestClientProvider:IDisposable
{
public HttpClient Client { get; private set; }
public TestClientProvider()
{
TestServer server = TestServerProvider.Instance.TestServer;
Client = server.CreateClient();
}
public void Dispose()
{
Client?.Dispose();
}
}
|
- 4 . Viết Test Cases
Sau khi hoàn thành tạo test server và test client chúng ta đã có thể viết các test case để test những api từ phía SUT.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
public class AccountXUnitTest
{
[Fact]
public async void TestGetTokenFailedWhenCustomerEmpty()
{
string accessToken = Utility.GenerateToken();
using (var client = new TestClientProvider(accessToken).Client)
{
var response = await client.GetAsync("api/account/token/");
string content = await response.Content.ReadAsStringAsync();
Assert.Equal(HttpStatusCode.NotFound, response.StatusCode);
}
}
[Theory]
[InlineData("customer_cd_1")]
public async void TestGetTokenFailedWhenCustomerNotFound(string customerCd)
{
string accessToken = Utility.GenerateToken();
using (var client = new TestClientProvider(accessToken).Client)
{
var response = await client.GetAsync("api/account/token/" + customerCd);
string content = await response.Content.ReadAsStringAsync();
Assert.Equal(HttpStatusCode.Unauthorized, response.StatusCode);
}
}
[Theory]
[InlineData("customer_cd_2")]
public async void TestGetTokenCustomerExisted(string customerCd)
{
string accessToken = Utility.GenerateToken();
using (var client = new TestClientProvider(accessToken).Client)
{
var response = await client.GetAsync("api/account/token/"+customerCd);
JObject respObject = JObject.Parse(await response.Content.ReadAsStringAsync());
string token = respObject.GetValue("accessToken").ToString();
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
Assert.False(string.IsNullOrEmpty(token));
}
}
}
|
- 5 . Run Test
Để chạy test ở đây mình sẽ dùng luôn thư viện xunit.runner.visualstudio để chạy lên visual studio, các bạn cũng có thể gọidotnet test
luôn trên terminal.
Nếu test thất bại, xUnit sẽ thông báo test case nào thất bại cũng như kết quả của test case đó.
Như vậy chúng ta đã viết được unit tests đơn giản với ứng dụng WEB API dùng .NET Core. Hi vọng là với hướng dẫn ban đầu này, các bạn có thể bắt đầu viết unit tests với .NET Core.