Mở đầu — vì sao bài này quan trọng
Hãy tưởng tượng bạn là QA tại một công ty fintech ở TP.HCM. Mỗi sáng, trước khi lập trình viên bắt đầu code, bạn muốn chắc chắn rằng 120 API của hệ thống thanh toán vẫn hoạt động đúng sau đợt deploy đêm qua. Nếu phải mở Postman, chọn từng collection, bấm "Run" thủ công rồi ngồi đọc kết quả, bạn sẽ mất cả buổi sáng — và tệ hơn, không ai chạy được bộ test đó ngoài chính bạn.
Đây chính là ranh giới giữa một tester "bấm nút" và một tester biết tự động hóa. Postman là công cụ tuyệt vời để thiết kế và thử nghiệm API bằng giao diện, nhưng bản thân nó là ứng dụng desktop — nó không sống được bên trong máy chủ build, không chạy được lúc 2 giờ sáng khi không có ai ngồi trước màn hình. Để đưa những bài test bạn đã dày công viết vào pipeline CI/CD (Continuous Integration / Continuous Delivery — tích hợp và giao hàng liên tục), bạn cần một công cụ chạy được trên dòng lệnh, không cần giao diện. Đó là Newman.
Bài học này giới thiệu Newman ở tầm nhìn tổng quan: nó là gì, vì sao nó là "chiếc cầu" nối Postman với thế giới tự động hóa, và tư duy cần có khi đưa API test vào quy trình phát triển phần mềm hiện đại. Các bài sau trong khóa sẽ đào sâu từng khía cạnh (reporter, data-driven, GitHub Actions, GitLab, Docker...), còn bài này giúp bạn nắm được bức tranh lớn để không bị lạc.
Khái niệm cốt lõi
Newman là gì
Newman là command-line collection runner chính thức của Postman. Nói đơn giản: nó là "Postman không có giao diện". Bạn xuất một collection từ Postman ra file JSON, đưa file đó cho Newman, và Newman sẽ lần lượt gửi từng request, chạy toàn bộ pre-request script và test script y hệt như khi bạn bấm "Run" trong app — nhưng tất cả diễn ra trên terminal.
Vì Newman là một package Node.js (cài qua npm), nó chạy được ở bất cứ nơi nào có Node: máy tính của bạn, máy chủ Jenkins, runner của GitHub Actions, một container Docker trong Kubernetes. Chính khả năng "chạy ở khắp nơi" này biến nó thành mắt xích không thể thiếu của tự động hóa.
Điểm cực kỳ quan trọng: Newman tái sử dụng 100% công sức bạn bỏ ra trong Postman. Mọi assertion pm.test(...), mọi biến môi trường, mọi logic chuỗi request — tất cả giữ nguyên. Bạn không phải viết lại test bằng ngôn ngữ khác. Đây là lý do nhiều đội QA chọn con đường Postman + Newman thay vì viết test API thuần bằng code từ đầu.
CI/CD — và vị trí của Newman trong đó
CI/CD là quy trình mà mỗi khi lập trình viên đẩy code lên, một hệ thống tự động sẽ build, kiểm thử, và (nếu đạt) triển khai. Mục tiêu là phát hiện lỗi càng sớm càng tốt, thay vì để lỗi trôi ra tận production.
Trong pipeline đó, test thường chia thành nhiều tầng: unit test (do dev viết, chạy nhanh nhất), rồi đến API/integration test — và đây chính là chỗ Newman tỏa sáng. Sau khi service được build và deploy lên môi trường staging, pipeline gọi Newman chạy collection để xác nhận các endpoint thật sự hoạt động đúng với nhau. Nếu một test fail, Newman trả về exit code khác 0, và pipeline hiểu ngay đây là tín hiệu "dừng lại, có lỗi" — chặn không cho code lỗi đi tiếp.
Exit code — linh hồn của tự động hóa
Nếu chỉ nhớ một điều từ bài này, hãy nhớ khái niệm exit code. Mọi chương trình dòng lệnh khi kết thúc đều trả về một con số: 0 nghĩa là thành công, khác 0 nghĩa là thất bại. Các hệ thống CI đọc chính con số này để quyết định pipeline nên "xanh" (pass) hay "đỏ" (fail).
Newman được thiết kế để tuân thủ đúng quy ước này: nếu bất kỳ assertion nào fail, hoặc một request nào đó gặp lỗi mạng, Newman thoát với exit code 1. Nhờ vậy bạn không cần viết logic phức tạp để "đọc kết quả" — chỉ cần đặt lệnh newman run vào pipeline, và hệ thống CI tự hiểu. Đây là điều Postman GUI không làm được, và là lý do cốt lõi vì sao ta cần Newman.
Tình huống thực tế
Ví dụ 1 — Tiki và cơn ác mộng "test thủ công trước mỗi lần release"
Giả sử một đội QA gồm 4 người tại một sàn thương mại điện tử lớn như Tiki. Trước đây, quy trình release của họ như sau: dev deploy lên staging, sau đó cả đội QA cùng mở Postman, mỗi người "gánh" một nhóm API (giỏ hàng, thanh toán, tồn kho, khuyến mãi) rồi bấm chạy thủ công. Mỗi lần smoke test như vậy tốn khoảng 90 phút và phụ thuộc hoàn toàn vào việc có đủ người rảnh hay không. Có lần release vào tối thứ Sáu, chỉ 1 người trực, và một API tính phí ship bị lỗi đã lọt ra production suốt cuối tuần.
Sau khi áp dụng Newman, họ xuất toàn bộ collection ra file, đặt một lệnh newman run chạy ngay sau bước deploy staging. Giờ đây, 90 phút kiểm thử thủ công rút xuống còn khoảng 4 phút chạy tự động, và chạy được bất kể ngày đêm, không cần người ngồi canh. Quan trọng hơn: kết quả nhất quán, không còn cảnh "người này quên test cái kia".
Bài học rút ra: Giá trị đầu tiên của Newman không phải là chạy nhanh hơn, mà là biến bộ test thành thứ chạy được mà không cần con người — nền tảng của mọi tự động hóa.
Ví dụ 2 — Startup fintech và "quality gate" chặn code lỗi
Một startup ví điện tử ở Hà Nội có khoảng 15 lập trình viên, mỗi ngày đẩy hàng chục pull request. Trước đây, họ chỉ chạy unit test trong CI, còn API integration test thì để QA làm sau — nghĩa là code có thể merge trước, lỗi tích hợp phát hiện sau. Kết quả: trung bình mỗi tuần có 2-3 lần "vỡ trận" khi hai service không nói chuyện được với nhau.
Họ quyết định biến Newman thành một quality gate (cổng chất lượng). Trong pipeline, sau khi service được dựng lên, Newman chạy một collection gồm khoảng 40 request kiểm tra các luồng quan trọng: tạo tài khoản, nạp tiền, chuyển tiền, kiểm tra số dư. Nếu chỉ một assertion fail — ví dụ số dư sau chuyển tiền không khớp — Newman trả exit code 1, pipeline chuyển đỏ, và pull request bị chặn không cho merge. Lập trình viên buộc phải sửa trước khi đi tiếp.
Sau ba tháng, số sự cố tích hợp phát hiện ở production giảm rõ rệt vì phần lớn bị bắt ngay ở tầng CI. Điều thú vị: chính các lập trình viên bắt đầu quan tâm đến collection của QA, vì "cái test đó đang chặn code của tôi".
Bài học rút ra: Newman đưa API test từ vai trò "kiểm tra sau khi xong" lên thành rào chắn tự động trong quy trình, giúp lỗi bị bắt trước khi kịp gây hại.
Ví dụ 3 — Agency và bài toán "chạy được trên máy của mọi người"
Một agency phần mềm ở Đà Nẵng nhận làm dự án cho khách nước ngoài, có nhiều dev và tester luân chuyển giữa các dự án. Vấn đề của họ: bộ test API "sống" trong Postman trên máy một bạn QA, và mỗi khi bạn ấy nghỉ phép, không ai chạy được. Test bị phụ thuộc vào cá nhân.
Giải pháp là commit file collection và file environment vào chính repository của dự án, cạnh source code. Bất kỳ ai — dev hay tester — chỉ cần git clone về, chạy một lệnh newman run là có ngay kết quả kiểm thử API đầy đủ, không cần cài Postman, không cần import gì thủ công. Test trở thành tài sản chung của cả đội, được version control cùng code.
Bài học rút ra: Khi Newman đọc collection từ file trong repo, bộ test API không còn là "của một người" mà trở thành một phần của codebase — minh bạch, chia sẻ được, và tiến hóa cùng dự án.
Hướng dẫn từng bước
Dưới đây là con đường tối thiểu để đưa collection của bạn ra chạy được trên dòng lệnh.
Bước 1 — Cài Node.js và Newman. Newman cần Node.js (khuyến nghị bản LTS). Sau khi có Node, cài Newman toàn cục:
npm install -g newmanKiểm tra cài đặt thành công
newman --version
Bước 2 — Xuất collection từ Postman. Trong Postman, chọn collection cần chạy, bấm dấu ... → Export, chọn định dạng Collection v2.1 và lưu ra file, ví dụ ecommerce-api.postman_collection.json. Nếu collection dùng biến môi trường, vào tab Environments, xuất luôn file environment tương ứng (ví dụ staging.postman_environment.json).
Bước 3 — Chạy collection cơ bản. Đưa file cho Newman:
newman run ecommerce-api.postman_collection.json
Newman sẽ in ra terminal từng request, kết quả từng assertion (dấu ✓ hoặc ✗) và một bảng tổng kết ở cuối.
Bước 4 — Chạy kèm environment. Hầu hết trường hợp thực tế bạn cần truyền environment để có base_url, token, v.v.:
newman run ecommerce-api.postman_collection.json \
--environment staging.postman_environment.json
Bước 5 — Kiểm tra exit code. Đây là bước "chạm vào linh hồn" của tự động hóa. Sau khi chạy, kiểm tra:
newman run ecommerce-api.postman_collection.json \
--environment staging.postman_environment.json
echo "Exit code: $?"
Nếu tất cả pass, bạn thấy Exit code: 0. Cố tình làm một test fail (ví dụ sửa một biến để URL sai), bạn sẽ thấy Exit code: 1. Chính con số này là thứ CI đọc để quyết định pass/fail.
Bước 6 — Đưa vào pipeline CI. Bản chất, mọi hệ thống CI (GitHub Actions, GitLab CI, Jenkins...) chỉ là "chạy lệnh shell theo kịch bản". Vậy nên đưa Newman vào CI đơn giản là đảm bảo runner có Node, cài Newman, rồi gọi đúng lệnh newman run. Ví dụ khái niệm một job tối giản:
npm install -g newman
newman run ecommerce-api.postman_collection.json \
--environment staging.postman_environment.json
Nếu lệnh cuối trả exit code khác 0, CI tự động đánh dấu job thất bại. Bạn không cần làm gì thêm — đó là toàn bộ "phép màu". Chi tiết cấu hình từng nền tảng cụ thể (GitHub Actions, GitLab, Jenkins, Docker) sẽ được đào sâu ở các bài sau; ở đây bạn chỉ cần hiểu rằng nguyên lý luôn là ba bước: cài Node → cài Newman → chạy và để exit code nói chuyện.
Lỗi thường gặp & mẹo
Quên truyền environment. Đây là lỗi số một của người mới. Collection chạy ngon trong Postman nhưng khi đưa qua Newman thì hàng loạt request lỗi Invalid URL hoặc 401. Nguyên nhân: các biến như {{base_url}}, {{token}} thực chất nằm trong environment, mà bạn quên truyền --environment. Newman không tự biết environment nào đang "active" như Postman GUI. Luôn xuất và truyền environment kèm theo.
Tưởng CI "xanh" là mọi thứ ổn, nhưng test không thực sự chạy. Một cái bẫy tinh vi: nếu bạn gọi Newman sai cách hoặc bọc lệnh trong một script "nuốt" mất exit code, CI có thể báo pass dù test đã fail. Mẹo: trong giai đoạn đầu, luôn echo "Exit code: $?" để tự tay xác nhận Newman thật sự trả đúng tín hiệu. Và hãy cố tình để một test fail một lần, xem CI có chuyển đỏ không — nếu không đỏ, quality gate của bạn là giả.
Không cố định phiên bản Newman. Cài newman mà không ghim version thì mỗi lần CI chạy có thể kéo về bản mới, đôi khi làm hành vi thay đổi. Trong dự án nghiêm túc, nên đưa Newman vào package.json với version cụ thể (cài local npm install newman@x.y.z --save-dev) để đảm bảo tính lặp lại — máy nào chạy cũng ra kết quả như nhau.
Chạy test viết dính với môi trường của một người. Nếu collection của bạn có test kiểu "kỳ vọng có đúng user ID 42 trong database", nó sẽ pass trên máy bạn và fail trên CI vì dữ liệu khác nhau. Mẹo: viết test độc lập với dữ liệu cứng — tạo dữ liệu trong chính luồng request (chained request) rồi kiểm tra, thay vì phụ thuộc dữ liệu có sẵn.
Bỏ quên timeout với API chậm. Trên môi trường staging tải nặng, một số request có thể chậm hơn máy local. Newman có cờ điều chỉnh timeout (ví dụ --timeout-request) để tránh fail oan vì mạng chậm. Đừng để một quality gate trở nên "hay báo động giả" khiến cả đội mất niềm tin và bắt đầu bỏ qua nó — một quality gate bị phớt lờ còn tệ hơn không có.
Mẹo tổ chức: đặt lệnh Newman vào một script trong package.json (ví dụ npm run test:api) để cả người và CI dùng chung một câu lệnh. Vừa gọn, vừa tránh mỗi nơi gõ một kiểu.
Bài tập thực hành
- Cài đặt và chạy đầu tiên. Cài Newman toàn cục, tạo một collection nhỏ trong Postman gồm 3 request tới một API công khai (ví dụ một API thời tiết hoặc
httpbin.org), mỗi request có ít nhất mộtpm.testkiểm tra status code 200. Xuất collection ra file và chạy bằngnewman run. Quan sát bảng tổng kết cuối cùng.
- Chơi với exit code. Chạy collection ở bài 1 kèm
echo "Exit code: $?". Ghi lại con số. Sau đó cố tình sửa một test thành kỳ vọng sai (ví dụ mong đợi status 500), chạy lại và ghi lại exit code. Viết ra 2-3 câu giải thích vì sao sự khác biệt giữa0và1này chính là thứ khiến CI hoạt động được.
- Tách environment. Thêm một biến
{{base_url}}vào các request, đưa giá trị thật vào một environment, xuất environment ra file. Chạy Newman một lần không truyền--environment(quan sát lỗi), rồi chạy lại có truyền. Rút ra kết luận cho riêng bạn về tầm quan trọng của environment.
- Suy nghĩ như một pipeline (không cần cài CI). Viết một file shell script
run-tests.shgồm: cài Newman, chạy collection kèm environment. Chạy script đó và kiểm tra exit code của cả script. Hình dung: nếu đặt đúng script này vào một job CI, điều gì sẽ xảy ra khi một test fail? Viết câu trả lời ra giấy.
- Tình huống ứng dụng. Với dự án hiện tại (hoặc một dự án giả định), liệt kê 5 API "sống còn" mà bạn muốn Newman canh gác trong CI. Giải thích vì sao chọn chúng — đây chính là tư duy thiết kế một smoke suite hiệu quả.
Tóm tắt
Newman là command-line runner chính thức của Postman — hãy hình dung nó là "Postman không giao diện", chạy được ở bất cứ đâu có Node.js. Giá trị lớn nhất của nó là tái sử dụng toàn bộ collection và test bạn đã viết, rồi đưa chúng vào những nơi mà Postman GUI không với tới được: máy chủ build, pipeline CI/CD, container.
Trong CI/CD, Newman đóng vai trò quality gate ở tầng API/integration: sau khi service được deploy, nó chạy collection và dùng exit code (0 = pass, khác 0 = fail) để báo cho hệ thống biết nên cho code đi tiếp hay chặn lại. Chính cơ chế exit code đơn giản này là linh hồn của toàn bộ tự động hóa — bạn không cần viết logic phức tạp, chỉ cần đặt newman run vào đúng chỗ và để con số làm việc.
Qua ba tình huống thực tế — sàn thương mại điện tử biến 90 phút test thủ công thành 4 phút tự động, startup fintech dựng quality gate chặn code lỗi, và agency biến bộ test thành tài sản chung version control cùng code — bạn thấy Newman không chỉ giúp chạy nhanh hơn, mà thay đổi bản chất của việc kiểm thử: từ hoạt động phụ thuộc con người sang một mắt xích tự động, minh bạch, chạy được cho mọi người.
Nguyên lý cốt lõi để nhớ: cài Node → cài Newman → chạy và để exit code nói chuyện. Đó là bộ khung tư duy sẽ theo bạn qua tất cả các bài chi tiết phía sau về reporter, data-driven testing, GitHub Actions, GitLab, Docker và hơn thế nữa.