Xem Nhiều 2/2023 #️ Test Javascript Code Với Jest # Top 7 Trend | Toiyeucogaihalan.com

Xem Nhiều 2/2023 # Test Javascript Code Với Jest # Top 7 Trend

Cập nhật thông tin chi tiết về Test Javascript Code Với Jest mới nhất trên website Toiyeucogaihalan.com. 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.

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;

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.

Unit Test Là Gì – Jest Testing Nodejs Cho Người Mới Bắt Đầu

Điều đầu tiên: Làm thế nào để biết phải test cái gì?

Testing có nghĩa là gì?

Trong ngành Công nghệ thông tin (CNTT) testing có nghĩa là kiểm tra code của chúng ta có đáp ứng kỳ vọng hay không . Ví dụ: một function có tên là Tổng sẽ trả về kết quả phép tính cộng một dãy số được người dùng nhập vào.

Có nhiều loại Testing và chẳng mấy chốc bạn sẽ bị choáng ngợp bởi thuật ngữ này, nhưng testing có ba loại chính :

Unit Testing

Integration Testing

UI Testing

Trong hướng dẫn sử dụng Jest lần này, sẽ chỉ đề cập đến Unit Testing

Jest là gì?

Jest là một thư viện JavaScript để tạo, chạy và cấu trúc test . Jest được phân phối dưới dạng NPM, bạn có thể cài đặt nó trong bất kỳ dự án JavaScript nào. Jest là một trong những thư viện test phổ biến nhất hiện nay và là lựa chọn mặc định cho việc tạo App React.

Điều đầu tiên: Làm thế nào để biết phải test cái gì?

Khi nói đến testing , ngay cả một đoạn code đơn giản cũng có thể làm tê liệt người mới bắt đầu. Câu hỏi phổ biến nhất là “Làm thế nào để biết phải test cái gì?” . 

Nếu bạn đang viết một Web-App, bạn sẽ kiểm tra mọi trang của App và mọi tương tác của người dùng. Nhưng các ứng dụng Web cũng được tạo thành từ các đoạn code như hàm(function) và mô-đun(modules) cũng cần được kiểm tra. Có hai trường hợp thông thường:

Thừa hưởng đoạn code mà không cần test

Phải thực hiện một chức năng mới 

Phải làm sao đối với cả hai trường hợp, bạn có thể tự giúp mình bằng cách nghĩ về các bài test như các bit của test xem function có return kết quả như mong muốn hay không . Đây là cách flow-test diễn ra:

Chọn function để testing

Nhập giá trị đầu vào ( input )

Xác định những gì mong đợi là đầu ra (output)

Test xem fucntion có return output mong muốn không

Flow-test đã diễn ra như vậy. Việc kiểm tra sẽ không còn đáng sợ nữa nếu bạn nghĩ theo các thuật ngữ sau: đầu vào( input ) – đầu ra dự kiến (expected output) – khẳng định kết quả(assert the result) . Trong một phút, chúng ta cũng sẽ thấy một tool tiện dụng để kiểm tra gần như chính xác những gì cần test. Và đó là Jest!

Setup the project NodeJS

Như mọi project JavaScript, bạn sẽ cần một môi trường NPM (đảm bảo đã cài đặt Node trên hệ thống của bạn). Tạo một thư mục mới và khởi tạo dự án với:

mkdir getting-started-with-jest && cd $_ npm init -y

Tiếp theo cài đặt Jest với:

npm i jest --save-dev

Chúng ta cũng hãy cấu hình NPM script để test từ dòng lệnh. Mở pack.json và cấu hình có tên “test” để chạy Jest:

"scripts": { "test": "jest" },

Thông số kĩ thuật (Specifications)  và phát triển hướng kiểm thử (test-driven development) NodeJS

Trong hướng dẫn này, chúng tôi đã có specifications khá đơn giản từ người quản lý dự án(project manager). Clients cần một fucntions JavaScript sẽ lọc một array các objects.

Theo mặc định, Jest dự kiến( expects ) ​​sẽ tìm thấy các files test trong thư mục tên là  tests  trong thư mục project. Tạo thư mục mới sau đó:

cd getting-started-with-jest mkdir __tests__

Tiếp theo, tạo một filei có tên là filterByTerm.spec.js bên trong tests . Tại sao có phần mở rộng “.spec.”. Đó là một quy ước mượn từ Ruby.

Và bây giờ chúng ta test nào!

Cấu trúc test và test fail lần đầu

