Hãy hình dung bạn chuẩn hóa CI của mình trên một trong ba công cụ kiểm thử hồi quy trực quan mã nguồn mở mà ai cũng đưa vào danh sách rút gọn (BackstopJS, Argos, Lost Pixel) và một tuần sau khi bắt đầu tìm hiểu, bạn phát hiện hai trong ba không như vẻ bề ngoài. Argos có mã nguồn xuất sắc trên GitHub, nhưng người bảo trì nói thẳng rằng self-hosting không được hỗ trợ cũng không được tài liệu hóa. Lost Pixel đã bị lưu trữ vào ngày 22 tháng 4 năm 2026, khi đội ngũ gia nhập Figma, và không cung cấp lộ trình di chuyển nào cho các đội đã dùng nó.
Điều đó chỉ còn lại đúng một trong ba thứ thực sự có thể self-host và được bảo trì hiện nay. Đây là điều lạ khi nói về một hạng mục có nhiều lựa chọn bề ngoài đến vậy, nhưng thực tế bối cảnh là như thế. Các công cụ mà mọi người xem là ba thứ ngang nhau, trên thực tế là một lựa chọn self-hosted hoạt động được, một công cụ mạnh chạy trên máy chủ của người khác, và một thứ mà bạn nên rời bỏ.
Đây là một góc nhìn ưu tiên self-hosting về các công cụ kiểm thử hồi quy trực quan self-hosted sống sót khi va chạm với thực tế: cái nào phù hợp với ràng buộc nào, và phải làm gì nếu bạn đang dùng Lost Pixel ngay lúc này.
Phiên bản ngắn gọn
- BackstopJS là lựa chọn có thể self-host, được bảo trì, cấp phép MIT và không tốn phí. Puppeteer theo mặc định với hỗ trợ Playwright, so sánh pixel qua Resemble.js, và một giao diện xét duyệt HTML (với những lưu ý về kết xuất Docker mà bạn cần lên kế hoạch).
- Argos là công cụ mạnh hơn về quy trình làm việc (xét duyệt PR và so sánh snapshot ARIA từ cuối năm 2025), nhưng trên thực tế nó là một SaaS được quản lý. Người bảo trì không cung cấp hỗ trợ hay tài liệu để bạn tự chạy nó.
- Lost Pixel đã bị lưu trữ vào tháng 4 năm 2026. Đừng áp dụng nó cho công việc mới, và nếu bạn đang dùng, hãy lên kế hoạch di chuyển ngay bây giờ.
Kết luận một dòng: cho một pipeline CI hoàn toàn self-hosted, BackstopJS là lựa chọn thực dụng. Nếu bạn muốn quy trình xét duyệt tốt nhất và có thể chấp nhận một phụ thuộc SaaS, Argos là công cụ tốt hơn.
(Những gì bài này không đề cập: kiểm thử trực quan dựa trên Cypress, quy trình theo thành phần đặc thù của Storybook, và các con số hiệu năng đo trực tiếp. So sánh này được xây dựng từ các dữ kiện nguồn sơ cấp, không phải từ một bộ kiểm thử do tôi tự chạy.)
Bối cảnh kiểm thử hồi quy trực quan self-hosted đã thay đổi
Hai sự kiện cụ thể trong năm qua đã định hình lại danh sách rút gọn này, và cả hai đều dễ bị bỏ sót nếu bạn làm việc dựa trên một bài liệt kê viết trước khi chúng xảy ra.
Thứ nhất: trong một cuộc thảo luận trên GitHub vào tháng 9 năm 2025một người bảo trì Argos đã tuyên bố rằng Argos không cung cấp hỗ trợ hay tài liệu để chạy nó bên ngoài dịch vụ được quản lý. Mã nguồn cấp phép MIT và nằm công khai, nên "bạn có thể self-host nó" về mặt kỹ thuật là đúng, nhưng không có lộ trình được hỗ trợ, một sự phân biệt trở nên vô cùng quan trọng khi bạn là người trực để lo cho nó.
Thứ hai: kho Lost Pixel đã bị lưu trữ vào ngày 22 tháng 4 năm 2026, chỉ đọc, khi đội ngũ thông báo rằng họ gia nhập Figma. Không có hướng dẫn di chuyển nào đi kèm việc ngừng hoạt động. Một công cụ mà cho tới gần đây là lựa chọn thay thế self-hosted miễn phí chính đáng cho Percy và Chromatic, nay là một phụ thuộc không có người bảo trì.
Cả hai thay đổi đều chỉ về cùng một hướng. Lý do các đội rơi vào đây ngay từ đầu, giá SaaS tăng theo số trình duyệt nhân số viewport nhân số trang, hoặc một quy tắc tuân thủ cấm tải ảnh chụp màn hình giao diện chưa phát hành lên bên thứ ba, vẫn chưa biến mất. Điều đã thay đổi là thực đơn self-hosted ngắn hơn vẻ bề ngoài của nó.
Điểm chính của phần này: Chỉ một trong ba công cụ mà mọi người đưa vào danh sách rút gọn là thực sự có thể self-host và được bảo trì tích cực hiện nay.

