Xu Hướng 6/2023 # Test Javascript Code Với Jest # Top 11 View | Ezlearning.edu.vn

Xu Hướng 6/2023 # Test Javascript Code Với Jest # Top 11 View

Bạn đang xem bài viết Test Javascript Code Với Jest được cập nhật mới nhất trên website Ezlearning.edu.vn. Hy vọng những thông tin mà chúng tôi đã chia sẻ là hữu ích với bạn. Nếu nội dung hay, ý nghĩa bạn hãy chia sẻ với bạn bè của mình và luôn theo dõi, ủng hộ chúng tôi để cập nhật những thông tin mới nhất.

Test (hay automated test) là một phần không thể thiếu của quy trình phát triển phần mềm.Với những dự án mang tính chất phát triển lâu dài và có quy trình phát triển nhanh thì automated test là điều tối quan trọng.Bài viết này mình sẽ chia sẻ một vài kinh nghiệm viết test với javascript (Nodejs) sử dụng Jest.

Tại sao lại là Jest

Trước đây khi mới bắt đầu với Javascript mà đặc biệt là Nodejs, mình cũng hơi bị hoang mang khi tìm tool để viết test.Lạc giữa mê hồn trận các thể loại tools, nổi bật và được dùng nhiều nhất thời điểm đó vẫn là combo: Mocha + Chai + Sinon.Mình đã từng có ý định viết 1 bài blog về cách Setup đủ bộ combo này để chạy test và làm starter cho cả team, một phần vì nó khá loằng ngoằng và phức tạp.Cho đến một ngày mình gặp Jest.Jest được phát triển bởi Facebook, bạn có thể tìm hiểu thêm tại trang chủ của Jest

Vậy tại sao mình chọn Jest:

Đơn giản, dễ hiểu: bạn ko cần phải đi mò giữa nhiều thư viện khác nhau, chỉ lên trang chủ Jest là đủ

Không cần cấu hình gì cả: vâng, hoàn toàn không. Chỉ cần kéo thư viện về là bạn có thể bắt đầu viết test và test code được rồi

All in one: một mình Jest là đã cân đầy đủ test runner, assert và mock. Ngoài ra còn có thêm cả Coverage reports… rất ngầu.

Nhanh: phải nói là rất nhanh, ngoài ra terminal của test rất đẹp và thân thiện, khi dùng cảm giác rất cool.

Chừng đó đã đủ để Jest đốn tim bạn chưa? Nếu <3 rồi thì tại sao ta không tiến sâu hơn?

1

2

$ yarn add --dev jest

Nếu bạn để ý kỹ thì sẽ thấy jest bỏ qua thư mục node_modules và tự động tìm kiếm file test nằm trong thư mục __tests__ hoặc file có đuôi là: .spec.js hoặc .test.jsMình thì follow theo convention là sẽ đặt tên file test là .test.js cùng thư mục với unit code.

sum.js

1

2

3

4

function

sum

(

a, b

)

{

return

a + b;

}

module

.exports = sum;

Viết test case với Jest đơn giản chỉ là vậy. Bạn bắt đầu 1 test case với test() và sử dụng bộ assert expect() + toXXX() mà jest cung cấp.Bạn có thể tham khảo section Matchers trên trang chủ Jest, đầy đủ và rất dễ hiểu

Integration tests

Integration tests, nôm na là test xem code của mình mà có dùng đến code khác chạy có đúng không.Phần code khác, được hiểu là code của 1 unit khác, hoặc 1 thư viện mà mình nhúng vào để sử dụng.Để test được case này thì ta sẽ phải mô phỏng hành vi của phần code khác (gọi là mock), và test phần code của mình.

Mock 1 module

Giả sử mình có 1 module là total(array), nó sẽ sử dụng module sum ở trên để tính tổng các phần tử của 1 array

total.js

1

2

3

4

5

6

7

const

sum =

require

(

'./sum'

);

function

total

(

values = []

)

{

return

values.reduce(sum,

0

);

}

module

.exports = total;

Unit tests total:

Mock module thì chỉ đơn giản như vậy. Bạn có thể tham khảo kỹ hơn về mock trên trang chủ của jest.