Để tạo đoạn test Jest đầu tiên . Mở bộ lọc ByTerm.spec.js và tạo khối kiểm tra:

});

Tiếp theo, một chức năng khác gọi là test , đó là đoạn test thực tế:

}); });

Tại thời điểm này, chúng tôi để viết test. Hãy nhớ rằng, test là một vấn đề của  inputs, functions, và expected outputs . Trước tiên hãy xác định input, mảng của objects :

const input = [ { id: 1, url: “https://www.url1.dev” }, { id: 2, url: “https://www.url2.dev” }, { id: 3, url: “https://www.link3.dev” } ]; }); });

Tiếp theo, chúng tôi sẽ xác định  expected result. Theo thông số kỹ thuật, functions được test sẽ loại bỏ các objects có thuộc tính url không khớp với cụm từ tìm kiếm đã cho. Ví dụ, chúng ta có thể mong đợi array với objects, được đưa ra “link” làm thuật ngữ tìm kiếm:

const input = [ { id: 1, url: “https://www.url1.dev” }, { id: 2, url: “https://www.url2.dev” }, { id: 3, url: “https://www.link3.dev” } ]; const output = [{ id: 3, url: “https://www.link3.dev” }]; }); });

Và bây giờ chúng ta đã sẵn sàng để viết bài tes thực tế. Sẽ sử dụng  expect và matcher Jest để kiểm tra xem hàm giả tưởng (hiện tại) của chúng ta có trả về kết quả mong đợi khi được gọi không. Đây là đoạn test:

expect(filterByTerm(input, "link")).toEqual(output);

Để phân tích rõ hơn nữa đây là cách bạn sẽ gọi hàm trong code của mình:

filterByTerm(inputArr, "link");

Trong Jest, bọc chức năng bên trong expect kết hợp với matcher   (chức năng Jest để kiểm tra đầu ra) thực hiện test thực tế. Đây là đoạn test hoàn chỉnh:

const input = [ { id: 1, url: “https://www.url1.dev” }, { id: 2, url: “https://www.url2.dev” }, { id: 3, url: “https://www.link3.dev” } ]; const output = [{ id: 3, url: “https://www.link3.dev” }]; expect(filterByTerm(input, “link”)).toEqual(output); }); });

(Để tìm hiểu thêm về matchers Jest, hãy xem tài liệu ).

Bạn gõ lệnh :

npm test

Bạn sẽ thấy đoạn test fail

FAIL __tests__/filterByTerm.spec.js Filter function ✕ it should filter by a search term (2ms) ● Filter function › it should filter by a search term (link) ReferenceError: filterByTerm is not defined

“ReferenceError: filterByTerm is not defined”. Hiện lỗi rất chính xác . Hãy fix trong phần tiếp theo!

Fix đoạn test fail

Điều thực sự thiếu là việc triển khai filterByTerm . Để thuận tiện, chúng tôi sẽ tạo chức năng trong cùng một file nơi test tồn tại. Trong một dự án thực tế, bạn sẽ xác định hàm trong một file khác .

Để thực hiện bài kiểm tra, chúng tôi sẽ sử dụng một hàm JavaScript là  filter  có thể lọc các phần tử từ một array. Đây là cách gọi filterByTerm :

function filterByTerm(inputArr, searchTerm) { return inputArr.filter(function(arrayElement) { return arrayElement.url.match(searchTerm); }); }

Đây là cách nó hoạt động: đối với mỗi phần tử của mảng đầu vào, chúng ta kiểm tra thuộc tính “url”, khớp nó với biểu thức chính quy với  match  . Đây là code hoàn chỉnh:

function filterByTerm(inputArr, searchTerm) { return inputArr.filter(function(arrayElement) { return arrayElement.url.match(searchTerm); }); } const input = [ { id: 1, url: "https://www.url1.dev" }, { id: 2, url: "https://www.url2.dev" }, { id: 3, url: "https://www.link3.dev" } ]; const output = [{ id: 3, url: "https://www.link3.dev" }]; expect(filterByTerm(input, "link")).toEqual(output); }); });

Bây giờ test lần nữa:

npm test

và đã thành công

PASS __tests__/filterByTerm.spec.js Filter function ✓ it should filter by a search term (link) (4ms) Test Suites: 1 passed, 1 total Tests: 1 passed, 1 total Snapshots: 0 total Time: 0.836s, estimated 1s

Bạn đã làm rất tốt. Nhưng chúng ta đã test xong chưa? Tất nhiên là chưa. Chúng ta còn phải test trường hợp fail . Hãy nhấn mạnh chức năng với cụm từ tìm kiếm chữ hoa:

function filterByTerm(inputArr, searchTerm) { return inputArr.filter(function(arrayElement) { return arrayElement.url.match(searchTerm); }); } const input = [ { id: 1, url: "https://www.url1.dev" }, { id: 2, url: "https://www.url2.dev" }, { id: 3, url: "https://www.link3.dev" } ]; const output = [{ id: 3, url: "https://www.link3.dev" }]; expect(filterByTerm(input, "link")).toEqual(output); expect(filterByTerm(input, "LINK")).toEqual(output); }); });

