Xu Hướng 12/2022 # Hướng Dẫn Viết Unit Test Trong Angular / 2023 # Top 20 View | Ezlearning.edu.vn

Xu Hướng 12/2022 # Hướng Dẫn Viết Unit Test Trong Angular / 2023 # Top 20 View

Bạn đang xem bài viết Hướng Dẫn Viết Unit Test Trong Angular / 2023 đượ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.

Lợi ích của Unit test

Cải thiện design: Bắt tay vào code mà không để ý quá nhiều đến design là một lỗi phổ biến của các developer, việc viết unit test sẽ bắt buộc bạn phải suy nghĩ, thậm chí nghĩ đi nghĩ lại về design

Dễ dàng refactor: bởi vì bạn đã có các case test đảm bảo code của bạn chạy đúng như mong đợi, bạn có thể dễ dàng refactor code mà không lo sẽ tạo ra những bug mới

Test là một tài liệu về spec: nếu viết test chuẩn và đủ case, thì chỉ cần đọc test, ta cũng có thể hiểu rõ spec còn nhanh hơn cả đọc code

Việc viết test giúp developer tự tin hơn

Bạn có thể cho rằng việc viết test quá tốn thời gian, nhất là viết test FE, có khi nó còn lâu hơn cả viết code nữa, nhưng mình nghĩ nó sẽ giúp tiết kiệm thời gian hơn khi bạn muốn refactor code hay phát triển tính năng mới, giảm thiểu được cả thời gian để fix bug so với việc không viết test.

Giờ chúng ta sẽ bắt tay vào một ví dụ nhỏ nhưng khá đầy đủ sử dụng Angular, Jasmine và Karma. Phần tiếp theo của bài viết sẽ đề cập đến những điều sau:

Giải thích một chút về Karma và Jasmine

Karma config

Tạo một file test đơn giản

Test angular form

Test component với service

Tạo project Angular với Jasmine và Karma

Install angular-cli và tạo project mới

Giải thích 1 chút về Jasmine và Karma không lại bảo nãy giờ cứ nói hoài mà không biết là gì

Jasmine: là một framework dùng để viết test, nó có các function có sẵn hỗ trợ viết các loại test khác nhau

Karma: là một Javascript tool được sử dụng để load ứng dụng và thực thi test của bạn. Karma sẽ được thực thi bằng dòng lệnh và sẽ hiển thị kết quả cho bạn biết mỗi khi bạn chạy trình duyệt.

Để chạy thử chỉ cần gõ ng test. Lệnh này sẽ thực thi các case test, mở trình duyệt, hiển thị kết quả trên trình duyệt và trong console.

Karma config

Giờ hãy nhìn vào file Karma config được sinh ra từ angular-cli

frameworks: đây là nơi jasmine được set là framework để testing, nếu bạn muốn dùng 1 framework khác thì có thể điền vào đây.

autoWatch: nếu nó được set là true, test sẽ chạy chế độ watch mode, có nghĩa là mỗi khi bạn thay đổi bất cứ dòng code nào trong file test và lưu lại, nó sẽ tự động build lại và chạy lại.

browsers: đây là nơi để set trình duyệt và test sẽ chạy, mặc định sẽ là Chrome, nhưng bạn có thể sử dụng trình duyệt khác bằng cách khai báo ở đây.

Bắt đầu với một file test đơn giản

Lướt qua 1 chút thì ở đây chúng ta đã

import các thư viện angular testing mà chúng ta sẽ sử dụng

Import các component phụ thuộc

Sử dụng describe để bắt đầu phần viết test với title trùng với tên component test.

Sử dụng async trước mỗi case test, mục đích là để các phần code không đồng bộ có thể kết thúc trước khi tiếp tục, nó tương tự với cách dùng async lúc viết code ý.

Trước khi chạy bất cứ case test nào trong Angular, bạn cần phải config Angular testbed. Nó giúp tạo 1 môi trường cho component đang được test. Bất cứ module, component, service nào mà component bạn đang test cần, thì đều phải được đưa vào trong testbed. Cuối cùng, sau khi config xong, bạn sẽ gọi đến hàm compileComponents().

Tiếp theo, chúng ta có 2 case test. Mình sẽ giải thích từng case một:

Case đầu tiên, chúng ta sẽ kiểm tra xem component có thực sự chứa text chúng ta kì vọng trong phần title hay không. Đầu tiên, chúng ta cần 1 instance của app.component, vì vậy chúng ta sử dụng hàm createComponent(), tạo 1 đối tượng fixture, cho phép chúng ta tạo 1 instance của component. Sau khi đã có instance của app.component, chúng ta có thể kiểm tra giá trị của thuộc tính title có giống với text chúng ta kì vọng hay không bằng hàm toEqual().

Test angular form

Bắt đầu với 1 file HTML chúng tôi có chứa form

Form này khá đơn giản nên không cần giải thích gì nhiều. Nút submit sẽ bị disabled nếu form invalid.

Tiếp theo đến contact.component.ts

Giờ đến file test

Trông phức tạp hơn nhiều so với file test trên nhỉ, đừng lo, mình sẽ giải thích cụ thể từng phần đây

Đầu tiên vẫn là phần import, không có gì khác lắm, ngoại trừ import thêm By để chọn element từ DOM.

Trong beforeEach(), ta dùng promise cho hàm compileComponent(), khi promise được resolved, chúng ta sẽ tạo instance của component trong này luôn, để đỡ phải viết lại trong mỗi case test.

Case đầu tiên chỉ đơn giản là kiểm tra giá trị thuộc tính text của component.

Case thứ 2 kiểm tra giá trị của biến submittedlà true khi hàm onSubmit() được gọi đến.

Case thứ 4 kiểm tra khi truyền vào những giá trị invalid, thuộc tính valid của form sẽ là false.

Cuối cùng, case thứ 5 ngược lại với case thứ 4, khi truyền vào những giá trị valid, thuộc tính valid của form sẽ là true.

Trước khi kết thúc bài viết, chúng ta sẽ đến với phần cuối cùng, là làm sao xử lý service khi component cần test sử dụng chúng.

Test component với service

Ví dụ một component sử dụng service

Component này sẽ gọi sang service để lấy danh sách users, lúc viết test thì việc lấy users từ đâu cũng ko quan trọng, nên ta có thể tạo component mocking cho service này.

Về cơ bản thì cũng giống mấy ví dụ trên, chỉ khác ở chỗ khi UserService được gọi đến, nó sẽ thay bằng UserServiceMock. UserServiceMock là một dummy service để trả về dummy data để chạy test. Vậy thôi, đó là cách bạn nên dùng để mock service cho component.

Nguồn: https://medium.com/swlh/angular-unit-testing-jasmine-karma-step-by-step-e3376d110ab4

Phần 1: Cách Viết Unit Test Trong C# / 2023

Bài viết sẽ hướng dẫn các bạn từng bước tạo, chạy và tối ưu Unit tests sử dụng Microsoft unit test framework. Chúng ta sẽ bắt với 1 project C# đang trong giai đoạn phát triển, chúng ra sẽ tạo các tests và chạy nó, xem xét kết quả.

Yêu cầu – Visual Studio 2015 – xem code ví dụ tại Sample Project for Creating Unit Tests.

1.Tạo một unit test project

Bạn cần tạo trước project với code ví dụ tại Sample Project for Creating Unit Tests.

Trong New Project dialog box, chọn Installed, chọn Visual C#, và chọn Test.

trong danh sách, chọn Unit Test Project.

Trong Name box, đặt tên là BankTest, và chọn OK.The BankTests project is added to the the Bank solution.

Trong BankTests project, add reference đến BankAccount (project bạn muốn viết Unit test) trong solution.

2.Tạo một test class

Trong test project bạn đổi tên chúng tôi thành chúng tôi Sau đó bạn mở file chúng tôi và bạn sẽ thấy code bên dưới

using System; using Microsoft.VisualStudio.TestTools.UnitTesting; namespace BankTests { [TestClass] public class BankAccountTests { [TestMethod] public void TestMethod1() { } } }

Yêu cầu của một Test class

attribute [TestClass] là bắt buộc trong Microsoft unit testing framework để được quản lý cho bất kỳ class nào chứa unit test methods

Mỏi test method phải chứa attribute [TestMethod].

3.Tạo test method đầu tiên

Chúng ta sẽ viết unit test cho Debit method trong class BankAccount . .