Tất nhiên với case hàm total và sum ở trên thì bạn không cần mock vì mấy hàm này gần như cô lập và đã chạy rất nhanh.Giờ ta sẽ sang 1 case thực tế hơn, ví dụ bạn có 1 function, trong function đó gọi đến việc đọc thông tin 1 file trên ổ cứng.Trường hợp này mock sẽ giúp test case chạy nhanh hơn, mock được nhiều case hơn và bạn không cần chuẩn bị file trên ổ cứng để test.

Mock nodejs core module

Ví dụ mình có 1 hàm sử dụng core module fs để đọc thông tin file.

readContent.js

1

2

3

4

5

6

7

const

fs =

require

(

'fs'

);

function

readContent

(

file

)

{

return

fs.readFileSync(file);

}

module

.exports = readContent;

Unit Test Là Gì? 10 Frameworks Unit Test Cho Javascript

Thông thường khi làm một dự án web lớn thì nó sẽ được chia thành nhiều phần nhỏ để dễ dàng phát triển cũng như chỉnh sửa. Unit test có nhiệm vụ giúp bạn thực hiện kiểm tra các chức năng đó có chạy đúng theo yêu cầu hay không. Nó sẽ có hai loại unit test chính là Manual và Automated. Một số lợi ích khi bạn sử dụng unit test là:

Giúp cải thiện chất lượng đoạn mã trong chương trình.

Thời gian tìm lỗi được phát hiện nhanh hơn.

Cung cấp documentation cho trang web.

Đơn giản hóa quá trình gỡ lỗi.

Tiết kiệm chi phí khi xây dựng trang web.

Giúp bạn hiểu rõ hơn về hệ thống của mình thông qua những test case do bạn viết.

Những Framework Unit Test Dành Cho Lập Trình Viên

MochaJS là một framwork testing được sử dụng phổ biến trong lập trình web và hỗ trợ cho cả back-end(Nodejs) và front-end. Nó giúp bạn thực hiện kiếm tra không đồng bộ một cách đơn giản và dễ dàng. Ngoài ra nó còn có cộng động lập trình viên hỗ trợ đông đảo, nhiều hướng dẫn ví dụ chi tiết và được nhiều công ty cũng như website lớn tin tưởng sử dụng.

Jest là một framwork testing tập trung vào sự đơn giản. Nó có thể làm việc với Babel, TypeScript, Node, React, Angular, Vue… Với các bài test được chạy song song trong các quy trình riêng nhằm tối đa hiệu suất cho chương trình. Ngoài ra nó còn có tài liệu hướng dẫn chi tiết, yêu cầu thiết lập không phức tạp và dễ dàng có thể mở rộng để phù hợp với yêu cầu của lập trình viên.

AVA là một framework testing cho Javascript với API ngắn gọn và đưa ra những thông báo lỗi chi tiết trong quá trình kiểm tra. Một số điểm mạnh nó là cú pháp đơn giản, viết các test cho cú pháp Javascript mới nhất, hỗ trợ chức năng không đồng bộ, cung cấp chức năng promise…

Jasmine là một framework testing dùng để kiểm tra các đoạn mã Javascript. Với cú pháp đơn giản giúp bạn viết test case một cách dễ dàng. Một số điểm mạnh là hỗ trợ cho cả front-end và back-end, có tài liệu mở rộng khi sử dụng với các framework khác, tốc độ thực thi nhanh, không sử dụng bất kỳ thư viện bổ sung nào…

Karma mang lại một môi trường testing hiệu quả cho các nhà phát triển với các tính năng hữu ích như là có thể kiểm tra code trên nhiều thiết bị như trình duyệt, điện thoại, máy tính bảng…, mô tả các testing với Jasmine, Mocha, QUnit…, dễ dàng gỡ lỗi trực tiếp từ IDE thông qua WebStorm hay Google Chrome.

Puppeteer là một thư viện NodeJS cung cấp các high-level API để sử dụng cho các ứng dụng dành riêng cho trình duyệt như kiểm tra thu thập dữ liệu, testing UI, kiểm tra các chrome extension, xem các vấn đề về hiệu suất, chụp ảnh màn hình và PDF của các trang…

Nightwatch là một thư viện được xây dựng bằng NodeJS dễ dàng sử dụng cho các ứng dụng và trang web. Với cú pháp đơn giản, mạnh mẽ cho pháp bạn viết các test case một cách nhanh chóng thông qua Javascript và CSS. Quản lý tự động các dịch vụ Selenium hoặc WebDriver (ChromeDriver, GeckoDriver, Edge, Safari) trong một quy trình con riêng biệt. Sử dụng API WebDriver của W3C để điều khiển các trình duyệt thực hiện các lệnh và xác nhận trên các phần tử DOM.