Test … và fail. Chúng ta lại tiếp tục fix

Fix bug CHỮ HOA

filterByTerm cũng nên tính đến các cụm từ tìm kiếm chữ hoa. Nói cách khác, nó sẽ trả về các đối tượng phù hợp ngay cả khi cụm từ tìm kiếm là một chuỗi chữ hoa:

filterByTerm(inputArr, "link"); filterByTerm(inputArr, "LINK");

Để test chữa hoa, chúng tôi giới thiệu kiểu test mới:

expect(filterByTerm(input, "LINK")).toEqual(output);

Để thành công, chúng ta có thể điều chỉnh biểu thức được cung cấp để match :

return arrayElement.url.match(searchTerm);

Thay vì searchTerm ngay lập tức, chúng ta có thể xây dựng một biểu thức chính quy (regular expression) không phân biệt chữ hoa chữ thường , nghĩa là một biểu thức khớp với bất kể trường hợp nào của chuỗi. Đây là cách fix:

function filterByTerm(inputArr, searchTerm) { const regex = new RegExp(searchTerm, "i"); return inputArr.filter(function(arrayElement) { return arrayElement.url.match(regex); }); }

Và đây là đoạn code hoàn chỉnh:

const input = [ { id: 1, url: "https://www.url1.dev" }, { id: 2, url: "https://www.url2.dev" }, { id: 3, url: "https://www.link3.dev" } ]; const output = [{ id: 3, url: "https://www.link3.dev" }]; expect(filterByTerm(input, "link")).toEqual(output); expect(filterByTerm(input, "LINK")).toEqual(output); }); }); function filterByTerm(inputArr, searchTerm) { const regex = new RegExp(searchTerm, "i"); return inputArr.filter(function(arrayElement) { return arrayElement.url.match(regex); }); }

Test lại và thành công.

Bây giờ chúng ta thử viết một bài test khác với nội dung như sau

Test cụm từ tìm kiếm “uRl”

Test một cụm từ tìm kiếm rỗng

Trong phần tiếp theo, chúng ta sẽ thấy một điều quan trọng khác trong thử nghiệm:  code coverage (độ bao phủ mã ) .

Code coverage là gì?

Code coverage là gì ? Trước khi nói về nó, hãy điều chỉnh nhanh code. Tạo một thư mục mới bên trong project với tên là src và tạo một file có tên là  chúng tôi  nơi chúng ta sẽ đặt và xuất( export  ) hàm của chúng ta:

mkdir src && cd _$ touch filterByTerm.js

Đây là file chúng tôi  :

function filterByTerm(inputArr, searchTerm) { if (!searchTerm) throw Error("searchTerm cannot be empty"); const regex = new RegExp(searchTerm, "i"); return inputArr.filter(function(arrayElement) { return arrayElement.url.match(regex); }); } module.exports = filterByTerm;

Bây giờ hãy giả vờ tôi là một đồng nghiệp mới của bạn. Tôi không biết gì về testing và thay vì hỏi thêm , tôi đi thẳng vào hàm đó để thêm một câu lệnh if mới :

function filterByTerm(inputArr, searchTerm) { if (!searchTerm) throw Error("searchTerm cannot be empty"); if (!inputArr.length) throw Error("inputArr cannot be empty"); const regex = new RegExp(searchTerm, "i"); return inputArr.filter(function(arrayElement) { return arrayElement.url.match(regex); }); } module.exports = filterByTerm;

Có một dòng mã mới bên trong filterByTerm  và dường như nó sẽ không được test. 

Và đó được gọi là  code coverage  và nó là một tool mạnh mẽ. Jest có built-in code coverage  và bạn có thể sử dụng nó theo hai cách:

Bằng command line với flag “–coverage”

Bằng cách config Jest trong package .json

Trước khi test với code coverage , hãy đảm bảo đã import filterByTerm trong test chúng tôi :