Bằng các phân tích, chúng ta thấy được Debit method có  ít nhất 3 trường hợp cần test:

Method ném ra Exception ArgumentOutOfRangeException Nếu số tiền rút lớn hơn số tiền có trong tài khoản.

Method ném ra Exception  ArgumentOutOfRangeException nếu số tiền rút nhỏ hơn 0.

Nếu việc kiểm tra 1 và 2 là đúng, method sẽ trừ số tiền rút ra khỏi tài khoản.

Trong thử nghiệm đầu tiên của chúng ta, chúng ta xác minh bằng một số tiền hợp lệ (số ít hơn số dư tài khoản và lớn hơn số không) và trả về một số tiền chúng ta đã xác định trước.

Tạo một test method Chúng ta cập nhật file chúng tôi như bên dưới

using Microsoft.VisualStudio.TestTools.UnitTesting; using BankAccountNS; namespace BankTests { [TestClass] public class BankAccountTests { [TestMethod] public void Debit_WithValidAmount_UpdatesBalance() { double beginningBalance = 11.99; double debitAmount = 4.55; double expected = 7.44; BankAccount account = new BankAccount("Mr. Bryan Walton", beginningBalance); account.Debit(debitAmount); double actual = account.Balance; Assert.AreEqual(expected, actual, 0.001, "Account not debited correctly"); } } }

Trong test method Debit_WithValidAmount_UpdatesBalance chúng ta giả định tai khoản có beginningBalance = 11.99 và chúng ta sẽ rút debitAmount = 4.55 vậy số tiền còn lại phải là expected = 7.44. Chúng ta sử dụng AreEqual method để kiểm chứng tài khoản còn lại đúng với mong muốn.

Yêu cầu của Test method

Test method phải có attribute [TestMethod].

Test method phải return void.

Test method không có tham số.

4.Build và run test

Trong Build menu, chọn Build Solution. Nếu không có lỗi, Test Explorer window sẽ xuất hiện(bên trái), Debit_WithValidAmount_UpdatesBalance sẽ được liệt kê trong nhóm Not Run Tests.

Chọn Run All để run test. Trong Test Explorer status bar bắt đầu run. sau khi kết thúc test, thanh bar sẽ chuyển sang màu xanh lá test methods pass, hoặc đỏ nếu tests fail.

5.Sửa lỗi và chạy lại Test

Chúng ta cần kiểm tra lại method Debit.

Nguyên nhân lỗi

m_balance += amount;

Cần sửa lại thành

m_balance -= amount;

Chạy lại test Trong Test Explorer, chọn Run All để chạy lại hết các test method. Thanh trạng thái chuyển sanh màu xanh lá, và test được chuyển sang Passed Tests group.

Phần 2: Sử dụng Unit Test để cải thiện code

Bài viết Phần 1: Cách viết Unit Test trong C Sharp được dịch từ

https://msdn.microsoft.com/en-us/library/ms182532.aspx#BKMK_Create_a_unit_test_project

Viết Unit Test Trong C# Với Nunit / 2023

Ở trường đại học chắc các bạn đã được học khái niệm về Unit Test trong môn “Kiểm thử chất lượng phần mềm”. Nói một cách dễ hiểu, unit test tức là code dùng để test code ta đã viết.

Một số đặc điểm của unit test:

Code unit test phải ngắn gọn, dễ hiểu, dễ đọc.

Mỗi unit test là 1 đơn vi riêng biệt, độc lập, không phụ thuộc vào unit khác.

Mỗi unit test là 1 method trong test class, tên method cũng là tên UnitTest. Do đó ta nên đặt tên hàm rõ ràng, nói rõ unit test này test cái gì (Test_A_Do_B), tên method có thể rất dàiii cũng không sao.

Unit Test phải nhanh, vì nó sẽ được chạy để kiểm định lỗi mỗi lần build. Do đó trong unit test nên hạn chế các task tốn thời gian như gọi I/O, database, network,…

Unit Test nên test từng đối tượng riêng biệt. Vd: Unit Test cho Business Class thì chỉnh test chính BusinessClass đó, không nên dụng tới các class móc nối với nó (DataAccess Class chẳng hạn).

Một số bạn sẽ thắc mắc: “Ơ hay, trong business class thì phải gọi data access chứ?”, và “code mình dính chùm lắm, làm sao test từng class riêng được”.

