Xu Hướng 6/2023 # Tìm Hiểu Về Jestjs, Viết Unit Test Cho Javascript # Top 12 View | Ezlearning.edu.vn

Xu Hướng 6/2023 # Tìm Hiểu Về Jestjs, Viết Unit Test Cho Javascript # Top 12 View

Bạn đang xem bài viết Tìm Hiểu Về Jestjs, Viết Unit Test Cho Javascript đượ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.

Jestjs là một JavaScript Testing Framework khá là dễ sử dụng và cài đặt, tuy nhiên vẫn đầy đủ tính năng để bạn có thể sử dụng Bài viết này mình xin giới thiệu một số tính năng cơ bản của jest cùng với một số ví dụ.

Cài đặt

Cài đặt Jest khá đơn giản:

yarn add --dev jest

hoặc

npm install --save-dev jest

Sau đó thêm đoạn code sau vào file package.json:

Tiếp theo mình có ví dụ một file test: math.js

Để viết test cho file trên mình tạo file test/math.test.js, đuôi file là chúng tôi sẽ nói cho jest biết đây là file test của bạn.

Sau đó chạy yarn test hoặc npm run test.

Ở trong đoạn code trên:

expect(MathJS.sum(1, 1)).toBe(2);

.toBe() chính là một matcher trong jest. Nó giống như phép so sánh bằng bình thường vậy. Ví dụ:

expect(result).toBe(2); expect(result).toBe(true); expect(result).toBe({a: 1, b: 2});

Tuy nhiên khi so sánh một Object bạn nên sử dụng .toEqual() Lý do là vì.toBe thực tế sử dụng === để so sánh và đưa ra kết quả. Và chúng ta đều biết trong javascript:

Còn .toEqual() theo như Jest sẽ lần lượt kiểm tra tất các trường của Object, hoặc mảng để so sánh. Vì vậy thay vì viết:

expect(result).toBe({a: 1, b: 2});

Hãy viết:

expect(result).toEqual({a: 1, b: 2});

Ngoài ra còn các matchers khác:

Truthiness

toBeNull so sánh với giá trị null.

toBeUndefined so sánh với giá trị undefined.

toBeDefined là hàm cho kết quả ngược lại toBeUndefined.

toBeTruthy so sánh với giá trị true.

toBeFalsy so sánh với giá trị false.

Numbers

Đối với số thập phân, bạn nên sử dụng toBeCloseTo:

String

Bạn có thể kiểm tra một đoạn văn bản với regular expressions bằng toMatch:

Array

Để kiểm tra giá trị có trong một mảng, bạn có thể dùng toContain:

Exceptions

Để kiểm tra một lỗi có thể xảy ra bạn có thể sử dụng toThrow:

Test một action trong redux Test một event trong Jquery

Bạn có thể thấy const alert = jest.fn();. Đây là một tính năng trong Jest giúp bạn mock một function. Hay mô phỏng lại hàm cần test.

Test với module axios

Trong ví dụ này mình đã mock module axios, và đặt giá trị trả về cho hàm get. Như vậy khi test bạn sẽ không cần phải gửi request thật, tránh mất thời gian. Các module khác bạn cũng có thể làm cách tương tự.

All Rights Reserved

Viết Unit Test Cho Javascript Với Jasmine

Blog có khá nhiều bài về code rồi nên hôm nay mình sẽ viết một bài để đổi gió.

1. Nhắc lại sơ về Unit Test

Trước khi có unit test, các lập trình viên thường code theo kiểu: code – test – fix lại – code tiếp – test lại – fix tiếp. Đôi khi chỉ vì sửa 1 lỗi nho nhỏ mà ta phải test lại rất nhiều lần. Để giải quyết vấn đề này, unit test và automation test ra đời. Mình không phải QA chuyên nghiệp nên không dám múa rìu qua mắt thợ, chỉ nói sơ về định nghĩa của 2 loại test này:

Unit test: Đây là test do developer viết, được chạy để kiểm tra các hàm do developer viết ra có sai hay ko. Unit test thường được chạy mỗi khi build để đảm bảo các hàm đều chạy đúng sau khi ta sửa code.