const filterByTerm = require("../src/filterByTerm");

Save và test lại với coverage

npm test -- --coverage

Đây là những gì bạn thấy:

PASS __tests__/filterByTerm.spec.js Filter function ✓ it should filter by a search term (link) (3ms) ✓ it should filter by a search term (uRl) (1ms) ✓ it should throw when searchTerm is empty string (2ms) Test Suites: 1 passed, 1 total Tests: 3 passed, 3 total

Một bản tóm tắt của coverage cho chức năng của chúng ta. Như bạn có thể thấy dòng 3 không được bảo vệ. Cố gắng fix để được 100% bằng cách test statement mà tôi vừa thêm.

Nếu bạn muốn giữ phạm vi bảo hiểm mã luôn hoạt động, hãy cấu hình Jest trong package.json như vậy:

"scripts": { "test": "jest" }, "jest": { "collectCoverage": true },

Bạn cũng có thể gắn flag cho file test:

"scripts": { "test": "jest --coverage" },

Nếu bạn muốn dạng HTML

"scripts": { "test": "jest" }, "jest": { "collectCoverage": true, "coverageReporters": ["html"] },

Bây giờ mỗi khi bạn test npm, bạn có thể truy cập vào một thư mục mới có tên là  coverage  trong thư mục dự án của bạn: get-started-with-jest / coverage / . Trong thư mục đó, bạn sẽ tìm thấy một loạt các tệp trong đó /coverage/index.html là một bản tóm tắt HTML hoàn chỉnh về coverage :

Nếu bạn nhấp vào tên hàm, bạn cũng sẽ thấy đoạn code fail

Với coverage . Bạn sẽ có một bảng báo cáo chi tiết

Kết luận

Unit Test Với Junit 4X

Trong bài viết này chúng ta cùng tìm hiểu về test và unit test bằng JUnit 4.x.

1.1 Code under test

Những đoạn code được kiểm thử thường gọi code under test. Nếu bạn đang kiểm thử một ứng dụng nào đó thì nó được gọi là application under test.

1.2 Test fixture

Đây là các điều kiện để có thể bắt đầu kiểm thử. Ví dụ như là một đoạn String cố định được sử dụng để làm input cho một method nào đó. Chúng ta chỉ có thể kiểm thử nếu đoạn test đó có đầy đủ các thông số truyền vào.

1.3 Unit test và unit testing

Một unit test là một đoạn code nhỏ được viết bởi developer nhằm mục đích kiểm tra một hàm hay chức năng riêng biệt nào đó có kết quả đúng như kì vọng hay không. Tỉ lệ các đoạn code được kiểm tra bằng unit test được gọi là test coverage. Phạm vi kiểm tra của một unit test thường là một method hoặc một class. Những method hay class có phụ thuộc lẫn nhau nên được tách biệt ra khi viết unit test. Vì vậy, unit test không phù hợp để kiểm thử những interface phức tạp hoặc một component. Chúng ta nên sử dụng integration test cho những phạm vi lớn và phức tạp này.

1.4 Integration test

Một kiểm thử tích hợp (integration test) có nhiệm vụ kiểm tra hoạt động của một component hoặc một tập hợp các component. Loại kiểm thử này còn được biết đến với cái tên funtional test.

Integration test sẽ kiểm tra toàn bộ hệ thống có làm việc như mong muốn không, do đó chúng giúp làm giảm các công việc kiểm thử thủ công.

1.5 Performance test

Kiểm thử hiệu năng được sử dụng để đánh giá các thành phần trong phần mềm được dùng đi dùng lại nhiều lần. Mục đích là để kiểm tra khả năng chịu tải cao, tốc độ tải trong điều kiện nhiều request.

1.6 Behavior và state testing

Một đoạn test được gọi là behavior test nếu nó kiểm tra các phương thức với các parameter truyền vào là chính xác và không quan tâm đến kết quả trả về là gì. Một đoạn test được gọi là state testing nếu nó validate kết quả trả về.

1.7 Testing framework

Trong java thì chúng ta có một vài framework hỗ trợ việc kiểm thử. Tiêu biểu nhất là JUnit và TestNG. Trong bài viết này chúng ta sẽ tìm hiểu về JUnit 4.x.

1.8 Những đoạn test nên đặt ở đâu?

Thông thường thì các đoạn unit test sẽ được tạo trong một folder hoặc một package riêng, tránh lẫn lộn với những đoạn code chính. Theo chuẩn build project của Maven và Gradle thì