Để viết unit test, các class của bạn phải có quan hệ “lõng lẽo” với nhau (loose coupling), nếu không viết được unit test nghĩa là các class dính với nhau quá chặt, sẽ khó thay đổi sau này. Hãy áp dụng các nguyên lý SOLID vào code, viết code với tư tưởng “viết sao để unit test được” sẽ là code của bạn uyển chuyển, dễ test hơn.

Về vấn đề Business Class và Data Access, các class không nên gọi trực tiếp lẫn nhau mà gọi thông qua interface. Khi unit test, ta sẽ thay các hiện thực interface này bằng các class giả, thay thế cho class data access thật. Mình sẽ nói rõ về vấn đề này ở những bài viết về Inversion of Control, Dependency Injection trong tương lai.

Một số lợi ích của Unit Test:

Nếu viết Unit Test một cách cẩn thận, code của bạn sẽ ít lỗi hơi, vì Unit Test sẽ phát hiện lỗi cho bạn.

Phát hiện những hàm chạy chậm và không hiệu quả thông qua thời gian chạy của Unit Test.

Tăng sự tự tin khi code, vì đã có Unit Test phát hiện lỗi.

Khi refactor code, sửa code hay thêm chức năng mới, Unit Test đảm bảo chương trình chạy đúng, phát hiện những lỗi tiềm tàng mà ta bỏ lỡ.

Unit Test trong C# với NUnit

Trước đây, để viết Unit Test trong C#, ta thường phải tạo một project test riêng, sử dụng thư viện MSTest của Microsoft. MSTest hỗ trợ khá nhiều chức năng: Test dữ liệu từ database, đo performance hệ thống, xuất dữ liệu report. Tuy nhiên, do MSTest đi kèm với Visual Studio, không thể chạy riêng rẽ, lại khá nặng nề, do đó NUnit được nhiều người ưa thích hơn. NUnit có 1 bộ runner riêng, có thể chạy UnitTest độc lập không cần VisualStudio, ngoài ra nó cũng hỗ trợ một số tính năng mà MSTest không có (parameter test, Assert Throw).

Nếu bạn chưa bao giờ viết Unit Test, bắt đầu với NUnit cũng là 1 lựa chọn không tồi. Đầu tiên, ta hãy tạo 1 project console trong Visual Studio. Ta viết 1 class Calculator với các 2 hàm Add và Subtract:

public class Calculator { public int Add(int x, int y) { return x + y; } public int Subtract(int x, int y) { return x - y; } } using NUnit.Framework; [TestFixture] public class CalculatorTest { private Calculator _cal; [SetUp] public void Setup() { _cal = new Calculator(); } [Test] public void OnePlusOneEqualTwo() { Assert.AreEqual(2, _cal.Add(1, 1)); } [Test] public void TwoPlusTwoEqualFour() { Assert.AreEqual(4, _cal.Add(2, 2)); } [Test] public void FourPlusOneEqualFive() { Assert.AreEqual(5, _cal.Add(4, 1)); } }

Giải thích một số annotation:

Annotation [TextFixture] đặt vào đầu class chứa các unit test, đánh dấu đây là một bộ các unit test.

Annotation [SetUp] để đánh dấu hàm setup. Hàm này sẽ được chạy vào đầu mỗi unit test.

Để chạy Unit Test, ta cần cài NUnit.TestAdapter, đây là bộ runner cho phép chạy các Unit Test của NUnit trong Visual Studio. Bạn cũng có thể dùng 1 trong 2 cách sau:

Tải NUnit GuiRunner về, mở file dll của project test, các unit test sẽ hiện ra để chạy.

Tải Reshaper. Reshaper cũng tích hợp sẵn 1 bộ Runner cho phép chạy Unit Test của NUnit.

Ta cố ý sửa lại code để code chạy sai. Chạy lại Unit Test, ta sẽ thấy các case đã fail. Unit Test đã tự động bắt lỗi chương trình cho bạn rồi đấy. Bấm vào từng test case, ta sẽ thấy kết quả mong muốn ở đoạn ” Excepted“, kết quả code chạy ở đoạn ” But was “.

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

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:

Cập nhật thông tin chi tiết về Hướng Dẫn Viết Unit Test Trong Angular / 2023 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!