Cypress là một testing framework giúp bạn kiểm tra nhanh chóng dễ dàng với mọi thứ chạy trên trình duyệt. Một sổ điểm mạnh của nó là cách thiết lập đơn giản, tự động tải lại khi các test case thay đổi, các hình ảnh được chụp tự động khi chạy test case, có thể gỡ lỗi trực tiếp thông qua các cụ phổ biến như Chrome DevTools…

Tape là một testing framework nhỏ gọn cung cấp bare-metal code giúp lập trình viên hoàn toàn tự do trong việc viết test case cho cả front-end và back-end. Ngoài ra nó cũng hỗ trợ cho ES6, coffee script tiêu chuẩn, Typescript và có thể chạy trên hầu hết các trình duyệt phổ biến hiện nay. Một hạn chế là nó không hỗ trợ global do vậy bạn cần thêm Tape vào mỗi tệp kiểm tra khi muốn thực hiện testing.

Chai là một testing framework cho NodeJS và trình duyệt. Nó cung cấp 2 loại là TDD(Test-Driven Development) tập trung vào kiểm tra quy trình nội bộ, hiệu suất của code và BDD(Behaviour-Driven Development) ưu tiên giá trị được đưa ra trong yêu cầu. Ngoài ra nó cũng các bài viết hướng dẫn chi tiết cho người mới bắt đầu cũng như cộng đồng lập trình viên hỗ trợ đông đảo.

Một số bài viết hướng dẫn sử dụng unit test

JestAvaJasmineKarma

Tổng kết:

Unit Testing Ứng Dụng C# Dùng .Net Core Và Visual Studio Code

Trong bài này tôi sẽ chia sẻ cách viết unit test một ứng dụng C# ( Khóa học C# tại Techmaster) đơn giản bằng test framework xUnit, tập trung vào giới thiệu cách sử dụng .NET Core CLI và Visual Studio Code.

Tạo 1 .NET Core solution

Khi các bạn làm quen lần đầu, để tạo 1 ứng dụng HelloWorld ai cũng từng chạy câu lệnh `dotnet new console -o HelloWorld`. Câu lệnh trước sẽ tạo một ứng project dạng console. Vậy nếu chương trình của bạn lớn hơn và muốn có nhiều projects (console, class hay tests) trong cùng 1 chỗ và quản lý chung thì làm sao?

cd Desktop # chuyển đường dẫn đến chỗ bạn muốn chứa solution dotnet new sln -o UnitTestXunit # tạo 1 solution tên UnitTestXunit

Quan tâm đến lập trình, bạn đang tìm hiểu về C#, hay muốn bắt đầu một công việc mới hay nâng cao kĩ năng, Techmaster luôn có chương trình thực tập giúp các bạn phát triển kĩ năng cũng như hỗ trợ tìm kiếm công việc.

Tạo Các Projects Bên Trong Solution

Bây giờ bạn đã 1 .NET Core solution và có thể tạo ra nhiều projects con bên trong. Chúng ta sẽ tạo 1 MathLib class và 1 xUnit test project.

Tạo C# Class cd UnitTestXunit dotnet new classlib -o MathLib # Tạo 1 MathLib class dotnet sln add ./MathLib/MathLib.csproj # Thêm class project vào trong solution Tạo xUnit Test Project

Với test project, chúng ta cũng cần thêm reference đến class MathLib mà ta sẽ kiểm thử

mkdir MathLib.Tests cd MathLib.Tests dotnet new xunit # Tạo xUnit test template dotnet add reference ../MathLib/MathLib.csproj # Thêm reference đến class cần kiểm thử cd .. dotnet sln add ./MathLib.Tests/MathLib.Tests.csproj

Sau khi hoàn thành các bước trên, bạn sẽ có 1 solution UnitTestXunit trong đó chứa 2 projects con là class MathLib và xUnit test project MathLib.Tests như sau

Giả lập MathLib class của chúng ta sẽ có các hàm để tính toán. Tên class mặc định là Class1, tôi sẽ đổi cả tên file `Class1.cs` và tên class trong file thành *SimpleMath*. Class này chứa 4 phương thức tính cộng, trừ, nhân, chia, số dư của số nguyên như sau