src/main/java là nơi chứa Java class

src/test/java là nơi chứa test class.

Cung cấp Annotation để xác định việc xác thực phương thức.

Cung cấp Asertion cho kết quả mong muốn.

Cung cấp các Runner cho việc chạy thử.

Giúp viết code nhanh hơn mà chất lượng ngày càng tăng.

@Test – Đánh dấu một method là một method dùng để kiểm thử.

@Before và @After : đánh dấu vị trí bắt đầu và kết thúc của một method test trong một class.

@BeforeClass và AfterClass: Đánh dấu method chạy đầu tiên và cuối cùng trong một class test.

@Ignore hoặc @Ignore("Why disabled"): đánh dấu đoạn test nên được disabled. Nó được sử dụng khi các đoạn code chính đã được thay đổi nhưng các test case chưa được cập nhật hoặc điều chỉnh hoặc thời gian thực thi quá lâu nếu phải bao gồm cả nó. Tốt nhất là nên kèm theo giải thích tại sao lại disabled khi sử dụng annotation này.

@Test(timeout=100): Đoạn test sẽ được đánh là thất bại nếu thời gian thực thi lớn hơn 100 miliseconds.

Ví dụ:

public class SampleTest { @BeforeClass public static void setUpBeforeClass() throws Exception {

Khi chạy đoạn code trên thì thứ tự thực thi sẽ là:

Method được đánh dấu @BeforeClass.

Method được đánh dấu @Before.

Method kiểm thử đầu tiên được đánh dấu @Test (ở đây là test1()).

Method được đánh dấu @After.

Method được đánh dấu @Before.

Method kiểm thử thứ hai được đánh dấu @Test ( ở đây là test2()).

Method được đánh dấu @After.

Method được đánh dấu @AfterClass.

# 4. Assertions Khi muốn xác nhận một kết quả trả về có đúng như mong muốn không, chúng ta có danh sách Junit assertion cũ như sau:

org.junit.Assert.assertArrayEquals

org.junit.Assert.assertEquals

org.junit.Assert.assertFalse

org.junit.Assert.assertNotNull

org.junit.Assert.assertNotSame

org.junit.Assert.assertNull

org.junit.Assert.assertSame

org.junit.Assert.assertTrue

Từ phiên bản JUnit4, chúng ta có thêm một method org.junit.Assert.assertThat cho phép sử dụng các matcher để xác nhận tốt hơn:

Dễ đọc hơn

assertThat(actual, is(equalTo(expected))); dễ đọc hơn assertEquals(expected, actual);

assertThat(actual, is(not(equalTo(expected)))); tốt hơnassertFalse(expected.equals(actual));

Thông báo lỗi tốt hơn

Linh hoạt hơn

Có thể sử dụng nhiều điều kiện để assert bằng cách dùng các matcher như anyOf hay allOf.

Nếu phương thức bạn cần kiểm thử có throw các exceptions thì chúng ta cũng có vài cách để kiểm tra xem nó có throw đúng như trong điều kiện mong muốn không. Ví dụ như chúng ta tạo một phương thức để đọc file và nó sẽ trả về một exception với message “The file ${file_name} does not exit!” trong trường hợp không tìm thấy file đó.

@Test(expected = FileNotFoundException.class) public void testReadFile() throws IOException { FileReader reader = new FileReader("test.txt"); reader.read(); reader.close(); } @Test public void testReadFile2() { try { FileReader reader = new FileReader("test.txt"); reader.read(); reader.close(); fail("Expected an IOException to be thrown"); } catch (IOException e) { assertThat(e.getMessage(), is("test.txt (No such file or directory)")); } } @Rule public ExpectedException thrown = ExpectedException.none(); @Test public void testReadFile3() throws IOException { thrown.expect(IOException.class); thrown.expectMessage(startsWith("test.txt (No such file or directory)")); FileReader reader = new FileReader("test.txt"); reader.read(); reader.close(); }

Thông thường chúng ta cần kiểm tra một method đơn với nhiều loại data test khác nhau hoặc nhiều input khác nhau. Trong trường hợp này chúng ta có Parameterized để thực hiện kiểm thử một cách dễ dàng và dễ đọc.

https://javacodehouse.com/blog/junit-tutorial/ http://www.vogella.com/tutorials/JUnit/article.html

Bạn đang xem bài viết Test Javascript Code Với Jest trên website Toiyeucogaihalan.com. 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. Chúc bạn một ngày tốt lành!