BackstopJS: lựa chọn thực sự có thể self-host
Cài đặt là npm install -g backstopjs (hoặc một cài đặt dự án cục bộ), và một dữ kiện đó giải thích phần lớn lý do BackstopJS thắng ở trục self-hosting: không có dịch vụ nào để dịch ngược, không có backend được quản lý nào mà nó ngầm phụ thuộc. Nó chạy dưới dạng một gói npm hoặc một container Docker trên hạ tầng bạn kiểm soát, dưới giấy phép MIT, với chi phí bản quyền bằng không. README lưu ý rằng dòng hiện tại (6.3.x) hỗ trợ Node 20.
Bên dưới, nó điều khiển Puppeteer theo mặc định (Chrome headless) và cũng hỗ trợ Playwright trên chromium, firefox và webkit. So sánh dựa trên pixel qua Resemble.js, với một giá trị có thể cấu hình misMatchThreshold kiểm soát mức độ lệch pixel được tính là thất bại. Việc phê duyệt diễn ra qua một báo cáo HTML với giao diện trong trình duyệt để chấp nhận các thay đổi.
Các giới hạn là nơi một quyết định chiến lược được đưa ra. BackstopJS không có quy trình chặn PR tích hợp sẵn: nó sẽ cho bạn biết có một khác biệt, nhưng nối điều đó vào một cổng "PR này không thể merge" là việc của bạn. Cấu hình của nó nằm trong JSON, mỗi lần một kịch bản, và ở vài trăm ca kiểm thử thì JSON đó tự nó trở thành một bề mặt bảo trì. Việc phát triển chậm chứ không nhanh: dự án không bị lưu trữ, gói hiện đang ở phiên bản 6.3.25, và kho cho thấy khoảng 7.200 sao GitHub và 516 issue đang mở. Vậy nên hãy xem BackstopJS là trưởng thành và dùng được, không phải một nền tảng kiểm thử trực quan phát triển nhanh.
Rủi ro vận hành sắc bén nhất là kết xuất Docker. Hai issue, ảnh chụp màn hình trắng hoặc bị cắt trong Docker (#1156) và kết quả không nhất quán sau khi nâng cấp Docker lên v5.3.0 (#1303), đã mở nhiều năm mà chưa được giải quyết. Docker đồng thời cũng chính là thứ bạn muốn cho CI, vì nó chuẩn hóa kết xuất giữa các máy. Vậy nên công cụ cho bạn nhiều quyền kiểm soát nhất cũng trao cho bạn một lớp mất ổn định đã biết, chưa được sửa, ngay trong chính bối cảnh mà bạn sẽ chạy nó. Đó là một rủi ro có thể lập kế hoạch, không phải một điểm phá vỡ giao dịch, nhưng nó cần được đặt lên bàn trước khi bạn cam kết.
Mẹo chuyên nghiệp: cái bẫy baseline giữa các hệ điều hành. Nếu các nhà phát triển của bạn chụp baseline trên macOS còn runner CI của bạn là Linux, các bài kiểm thử của bạn sẽ thất bại chỉ vì khác biệt khử răng cưa phông chữ, trước cả khi có bất kỳ hồi quy thực sự nào. Như một người thực hành đã ghi lại, việc kết xuất phông chữ khác nhau giữa image Linux mà các dịch vụ CI dùng và một máy macOS cục bộ, đủ để một bài kiểm thử trực quan tự nó thất bại. Giải pháp là tạo và so sánh baseline trong một môi trường duy nhất (chạy BackstopJS cục bộ trong cùng image Docker mà bạn dùng trong CI), để ảnh tham chiếu và ảnh so sánh đến từ cùng một kết xuất.
Argos: quy trình tốt nhất, nhưng thực tế là SaaS
Argos đạt được trải nghiệm xét duyệt theo cách mà BackstopJS không làm được, và đó là toàn bộ lý do nó có mặt trong danh sách này bất chấp lưu ý về self-hosting. Nó tích hợp với Playwright, Cypress, Storybook, WebdriverIO và Puppeteer, và cắm vào GitHub Actions, GitLab CI, Bitbucket và Azure DevOps. Quy trình xét duyệt PR là một bề mặt sản phẩm hạng nhất, và nó vẫn tiếp tục tiến bước. Các mục changelog gần đây bổ sung xét duyệt cộng tác với bình luận được ghim (tháng 6 năm 2026) và tự động bỏ qua các thay đổi bất ổn.
Điểm khác biệt kỹ thuật thú vị nhất của nó là việc so sánh. Trên nền so sánh pixel tất định, Argos đã thêm so sánh snapshot ARIA cho SDK Playwright của nó vào ngày 4 tháng 11 năm 2025. So sánh snapshot ARIA so sánh cây trợ năng (vai trò, nhãn và cấu trúc) cùng với ảnh chụp pixel, qua đó bắt được một lớp hồi quy về ngữ nghĩa và trợ năng mà một phép so sánh pixel thuần túy có thể bỏ sót (chẳng hạn một nút trông vẫn y hệt nhưng đã mất nhãn trợ năng của nó). Với các đội có cam kết về trợ năng, đó là một khả năng thực sự mà các công cụ chỉ-pixel không cung cấp.
Rồi đến ràng buộc. Mã nguồn là MIT, nhưng sản phẩm là dịch vụ được quản lý, và người bảo trì đã nói rõ rằng self-hosting không được tài liệu hóa và không được hỗ trợ. Bạn có thể dựng nó từ mã nguồn. Bạn chỉ làm vậy khi biết rằng bất kỳ thay đổi thượng nguồn nào cũng có thể phá vỡ triển khai của bạn và không ai có nghĩa vụ giúp đỡ. Có một điều bất định liên quan đáng nêu ra hơn là khẳng định: các báo cáo cộng đồng gợi ý rằng tích hợp GitLab Self-Managed kỳ vọng một gói Enterprise (tôi coi đó là một tín hiệu cộng đồng, không phải một đặc tả đã xác nhận, vậy nên hãy kiểm chứng với thiết lập của chính bạn trước khi để nó dẫn dắt một quyết định).
Điều này tạo ra một khoảng trống khó chịu. Một đội có yêu cầu quyền riêng tư nghiêm ngặt (chính là đội có động lực self-host mạnh nhất) mà cũng muốn trải nghiệm xét duyệt của Argos thì không có lối đi tốt. Họ có thể dùng dịch vụ được quản lý và chấp nhận phụ thuộc bên thứ ba, hoặc self-host mà không có hỗ trợ, hoặc chọn một công cụ khác. Không có cánh cửa thứ tư sạch sẽ nào, và nêu điều đó ra thì trung thực hơn là giả vờ rằng giấy phép mã nguồn mở đóng nó lại.
Điểm chính của phần này: Argos là công cụ mạnh hơn. Self-host nó thì không được hỗ trợ và mong manh về mặt vận hành.
Lost Pixel: đã lưu trữ, và phải làm gì nếu bạn đang dùng
Chính biểu ngữ của kho Lost Pixel là toàn bộ câu chuyện trong một dòng: kho đã bị chủ sở hữu lưu trữ vào ngày 22 tháng 4 năm 2026 và nay chỉ đọc. Đội ngũ gia nhập Figma, bản phát hành cuối là v3.22.0 vào tháng 11 năm 2024, và không có hướng dẫn di chuyển nào được công bố.
Cho tới khi lưu trữ, Lost Pixel là một lựa chọn hợp lý (kết xuất dựa trên Docker, hỗ trợ Playwright và Storybook cộng thêm Ladle và Histoire, và kiểm thử trực quan cả toàn trang lẫn cấp thành phần). Không điều nào trong đó thay đổi về mặt kỹ thuật vào ngày 22 tháng 4. Điều thay đổi là nay nó không có người bảo trì, không có bản vá bảo mật, và không có lộ trình, điều mà đối với một phụ thuộc CI là loại bỏ khỏi công việc mới bất kể phiên bản hiện tại chạy tốt tới đâu.
Nếu hôm nay bạn đang dùng, việc di chuyển chia theo cách bạn đã dùng nó. Nếu bạn dựa vào kiểm thử cấp thành phần của nó, đặc biệt là quy trình Storybook hoặc Ladle, lựa chọn thay thế gần nhất của bạn là dịch vụ được quản lý Argos hoặc kiểm thử ảnh chụp màn hình gốc của Playwright. BackstopJS có thể chụp bộ chọn hoặc URL Storybook, nhưng không cho bạn cùng quy trình theo thành phần tích hợp sẵn như Lost Pixel đã cho, nên bạn sẽ phải tự mô hình hóa các trạng thái thành phần đó. Nếu bạn dùng nó cho hồi quy trực quan toàn trang, BackstopJS là kẻ kế nhiệm self-hosted trực tiếp. Dù thế nào, việc chuyển đổi không cấp bách theo nghĩa "các bản build của bạn sẽ hỏng ngày mai", nhưng đồng hồ đang chạy: một công cụ kiểm thử không được bảo trì lặng lẽ mục ruỗng khi các phiên bản trình duyệt, hệ điều hành và framework của bạn trôi xa khỏi phiên bản mà nó được dựng cuối cùng.
So sánh trong nháy mắt
Đây là cùng thông tin đó đặt cạnh nhau, để bạn có thể lướt qua các trục quan trọng cho một quyết định CI trước khi ánh xạ chúng lên các ràng buộc của riêng bạn.
| Trục | BackstopJS | Argos | Lost Pixel |
|---|---|---|---|
| Giấy phép | MIT | Mã MIT, sản phẩm SaaS được quản lý | MIT |
| Thực tế self-hosting | Hoàn toàn có thể self-host theo thiết kế | Có thể nhưng không được hỗ trợ và không có tài liệu | Từng có thể self-host, nay đã lưu trữ |
| Trạng thái bảo trì | Được bảo trì, tiến chậm và trưởng thành | Đang hoạt động (dịch vụ được quản lý) | Đã lưu trữ ngày 22 tháng 4 năm 2026 |
| Cách tiếp cận so sánh | So sánh pixel (Resemble.js) | So sánh pixel cộng so sánh snapshot ARIA | So sánh pixel (không được bảo trì) |
| Hỗ trợ framework và engine | Puppeteer (mặc định), Playwright | Playwright, Cypress, Storybook, WebdriverIO, Puppeteer | Playwright, Storybook, Ladle, Histoire (tại thời điểm lưu trữ) |
| Quy trình xét duyệt | Báo cáo HTML, phê duyệt thủ công, không có cổng PR | Xét duyệt PR, bình luận cộng tác, cổng PR | Không áp dụng (đã lưu trữ) |
| Chi phí | Miễn phí | Giá SaaS (theo snapshot) | Miễn phí nhưng không được bảo trì |

Cách chọn (khung quyết định)
Hãy bắt đầu từ ràng buộc khó nhất của bạn, không phải từ một danh sách tính năng. Ràng buộc loại bỏ phần lớn thực đơn giúp bạn.
- Hoàn toàn self-hosted, ngân sách bằng không, và bạn có thể chấp nhận kiểm thử chỉ-toàn-trang với xét duyệt thủ công: BackstopJS. Đây là lựa chọn duy nhất thỏa mãn đồng thời self-hosted, được bảo trì và miễn phí, và các đánh đổi (không có cổng PR, cấu hình JSON, mất ổn định Docker) là những đại lượng đã biết mà bạn có thể thiết kế xoay quanh.
- Bạn muốn trải nghiệm xét duyệt tốt nhất, cổng PR và so sánh ARIA, và bạn có thể chấp nhận một phụ thuộc SaaS: dịch vụ được quản lý Argos. Đây là con đường đến những điểm mạnh của Argos mà không có rủi ro self-hosting không được hỗ trợ. Nếu một quy tắc tuân thủ cấm tải ảnh chụp màn hình lên bên thứ ba, cánh cửa này đóng lại và bạn quay về BackstopJS.
- Bộ kiểm thử nhỏ hoặc ưu tiên Playwright: cân nhắc không thêm công cụ chuyên dụng nào cả. Playwright đi kèm sẵn
toHaveScreenshot()một cách gốc, và với các bộ dưới khoảng 100 bài kiểm thử thì đó có thể là tất cả những gì bạn cần. Một hướng dẫn của người thực hành đặt điểm bước ngoặt nơi một công cụ chuyên dụng bắt đầu đáng giá vào khoảng quy mô đó (hãy coi đó là một quan sát ngành, không phải một con số Playwright chính thức). Gánh nặng quản lý các tệp baseline trong git tăng lên vượt quá điểm đó, và đó là nơi một công cụ chuyên dụng tự trả cho chính nó. - Hiện đang dùng Lost Pixel: hãy di chuyển ngay, theo sự phân chia ở phần trước. Đừng lấy "nó vẫn chạy" làm lý do để ở lại.
Một lưu ý có trước tất cả các công cụ này và sống lâu hơn chúng: đội Sparkbox, viết từ nhiều năm trước, đã chọn một lựa chọn được host chính vì khiến các kỹ sư thực sự dùng các bài kiểm thử còn khó hơn việc thiết lập. Một công cụ self-hosted với giao diện xét duyệt yếu hơn có thể thắng về chi phí và thua về mức độ áp dụng (nếu đội của bạn phớt lờ một báo cáo BackstopJS ồn ào, chi phí bản quyền bằng không của nó chẳng mang lại gì cho bạn). Hãy tính đến trải nghiệm xét duyệt trong quyết định, không chỉ giá.
Điểm chính của phần này: Ràng buộc chọn công cụ. Self-hosted và miễn phí chỉ về BackstopJS, quy trình tốt nhất với SaaS chấp nhận được chỉ về Argos, và nhỏ và ưu tiên Playwright thì có thể chỉ về không công cụ nào cả.
Định cỡ runner CI cho Chromium headless
Cả ba công cụ đều điều khiển Chromium headless, và chính dấu chân bộ nhớ của Chromium (không phải CPU) quyết định kích cỡ runner của bạn, vì mỗi worker trình duyệt chạy đồng thời muốn có vài gigabyte RAM của riêng nó. Định cỡ máy quá nhỏ thì các bài kiểm thử trực quan của bạn không thất bại một cách sạch sẽ. Chúng bị OOM giết giữa chừng và được báo cáo là nhiễu hạ tầng bất ổn, loại thất bại tệ nhất để gỡ lỗi.
Như một hướng dẫn gần đúng, định cỡ theo mức song song thay vì như những con số cứng (mức dùng thực tế phụ thuộc vào độ phức tạp trang và số worker bạn chạy song song):
- Đội nhỏ hoặc kiểm thử tuần tự: khoảng 2 vCPU / 4 GB RAM xử lý một worker Chromium headless duy nhất cùng chi phí daemon CI.
- Sử dụng CI theo đội: khoảng 4 vCPU / 8 GB RAM hỗ trợ khoảng 2 đến 4 worker trình duyệt song song, nơi đa số đội dừng lại.
- Thông lượng cao hoặc bộ kiểm thử lớn: khoảng 8 vCPU / 16 GB RAM cho mức song song cao, hoặc khi lần chạy hồi quy trực quan chia sẻ một runner với công việc CI khác.
Lưu trữ là khoản mục thầm lặng. Các artefact ảnh chụp màn hình và baseline lịch sử tích lũy qua từng lần chạy, vậy nên hãy lên kế hoạch cho mức tăng đó: dành khoảng dung lượng dư dả nếu bạn giữ baseline cục bộ, hoặc đẩy baseline và artefact lên lưu trữ đối tượng để đĩa của runner không phải là điểm nghẽn.
Một VPS là máy chủ tự nhiên cho một runner CI self-hosted làm việc này, vì bạn muốn RAM có thể dự đoán, được dành riêng cho các worker Chromium, và một máy homelab chỉ hợp lý nếu phần cứng đã sẵn đó. Nếu bạn cũng đang dựng ngăn xếp CI xung quanh, các mảnh xung quanh công cụ kiểm thử trực quan là các triển khai một cú nhấp trong marketplace của Cloudzy: Gitea, GitLab, Jenkins và Forgejo cho forge CI, và Docker cho sự nhất quán kết xuất mà các công cụ cần. Bản thân công cụ hồi quy trực quan được cài lên trên qua npm hoặc Docker, vậy nên hãy khởi chạy một Linux VPS được định cỡ từ các khoảng trên và chạy nó ở đó. Nếu bạn đang đấu nối CI dựa trên Docker, các hướng dẫn của Cloudzy về các lựa chọn thay thế GitLab self-hosted và liệt kê các container Docker bao quát phần thiết lập lân cận.

Câu hỏi thường gặp
Argos có thể self-host không?
Về mặt kỹ thuật là có (mã nguồn cấp phép MIT), nhưng người bảo trì đã tuyên bố vào tháng 9 năm 2025 rằng Argos không cung cấp hỗ trợ hay tài liệu để chạy nó bên ngoài dịch vụ được quản lý. Hãy coi self-hosting là không được hỗ trợ và mong manh về mặt vận hành: nó có thể hỏng ở bất kỳ thay đổi thượng nguồn nào mà không người bảo trì nào có nghĩa vụ giúp đỡ. Với đa số đội, dịch vụ được quản lý là cách thực dụng để có được các lợi ích của Argos.
Chuyện gì đã xảy ra với Lost Pixel?
Lost Pixel đã bị lưu trữ vào ngày 22 tháng 4 năm 2026, khi đội ngũ gia nhập Figma và ngừng sản phẩm. Kho chỉ đọc, bản phát hành cuối là v3.22.0 vào tháng 11 năm 2024, và không có hướng dẫn di chuyển nào được cung cấp. Đừng áp dụng nó cho công việc mới. Nếu bạn đang dùng, hãy lên kế hoạch di chuyển sang BackstopJS (kiểm thử toàn trang) hoặc sang Argos và Playwright-gốc (kiểm thử thành phần).
So sánh snapshot ARIA là gì?
So sánh snapshot ARIA so sánh cây trợ năng (vai trò, nhãn và cấu trúc) cùng với ảnh chụp pixel, và bắt được các hồi quy về ngữ nghĩa và trợ năng mà một phép so sánh pixel đơn thuần có thể bỏ sót, chẳng hạn một nút giống hệt về mặt hình ảnh nhưng đã mất nhãn trợ năng của nó. Argos đã thêm tính năng này vào ngày 4 tháng 11 năm 2025.
Chromium headless cần bao nhiêu RAM trong CI?
Một worker tuần tự duy nhất thường chạy ở khoảng 2 đến 4 GB, và các worker chạy đồng thời tăng RAM gần như tuyến tính từ đó. Mức dùng thực tế phụ thuộc vào độ phức tạp trang và số phiên trình duyệt bạn chạy song song, vậy nên hãy coi các con số này là hướng dẫn thay vì con số cứng và chừa khoảng dư để tránh các lần chạy kiểm thử bị OOM giết.
BackstopJS có hỗ trợ Playwright không?
Có. Puppeteer là engine mặc định (Chrome headless), và BackstopJS cũng hỗ trợ Playwright trên chromium, firefox và webkit. Bạn chọn engine trong cấu hình của mình.