Viết test cases kiểm thử các phương thức trên

Chuyển sang folder MathLib.Tests, mặc định file test ban đầu là `UnitTest1.cs` và tên class cũng vậy, tôi sẽ đổi thành *SimpleMathTest*. Lúc này class SimpleMathTest sẽ là 1 bộ test dùng để kiểm thử class SimpleMath của MathLib. Mỗi phương thức trong class này sẽ là 1 test case. Lưu ý, nên đặt tên phương thức có nghĩa, ví dụ kiểm thử phương thức `Add` thì tên test case cũng như tên phương thức là `AddTest`, không nên chỉ để `Test1`, `Test2`,...

using System; using Xunit; using MathLib; namespace MathLib.Tests { public class SimpleMathTest { [Fact] public void AddTest() { var res = SimpleMath.Add(1, 2); Assert.True(3 == res); } [Fact] public void SubtractTest() { var res = SimpleMath.Subtract(10, 3); Assert.True(7 == res); } [Fact] public void MultiplyTest() { var res = SimpleMath.Multiply(7, 6); Assert.Equal(42, res); } [Fact] public void DivideTest() { var res = SimpleMath.Divide(21, 3); Assert.Equal( 7, res); } [Fact] public void RemainderTest() { var res = SimpleMath.Remainder(19, 4); Assert.Equal( 3, res); } } }

Trong 1 test framework, bạn sẽ có các hàm để so sánh kết quả. xUnit có các `Assertion` phương thức, trong ví dụ trên, để so sánh 2 kết quả bạn có thể dùng `Assert.Equal(kết quả mong đợi, kết quả thực tế)` hoặc `Assert.True(phép so sánh)`.

[Fact] vs [Theory]

Trong xUnit, bạn có 2 thuộc tính (attributes) là `[Fact]` và `[Theory]` để xác định 2 kiểu test cases. Với `[Fact]` bạn có 1 unit test bình thường như mọi framework khác và phương thức test này không nhận tham số đầu vào nào hết.

`[Theory]` thường được dùng nếu bạn muốn chạy cùng 1 test với 1 bộ dữ liệu, phương thức test lúc này sẽ nhận tham số đầu vào. Đi cùng với [Theory], bạn có thể dùng thêm `[InlineData()]` để truyền dữ liệu cho test cases. Áp dụng `[Theory]`, ta có thể viết test cases như sau:

using System; using Xunit; using MathLib; namespace MathLib.Tests { public class SimpleMathTest { [Theory] [InlineData(1, 2, 3)] [InlineData(-10, 2, -8)] [InlineData(100, 72, 172)] public void AddTest(int a, int b, int expectedRes) { var res = SimpleMath.Add(a, b); Assert.True(expectedRes == res); } [Theory] [InlineData(1, 2, -1)] [InlineData(-25, -10, -15)] [InlineData(9, 5, 4)] public void SubtractTest(int a, int b, int expectedRes) { var res = SimpleMath.Subtract(a, b); Assert.True(expectedRes == res); } [Theory] [InlineData(1, 2, 2)] [InlineData(-25, -10, 250)] [InlineData(0, 5, 0)] public void MultiplyTest(int a, int b, int expectedRes) { var res = SimpleMath.Multiply(a, b); Assert.Equal(expectedRes, res); } [Theory] [InlineData(100, 2, 50)] [InlineData(-25, 1, -25)] [InlineData(0, 5, 0)] public void DivideTest(int a, int b, int expectedRes) { var res = SimpleMath.Divide(a, b); Assert.Equal( expectedRes, res); } [Theory] [InlineData(100, 2, 0)] [InlineData(-25, 4, -1)] [InlineData(11, 3, 2)] public void RemainderTest(int a, int b, int expectedRes) { var res = SimpleMath.Remainder(a, b); Assert.Equal( expectedRes, res); } } }

Các bạn có thể thấy, khi chúng ta có nhiều bộ dữ liệu muốn kiểm tra, ta có thể dùng `[Theory]` để chạy 1 test case qua tất cả các trường hợp dữ liệu.

Chạy Test

Để chạy test, bạn có thể gọi `dotnet test` luôn khi đang ở ngoài solution hoặc chỏ đường dẫn trên terminal vào MathLib.Tests