Automation test: Đây là test do QA viết, được chạy để kiểm thử hệ thống (Nếu không có automation test thì QA kiểm thử bằng tay, gọi làm manual test).

Bài viết này chỉ tập trung vào unit test. Đây là test mà developer chúng ta phải viết. Các thư viện thường dùng để viết unit test là jUnit (Java), nUnit (C#), thư viện test của Microsoft, … Một số khái niệm cần biết trong unit test:

Setup: Đây là hàm được chạy trước khi chạy các test case, thường dùng để khai báo dữ liệu, cài đặt các biến.

Teardown: Đây là hàm được chạy sau khi các test case chạy xong, thường dùng để xóa dữ liệu, giải phóng bộ nhớ.

Assert: Mỗi test case sẽ có 1 hoặc nhiều câu lệnh Assert, để kiểm tra tính đúng đắn của hàm. Vd: Assert.Equals(4, Add(2,2));

Mock: Giả sử chương trình của bạn được chia làm 2 module: A và B. Module A đã code xong, B thì chưa. Để test module A, ta dùng mock để làm giả module B, không cần phải đợi tới khi module B code xong mới test được.

2. Giới thiệu về Jasmine 3. Demo Jasmine

Để đơn giản, chúng ta sẽ tạo 1 file spec mới làm ví dụ, đặt tên là chúng tôi Ta sửa lại file html như sau:

function Calculator() { chúng tôi = function(a, b) { return a+b;}; this.minus = function(a, b) { return a-b;}; this.multiply = function(a, b) { return a*b;}; this.divide = function(a,b) {return a/b;} ; }

Một số unit test cộng trừ nhân chia

Hàm describe dùng để gom nhóm, ghi chú cho nhiều unit test.

Hàm it tương đương với 1 unit test.

Hàm expect chính là hàm assert để kiểm tra tính đúng đắn của unit test

describe("Cộng trừ", function() { var cal = new Calculator(); it("Một với một là hai", function() { expect(2).toBe(cal.add(1,1)); }); it("Hai với hai là bốn", function() { expect(4).toBe(cal.add(2,2)); }); it("Năm trừ hai bằng ba", function() { expect(3).toBe(cal.minus(5,2)); }); }); describe("Nhân chia", function() { var cal = new Calculator(); it("Năm nhân hai bằng mười", function() { expect(10).toBe(cal.multiply(5,2)); }); it("Sáu chia hai bằng ba", function() { expect(3).toBe(cal.divide(6,2)); }); });

Chạy lại file SpecRunner.html, ta được kết quả. Giả sử ta cố ý sửa lại cho hàm minus chạy sai, ta sẽ thấy unit test báo hàm sai như sau: Bài viết tới đây là kết thúc. Ở phần 2, mình sẽ hướng dẫn chi tiết hơn về cách dùng hàm setup, teardown và mock với Jasmine. Các bạn có thể tải code sample của bài viết này ở đây: https://github.com/conanak99/jasmine-sample.

Viết Unit Test Cho Spring Boot Application

Đầu tiên, mình sẽ tạo mới một ứng dụng Spring Boot đơn giản để làm ví dụ:

Class Hello:

Class này định nghĩa một method cho phép chúng ta truyền tên và nó sẽ return lại chuỗi “Hello” cộng với tên mà các bạn truyền vào.

Class Calculation:

Class này cho phép chúng ta tính tổng của 2 số.

Kết quả khi chạy chương trình này sẽ như sau:

Ý tưởng là chúng ta cần viết Unit Test để kiểm tra khi ứng dụng chạy, 2 bean của các class Hello và Calculation phải được khởi tạo trong Spring container và các method của chúng phải return đúng giá trị mà chúng ta mong muốn.

Để làm được điều này, trước tiên các bạn cần make sure là dependency của Spring Boot Test được khai báo trong trong tập tin chúng tôi của các bạn. Của mình khi tạo Spring Boot project sử dụng Spring Tool Suite, nó đã được include như sau:

Có thể các bạn sẽ thắc mắc tại sao mặc định khi tạo Spring Boot project, phần Spring Boot Starter Test này lại exclude thư viện junit-vintage-engine đi. Nguyên nhân là bởi vì junit-vintage-engine là cho JUnit 4 và JUnit 3, chúng ta nên sử dụng latest version của JUnit là JUnit 5. Với khai báo dependency cho JUnit 5 như sau:

Để viết Unit Test cho Spring Boot application, các bạn chỉ cần khai báo trong class Test một Annotation của Spring Boot Test @SpringBootTest là xong. Ví dụ:

Hay:

Class SpringBootUnitTestApplicationTests thì đã được thêm tự động rồi:

Với annotation @SpringBootTest này, Spring Boot Test sẽ tự động chạy một Spring container và khởi tạo các bean trong Spring container này trong lúc chúng ta chạy test.

Bean của các class nào sẽ được khởi tạo trong Spring container tuỳ thuộc vào cấu hình của chúng ta.

Nếu các bạn khai báo thêm annotation @ContextConfiguration với value là các class chứa định nghĩa thông tin bean thì chỉ những bean được định nghĩa trong các class này mới được khởi tạo.

Nếu các bạn không khai báo thêm annotation @ContextConfiguration thì Spring Boot Test sẽ tự động scan những class nào được khai báo với annotation @Configuration và được sử dụng với annotation @SpringBootConfiguration để khởi tạo bean.

Trong ví dụ của mình thì mình đang sử dụng cơ chế auto component scan để khởi tạo bean trong Spring, không khai báo bean một cách tường minh nên những bean này là được sử dụng với annotation @SpringBootConfiguration để khởi tạo.

Các bạn có thể thêm code test để kiểm tra các bean của các class Hello và Calculation phải được khởi tạo trong class SpringBootUnitTestApplicationTests như sau:

Test cho các class Hello và Calculation sẽ như sau:

Nếu các bạn chỉ muốn test class Hello, các bạn có thể tạo mới một class TestConfiguration với nội dung như sau:

Rồi sau đó sử dụng annotation @ContextConfiguration để khai báo class TestConfiguration này vào để viết test:

Trong trường hợp này, các bạn sẽ không thể lấy bean của class Calculation. Ví dụ:

Sẽ gặp lỗi ngay:

Tổng Hợp Các Bài Viết Về Unit Test Trong Java

Để dễ dàng cho các bạn theo dõi và tìm hiểu về cách viết Unit Test trong Java. Bài này mình sẽ tổng hợp lại toàn bộ các bài viết về cách viết Unit Test với JUnit + Mockito + PowerMockito.

Trong bài viết này sẽ giới thiệu cho các bạn biết về kiểm thử phần mềm (testing) trong phát triển phần mềm.

Kiểm thử (testing) là gì?

Ai sẽ là người test?

Thời điểm bắt đầu test

Khi nào thì dừng việc test

Phân loại Tesing

So sánh Manual Testing và Automation Testing

Bài này sẽ giới thiệu chi tiết hơn về cách viết Unit Testing và mô hình phát triển phần mềm hiện đại TDD (Test-Driven Development). Ngoài ra, chúng ta cũng sẽ biết được cách xây dựng UT với mô hình đối tượng ảo (Mock Object).

Sau khi đã nắm được các khái niệm về Unit test, TDD, chúng ta sẽ cùng tìm hiểu về cách viết Unit Test trong Java với JUnit Framework. Cách cài đặt và sử dụng JUnit test với Eclipse. Làm sao kiểm tra độ bao phủ của Unit Test với plugin EclEmma.

Một số Annotation cơ bản của JUnit

Tìm hiểu cách sử dụng một số Annotation cơ bản của JUnit như @Before, @After, @BeforeClass, @AfterClass, @Test, @Test(expected=XxxException.class), @Ignore, @FixMethodOrder. Hiểu về lifecycle của một Test Class trong JUnit. Cách viết test một exception, timeout.

Trong bài này, chúng ta sẽ cùng tìm hiểu một số API của JUnit như Assert, Test Runner (JUnitCore), Test Suite, Assume.

JUnit Assert Class : JUnit cung cấp các phương thức static để kiểm tra các điều kiện nhất định thông qua lớp Assert. Các phương thức này thường bắt đầu với assertXxx(). Nó cho phép chúng ta xác định thông báo lỗi (error message), kết quả mong đợi (expected) và kết quả thực tế (actual). Các phương thức Assert so sánh giá trị thực tế được trả về bởi một phương thức test với giá trị mong đợi, nó ném một AssertionException nếu so sánh thất bại.

JUnit Assume Class: Annotation @Ingore cho phép chúng ta sử dụng để đánh dấu phương thức này để được bỏ qua (ignore/ disable), không cần thực thi test. Một cách khác để làm việc này là sử dụng Assume.assumeXxx() để định nghĩa điều kiện Test.

Assume.assumeFalse() : đánh dấu test là không hợp lệ, nếu điều kiện của nó đánh giá là đúng.

Assume.assumeTrue() : đánh giá test là không hợp lệ nếu điều kiện của nó đánh giá là sai.

JUnit Test Runner : bình thường, các IDE như NetBeans, Eclipse đều có sẵn trình chạy (runner) cho JUnit để hiển thị kết quả các test case. Chúng ta có thể gọi một API được hỗ trợ từ JUnit để thực thi các class test một cách thủ công thông qua JUnitCore.

Thông thường một class test sẽ sử dụng để test cho một chức năng, một unit. Nếu chúng ta có một vài test class, và mong muốn có thể kết hợp chúng thành một nhóm/ bộ kiểm tra. Chúng ta có thể làm được điều này bằng cách sử dụng Test Suite hoặc Categories Test.

Trong bài viết này, chúng ta sẽ cùng tìm hiểu cách tạo và thực hiện các test case với tham số hóa trong Junit (parameterized test).

Rule (quy tắc) trong JUnit 4 là một thành phần cho phép chúng ta viết code để thực hiện một số công việc trước và sau khi phương thức test thực thi. Trong bài này, chúng ta sẽ cùng tìm hiểu một số Rule có sẵn trong JUnit 4 (TemporaryFolder Rule, TemporaryFolder Rule, …) và cách tự viết một custom rule.

Trong bài này, chúng ta sẽ cùng tìm hiểu Matcher là gì, cách cài đặt và sử dụng thư viện Hamcrest Matchers để verify các Collections, Number, XML, bean, number, text, object, …

Tiếp tục với thư viện Hamcrest Matchers, trong bài này chúng ta sẽ cùng tìm hiểu cách tự viết một Matcher cho riêng mình.

Đôi khi chúng ta gặp một số vấn đề ngoài ý muốn khi thực thi Unit test như lỗi kết nối internet, kết nối database, thiếu tài nguyên, … dẫn đến test case của chúng ta bị fail. Trong những trường hợp đó, chúng ta mong muốn có thể thực thi lại các test case một cách tự động. Nhưng bằng cách nào chúng ta có thể làm được điều này với JUnit? Chúng sẽ được giải đáp trong bài viết này.

Trong bài này chúng ta sẽ cùng tìm hiểu về JUnit Listener và cách để lắng nghe các sự kiện mỗi khi một test được thực thi trong JUnit.

Sau khi viết test và thực thi, chúng ta cũng cần xuất kết quả ra một file nào đó để dễ dàng theo dõi và báo cáo với xếp, với khách hàng. Chúng ta có thể thực hiện một cách tự động thông qua Surefire maven plugin, đây là một plugin của maven cho phép xuất báo cáo (report) kết quả test ra tập tin HTML.

Trong bài viết này, chúng ta sẽ nắm được:

Mokito là gì?

Phân loại Mock/ Test Double

Cài đặt Mockito

Sử dụng Mockito với JUnit Test

Trong bài viết này chúng ta sẽ cùng tìm hiểu một số Annotation của Mockito như @Mock, @Spy, @Captor, @InjectMocks để viết test cho các behavior.

: Annotation @Mock được sử dụng để khởi tạo một mock object và inject giá trị này cho field này. Chúng ta không tạo ra các đối tượng thực sự, thay vào đó yêu cầu Mockito tạo ra một đối tượng giả cho class này, các phương thức của class này không được thực thi thực sự, do đó trạng thái của đối tượng không bị thay đổi. : Annotation@Spy được sử dụng để wrap một object thật, có thể gọi xử lý thật sự ở object này, tuy nhiên chúng ta có thể spy một số phương thức trên đối tượng thật như với @Mock.@InjectMocks :

Trong một số trường hợp, chúng ta cần tạo một object test mà object này chứa các dependency khác. Vì vậy, chúng ta cần phải tạo các Mock/ Spy object cho các dependency và inject chúng vào đối tượng test. Để làm được điều này, chúng ta có thể sử dụng Annotation

@InjectMocks. @InjectMocks được sử dụng ở mức field, để đánh dấu các field này cần inject các dependency. Mokito cố gắng inject các giá trị cho các field này thông qua constructor, setter hoặc property injection. Nó sẽ không throw bất kỳ lỗi nào nếu không tìm được injection phù hợp.

Toàn bộ ý tưởng của việc tạo một mock object là có thể kiểm soát behavior của nó. Nếu một phương thức của mock được gọi, nó sẽ xử lý theo cách mà chúng ta có thể điều khiển được. Trong bài viết này, chúng ta sẽ cùng tìm hiểu các cách để điều khiển behavior của một đối tượng giả (mock object).

Một số kiến thức các bạn sẽ nhận được trong bài viết này:

Stubbing Methods sử dụng cấu trúc: when().thenXxx().

Stubbing Methods sử dụng cấu trúc: doXxx().when().

Argument matchers.

Khi viết Unit Test, chúng ta cần thực hiện một số Assert để xác nhận expected result và actual result là như nhau. Đối với các mock object, chúng ta cũng cần verify một vài behavior đã được gọi hay chưa. Trong Mockito, chúng ta có thể thực hiện verify các mock object thông qua phương thức Mockito.verfify().

Sau bài viết này các bạn sẽ biết được cách:

Verify số lần phương thức được gọi.

Verify các tham số (argument) của phương thức.

Verify thứ tự phương thức được gọi.

Verify thời gian thực thi (timeout).

PowerMock là một Java mock framework được sử dụng để giải quyết các vấn đề mà thường được coi là khó khăn hoặc thậm chí không thể viết Unit Test, chẳng hạn như static method, static class, final class, private method, contructor.

Trong bài viết này, chúng ta sẽ tìm hiểu về cách cài đặt và sử dụng PowerMockito để test một số trường hợp thường gây khó khăn trên.

Trong bài viết này chúng ta sẽ cùng tìm hiểu cách sử dụng PowerMockito để viết test cho một số trường hợp đặc biệt như các static initializer, constructor, method, … gọi đến các 3rd party hay nó chưa được implement.

Suppress own constructor – Tạo instance một class mà không gọi constructor của chính nó

Suppress super class constructor – Tạo instance của một class nhưng không gọi constructor của super class

Suppress method – Ngăn thực thi một phương thức

Suppress fields – Ngăn khởi tạo giá trị mặc định cho một field

Suppress static initializer – Ngăn khởi tạo giá trị cho static method, static block

Trong Java, các abstract class được sử dụng để định nghĩa các behavior có thể có của một class, với một danh sách các phương thức trừu tượng (abstract method) sẽ được implement bởi sub-class. Về cơ bản, nó cũng có thể bao gồm một vài phương thức đã được implement logic, do đó nó cũng cần được cover bởi Unit Test. Tuy nhiên, một abstract class không thể được khởi tạo instance một cách trực tiếp thông qua từ khóa new. Do đó, nó cũng cần một số cách đặt biệt để viết test, chúng ta sẽ cùng tìm hiểu trong bài viết này.

Một số trường hợp thường gặp:

Trường hợp test một abstract method độc lập.

Trường hợp test một abstract method được gọi bởi một method khác.

Link bài viết gốc: https://gpcoder.com/5486-tong-hop-cac-bai-viet-ve-unit-test-trong-java/

All Rights Reserved

Cập nhật thông tin chi tiết về Tìm Hiểu Về Jestjs, Viết Unit Test Cho Javascript 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!