Kiểm thử đơn vị là phương pháp kiểm tra các đơn vị hoặc thành phần riêng lẻ của phần mềm để đảm bảo rằng chúng hoạt động như dự định. Trong ngữ cảnh của JavaScript, điều này thường đề cập đến việc kiểm tra các chức năng hoặc mô-đun riêng lẻ.
Thử nghiệm đơn vị rất quan trọng vì nó cho phép các nhà phát triển bắt lỗi sớm trong quá trình phát triển, trước khi chúng đi vào sản phẩm cuối cùng. Điều này có thể tiết kiệm rất nhiều thời gian và công sức, vì sửa lỗi trong một đơn vị mã thường đơn giản hơn nhiều so với sửa lỗi lan rộng trong toàn bộ ứng dụng. Ngoài ra, các bài kiểm tra đơn vị đóng vai trò là một dạng tài liệu cho mã, vì chúng cung cấp các ví dụ về cách sử dụng mã.
Tại sao Node.js Express lại tốt cho Unit Testing
Node.js là một môi trường thời gian chạy phổ biến để xây dựng các ứng dụng phía máy chủ và Express là một khung phổ biến để xây dựng các ứng dụng web trên Node.js. Cả Node.js và Express đều cung cấp một số tính năng phù hợp để thử nghiệm đơn vị, bao gồm:
- Thực thi mã không đồng bộ: Node.js và JavaScript rất phù hợp để xử lý mã không đồng bộ, giúp viết các bài kiểm tra dễ dàng hơn mà không chặn việc thực thi các bài kiểm tra khác.
- Thiết kế mô-đun: Node.js và Express đều dựa trên thiết kế mô-đun, giúp dễ dàng kiểm tra các thành phần riêng lẻ của ứng dụng một cách độc lập.
- Một số lượng lớn khung thử nghiệm: Hệ sinh thái JavaScript có một số lượng lớn khung thử nghiệm, chẳng hạn như Jest, Mocha và Chai, được thiết kế đặc biệt để hỗ trợ thử nghiệm đơn vị.
Ví dụ về Kiểm tra đơn vị với Node.js Express hoặc JavaScript
Dưới đây là một số ví dụ về thử nghiệm đơn vị, cùng với các mẫu mã, để minh họa cách thử nghiệm đơn vị có thể được áp dụng trong các tình huống khác nhau.
1. Kiểm tra hàm thực hiện phép tính:
1 2 3 4 5 6 7 | <span class="token keyword">const</span> <span class="token function-variable function">add</span> <span class="token operator">=</span> <span class="token punctuation">(</span> <span class="token parameter">a <span class="token punctuation">,</span> b</span> <span class="token punctuation">)</span> <span class="token operator">=></span> a <span class="token operator">+</span> b <span class="token punctuation">;</span> <span class="token function">test</span> <span class="token punctuation">(</span> <span class="token string">"add"</span> <span class="token punctuation">,</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token function">expect</span> <span class="token punctuation">(</span> <span class="token function">add</span> <span class="token punctuation">(</span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token number">2</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">toBe</span> <span class="token punctuation">(</span> <span class="token number">3</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token function">expect</span> <span class="token punctuation">(</span> <span class="token function">add</span> <span class="token punctuation">(</span> <span class="token operator">-</span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token operator">-</span> <span class="token number">2</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">toBe</span> <span class="token punctuation">(</span> <span class="token operator">-</span> <span class="token number">3</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
2. Kiểm tra chức năng thực hiện lệnh gọi API:
1 2 3 4 5 6 7 8 9 10 11 | <span class="token keyword">const</span> <span class="token function-variable function">fetchData</span> <span class="token operator">=</span> <span class="token keyword">async</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token keyword">const</span> response <span class="token operator">=</span> <span class="token keyword">await</span> axios <span class="token punctuation">.</span> <span class="token function">get</span> <span class="token punctuation">(</span> <span class="token string">"https://example.com/data"</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">return</span> response <span class="token punctuation">.</span> data <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">;</span> <span class="token function">test</span> <span class="token punctuation">(</span> <span class="token string">"fetchData"</span> <span class="token punctuation">,</span> <span class="token keyword">async</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token keyword">const</span> data <span class="token operator">=</span> <span class="token keyword">await</span> <span class="token function">fetchData</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token function">expect</span> <span class="token punctuation">(</span> data <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">toBeDefined</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token function">expect</span> <span class="token punctuation">(</span> data <span class="token punctuation">.</span> length <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">toBeGreaterThan</span> <span class="token punctuation">(</span> <span class="token number">0</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
3. Kiểm tra chức năng truy cập cơ sở dữ liệu:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <span class="token keyword">const</span> <span class="token function-variable function">getUser</span> <span class="token operator">=</span> <span class="token keyword">async</span> <span class="token punctuation">(</span> <span class="token parameter">id</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token keyword">const</span> client <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">pg <span class="token punctuation">.</span> Client</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">await</span> client <span class="token punctuation">.</span> <span class="token function">connect</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> result <span class="token operator">=</span> <span class="token keyword">await</span> client <span class="token punctuation">.</span> <span class="token function">query</span> <span class="token punctuation">(</span> <span class="token string">"SELECT * FROM users WHERE id = $1"</span> <span class="token punctuation">,</span> <span class="token punctuation">[</span> id <span class="token punctuation">]</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">await</span> client <span class="token punctuation">.</span> <span class="token function">end</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">return</span> result <span class="token punctuation">.</span> rows <span class="token punctuation">[</span> <span class="token number">0</span> <span class="token punctuation">]</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">;</span> <span class="token function">test</span> <span class="token punctuation">(</span> <span class="token string">"getUser"</span> <span class="token punctuation">,</span> <span class="token keyword">async</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token keyword">const</span> user <span class="token operator">=</span> <span class="token keyword">await</span> <span class="token function">getUser</span> <span class="token punctuation">(</span> <span class="token number">1</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token function">expect</span> <span class="token punctuation">(</span> user <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">toBeDefined</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token function">expect</span> <span class="token punctuation">(</span> user <span class="token punctuation">.</span> name <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">toBe</span> <span class="token punctuation">(</span> <span class="token string">"John Doe"</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
4. Kiểm tra chức năng xử lý tệp zip:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <span class="token keyword">const</span> <span class="token function-variable function">processZip</span> <span class="token operator">=</span> <span class="token keyword">async</span> <span class="token punctuation">(</span> <span class="token parameter">file</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token keyword">const</span> zip <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">AdmZip</span> <span class="token punctuation">(</span> file <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> zipEntries <span class="token operator">=</span> zip <span class="token punctuation">.</span> <span class="token function">getEntries</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> data <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token punctuation">]</span> <span class="token punctuation">;</span> zipEntries <span class="token punctuation">.</span> <span class="token function">forEach</span> <span class="token punctuation">(</span> <span class="token punctuation">(</span> <span class="token parameter">zipEntry</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> <span class="token operator">!</span> zipEntry <span class="token punctuation">.</span> isDirectory <span class="token punctuation">)</span> <span class="token punctuation">{</span> data <span class="token punctuation">.</span> <span class="token function">push</span> <span class="token punctuation">(</span> zip <span class="token punctuation">.</span> <span class="token function">readAsText</span> <span class="token punctuation">(</span> zipEntry <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">return</span> data <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">;</span> <span class="token function">test</span> <span class="token punctuation">(</span> <span class="token string">"processZip"</span> <span class="token punctuation">,</span> <span class="token keyword">async</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token keyword">const</span> file <span class="token operator">=</span> fs <span class="token punctuation">.</span> <span class="token function">readFileSync</span> <span class="token punctuation">(</span> <span class="token string">"example.zip"</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> data <span class="token operator">=</span> <span class="token keyword">await</span> <span class="token function">processZip</span> <span class="token punctuation">(</span> file <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token function">expect</span> <span class="token punctuation">(</span> data <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">toBeDefined</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token function">expect</span> <span class="token punctuation">(</span> data <span class="token punctuation">.</span> length <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">toBeGreaterThan</span> <span class="token punctuation">(</span> <span class="token number">0</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token function">expect</span> <span class="token punctuation">(</span> data <span class="token punctuation">[</span> <span class="token number">0</span> <span class="token punctuation">]</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">toEqual</span> <span class="token punctuation">(</span> <span class="token string">"Example Data"</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
5. Kiểm tra chức năng xử lý dữ liệu tới postgresDB và kiểm tra xem dữ liệu có được tải lên chính xác không.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <span class="token keyword">const</span> <span class="token function-variable function">processData</span> <span class="token operator">=</span> <span class="token keyword">async</span> <span class="token punctuation">(</span> <span class="token parameter">data</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token keyword">const</span> client <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">pg <span class="token punctuation">.</span> Client</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">await</span> client <span class="token punctuation">.</span> <span class="token function">connect</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">await</span> client <span class="token punctuation">.</span> <span class="token function">query</span> <span class="token punctuation">(</span> <span class="token string">"INSERT INTO mytable (data) VALUES ($1)"</span> <span class="token punctuation">,</span> <span class="token punctuation">[</span> data <span class="token punctuation">]</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> result <span class="token operator">=</span> <span class="token keyword">await</span> client <span class="token punctuation">.</span> <span class="token function">query</span> <span class="token punctuation">(</span> <span class="token string">"SELECT * FROM mytable WHERE data = $1"</span> <span class="token punctuation">,</span> <span class="token punctuation">[</span> data <span class="token punctuation">]</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">await</span> client <span class="token punctuation">.</span> <span class="token function">end</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">return</span> result <span class="token punctuation">.</span> rows <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">;</span> <span class="token function">test</span> <span class="token punctuation">(</span> <span class="token string">"processData"</span> <span class="token punctuation">,</span> <span class="token keyword">async</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token keyword">const</span> data <span class="token operator">=</span> <span class="token string">"Example Data"</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> result <span class="token operator">=</span> <span class="token keyword">await</span> <span class="token function">processData</span> <span class="token punctuation">(</span> data <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token function">expect</span> <span class="token punctuation">(</span> result <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">toBeDefined</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token function">expect</span> <span class="token punctuation">(</span> result <span class="token punctuation">.</span> length <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">toEqual</span> <span class="token punctuation">(</span> <span class="token number">1</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token function">expect</span> <span class="token punctuation">(</span> result <span class="token punctuation">[</span> <span class="token number">0</span> <span class="token punctuation">]</span> <span class="token punctuation">.</span> data <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">toEqual</span> <span class="token punctuation">(</span> data <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
Phần kết luận
Kiểm tra đơn vị là một phần quan trọng của quá trình phát triển có thể tiết kiệm rất nhiều thời gian và công sức bằng cách phát hiện lỗi sớm. Với JavaScript, việc bắt đầu thử nghiệm đơn vị tương đối đơn giản và bạn có thể sử dụng nhiều khung khác nhau như Jest, Mocha và Chai để giúp bạn. Những ví dụ này cho thấy cách bạn có thể kiểm tra các chức năng khác nhau của ứng dụng bằng Node.js Express hoặc JavaScript.
Và cuối cùng
Như mọi khi, tôi hy vọng bạn thích bài viết này và học được điều gì đó mới. Xin cảm ơn và hẹn gặp lại các bạn trong những bài viết tiếp theo!
Nếu các bạn thích bài viết này thì hãy cho mình 1 like và subscribe để ủng hộ mình nhé. Cảm ơn bạn.