dotnet test

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 đó

Quan tâm đến lập trình, bạn đang tìm hiểu về C#, hay muốn bắt đầu một công việc mới hay nâng cao kĩ năng, Techmaster luôn có chương trình thực tập giúp các bạn phát triển kĩ năng cũng như hỗ trợ tìm kiếm công việc.

Bắt Đầu Với Api Testing Như Thế Nào ?

1 ngày đẹp trời ,chúng ta nhận được thông điệp yêu cầu Test các API của dự án . 1 sự hoang mang không hề nhẹ khi ta chưa bao giờ động vào API , không biết mặt mũi nó như nào, thậm chí còn không biết API là gì, được dùng như thế nào …Vậy làm sao để test được nó ? test như thế nào? Có giống test app / web/…bình thường không nhỉ?….

Thực ra, khi làm công việc testing , cái chúng ta cần là mindset để đưa ra các testcase hiệu quả , còn việc tiếp cận với 1 loại ứng dụng mới hay 1 lĩnh vực công nghệ mới , có lẽ chỉ là việc học cách thức hoạt động và cách sử dụng nó thôi nhỉ 🙂

Với API Testing cũng thế , đầu tiên chúng ta cần trả lời các câu hỏi cơ bản : API là gì ? Làm cách nào để Test được nó khi không có giao diện người dùng ?

Google sẽ trả lời đầy đủ cho chúng ta những câu hỏi này ,chỉ cần chúng ta gõ từ khóa vào để hỏi thôi 😀

Đầu tiên cần có tài liệu mô tả API (API Document)

Tiếp nữa là cần cài tool Postman

2. Tạo bộ Testcase API

Để test API, chúng mình cũng cần tạo TC theo business flow của app . Mặc dù không có giao diện người dùng , nhưng test API chúng ta cũng cần phải test được tất cả các trường hợp được mô tả trong requirement , chạy được hết 1 flow của app . Như vậy , các viewpoint cho API testcase cũng sẽ bao gồm :

business flow

token (truyền sai token , token expried , không truyền token , token must be unique,….)

Permission

truyền ID vào URL (truyền sai ID , không truyền ID , ID must be unique,…)

header

request / respone

…..

(Các thuật ngữ trong API như : token, authorization, header, method, body , request, respone , status code, message code,…sẽ coi như đã biết, nếu chưa biết có thể google thêm 😀 )

3.1. Khởi đông postman và tạo collection

Collection : Không bắt buộc phải tạo, tuy nhiên cũng giống như việc lưu trữ file trên máy tính, nếu chúng ta cứ tạo ra các file mới và vứt bừa bãi trên desktop thì sẽ rất khó để quản lý và theo dõi, cách giải quyết là tạo các folder chứa các file chung mục đích vào với nhau ,rất thuận tiện cho việc quản lý theo thư mục. Collection trên postman cũng tương tự như 1 folder , nó giúp chúng ta lưu trữ các request vào chung 1 chỗ .

Màn hình Create new collection như trên sẽ được hiển thị

Sau khi tạo, collection sẽ hiển thị ở bên trái cửa sổ làm việc . Các bạn có thể nhấn vào button để thao tác 1 số setting cho collection

Share collections: get link để share collection với người khác

Rename: Đổi tên của collection.

Add Folder: tạo thêm collection mới bên trong Collection đó.

Duplicate: nhân đôi collection đang có.

Export: Xuất collection ra dạng file .json

Monitor Collection: Dùng để test hiệu năng

Mock Collection: giúp giả lập các API sử dụng chức năng Example mà postman hỗ trợ. Publish Docs: Tạo ra API Docs định dạng HTML.

Các bạn có thể import link collection được share bởi người khác để tiếp tục làm việc bằng cách :

3.2. Khai báo biến trong Collection variable

Trong quá trình test với các request , có rất nhiều giá trị mà request nào chúng ta cũng phải khai báo (VD như thông tin server , token,…) . Khi thay đổi các thông số này , chúng ta sẽ phải sửa lại ở từng request , việc này rất mất time và to tay 😀 . Thay vì việc liên tục copy và paste mỗi khi tạo request , chúng ta chỉ cần khai báo 1 lần bằng cách Edit collection và chọn Variables để bắt đầu khai báo biến .

Để khai báo biến token hay bất kỳ 1 giá trị nào khác chúng ta cũng làm tương tự. Giá trị Current values sẽ tự sinh sau khi nhập initial values

Sau khi biến đã được khai báo, để sử dụng các biến này trong các request , chúng ta gọi biến theo cú pháp {{tên biến}}

Ví dụ :

3.3. Gửi request với Postman

Sau này nếu có thay đổi giá trị của các biến này, chúng ta chỉ việc vào update lại initial values cho nó thôi 🙂

Để gửi request lên server , chúng ta cần có các thông tin sau :

Method

Các method thường được sử dụng :

GET :được sử dụng để lấy thông tin từ sever theo URI đã cung cấp (VD : view thông tin user ,…)

POST : gửi thông tin tới sever thông qua các biểu mẫu http (VD : Create user ,..)

PUT: ghi đè tất cả thông tin của đối tượng với những gì được gửi lên (VD : Update user,..)

PATH : ghi đè các thông tin được thay đổi của đối tượng (VD : Update user,…)

DELETE : xóa tài nguyên trên server.(VD: Xóa user,…)

2. URL

3. Header

4. Body

3.4. Truyền Token

Server sẽ trả về respone , VD như sau :

Khi gửi request login (get token) , server sẽ trả về 1 token để từ các request sau user phải truyền đúng token vào mới request được. Nó giống như chiếc chìa khóa để vào nhà vậy 🙂

Token là 1 chuỗi random và unique . Ví dụ request login lần đầu tiên sinh ra 1 token, bạn tiếp tục send request lần nữa, server sẽ trả về 1 token mới không trùng với token trước.

Vậy chúng ta truyền token vào đâu để gửi request ?

Có thể truyền token bằng 2 cách như sau :

Để tự động check response trả về ,chúng ta có thể sử dụng 1 vài dòng code đơn giản . Ví dụ muốn kiểm tra login thành công, chúng ta mở tab Tests trên Postman và viết script sau :

pm.test(“Status code is 200”, function () { pm.response.to.have.status(200); pm.test(“Status code name has string OK”, function () { pm.response.to.have.status(“OK”);

Sau khi send request , kết quả sẽ được hiển thị ở phần Test Results như sau :

Hoặc để kiểm tra login thành công trả về status code :200 , status code name : OK ,chúng ta viết 2 dòng code sau vào phần Tests :

3.6. Trích xuất data trong response để sử dụng trong các request tiếp theo

Để kiểm tra trường hợp trả về Fail ,chúng ta sửa expect khác với kết quả thực tế , VD như sau:

Trong quá trình test , có rất nhiều thông tin từ respone mà chúng ta cần trích xuất để làm input cho request tiếp theo. Việc copy paste gây mất time ,đôi khi copy sai dẫn đến gửi request sai . Không sao, chúng ta có thể làm “smart” hơn bằng cách viết script để trích xuất data mong muốn từ response trả về . Ví dụ muốn lấy token và userID trong respone trả về, ta viết code như sau :

Đoạn code này có nghĩa là lấy thông tin token , userId và đặt thành biến có tên là “token” , “userID”

3.7 . Pre-request script

Để sử dụng các biến này trong request khác, chúng ta gọi biến theo cú pháp {{tên biến}}

Ví dụ : Lấy thông tin userID và token trong respone trả về để truyền vào URL và header cho request tiếp theo :

Các bước khi gửi 1 request :

pm.globals.set(“name”, “User” + parseInt(Math.random().toString(9).substring(2,7)));

Như vậy chúng ta có thể sử dụng Pre-request script để tạo data(biến) để truyền vào param cho request

VD: Viết dòng code sau để tạo 1 biến “name” có giá trị là “UserXXXXX” .

Sau đó truyền biến này vào body để gửi request

Khi chạy request này ,server sẽ tự động sinh ra user name là giá trị ngẫu nhiên theo đúng cú pháp UserXXXXX

Cập nhật thông tin chi tiết về Test Javascript Code Với Jest trên website Ezlearning.edu.vn. Hy vọng nội dung bài viết sẽ đáp ứng được nhu cầu của bạn, chúng tôi sẽ thường xuyên cập nhật mới nội dung để bạn nhận được thông tin nhanh chóng và chính xác nhất. Chúc bạn một ngày tốt lành!