Bỏ qua để đến nội dung

Kim tự tháp kiểm thử NextPDF

Spec: ISO/IEC/IEEE 29119-4 Spec: ISO/IEC 25010 Evidence: Test-backed PHPStan: Level 10

NextPDF không chỉ có một loại kiểm thử. Nó có năm tầng, và mỗi tầng trả lời một câu hỏi khác nhau về bộ máy. Lý do là một tệp PDF có thể vượt qua một kiểm thử unit nhưng vẫn bị hỏng về mặt cấu trúc trên đĩa. Trang này nêu tên năm tầng và điều mỗi tầng có trách nhiệm chứng minh.

Một bộ máy PDF có bề mặt lỗi rộng bất thường. Cùng một đường dẫn mã có thể đúng ở cấp hàm và đúng ở cấp luồng byte, nhưng vẫn tạo ra một tệp bị trình đọc tuân thủ chuẩn từ chối. Nó cũng có thể tạo ra một tệp chỉ kết xuất sai rất tinh vi tại một chỗ ngắt trang. Nếu chỉ kiểm thử bộ máy ở một mức độ chi tiết duy nhất, bạn cũng chỉ có được mức tin cậy đúng ở mức độ chi tiết đó.

Tài liệu tiêu chuẩn nói rõ điều này. Các kỹ thuật thiết kế kiểm thử dựa trên đặc tả và dựa trên cấu trúc không liên quan đến nhau, và một chiến lược kiểm thử được khuyến nghị nên dùng nhiều hơn một tiêu chí, với ít nhất một tiêu chí chức năng và một tiêu chí cấu trúc (ISO/IEC/IEEE 29119-4, Annex A). Một tầng đơn lẻ không phải là phiên bản thu nhỏ của một chiến lược tốt. Đó là một chiến lược khác, và là một chiến lược chưa hoàn chỉnh.

NextPDF tổ chức các kiểm thử của mình thành năm tầng, từ đáy lên đỉnh:

  1. Unit — một lớp hoặc một hàm, tách biệt. Phần đáy rộng.
  2. Integration — các unit phối hợp với nhau qua một ranh giới mô-đun.
  3. Structural — đồ thị đối tượng PDF, bảng tham chiếu chéo và trailer được tạo ra đúng định dạng và tuân thủ chuẩn.
  4. Visual — trang đã kết xuất khớp với một bản tham chiếu đã được phê duyệt trong phạm vi dung sai đã nêu.
  5. Golden — các fixture đầu-cuối được cố định nhằm phát hiện sự sai lệch ngoài ý muốn trong đầu ra cuối cùng. Phần đỉnh.

Mỗi tầng chứng minh một điều mà tầng bên dưới không thể chứng minh. Không tầng nào chỉ để trang trí. Hình dạng kim tự tháp nói về số lượng — nhiều kiểm thử unit rẻ, ít kiểm thử đầu-cuối tốn kém hơn — chứ không nói về tầm quan trọng.

Các tầng tồn tại thực sự trong hệ thống, không chỉ là mong muốn. Cấu hình PHPUnit của kho lưu trữ khai báo mỗi tầng thành một test suite có tên, ánh xạ một-một tới một thư mục. Vì vậy một tầng là một nơi mà bạn có thể chỉ định runner chạy vào, chứ không phải một nhãn trên slide. Các suite mà một kỹ sư cấp cao sẽ nhận ra bao gồm Unit, Integration, Golden, Snapshot, Reproducibility, Conformance, Standards, và Performance; mỗi suite có hồ sơ thực thi riêng (mức độ tách biệt, khoảng thời gian, và liệu nó có chạy mặc định trong continuous integration hay không).

Sự tách biệt đó là có chủ đích. Tầng đáy nhanh (Unit) chạy với mọi thay đổi, với ngân sách một giây cho mỗi kiểm thử. Các tầng chậm hơn và nhạy cảm với môi trường — kết xuất hình ảnh, tuân thủ chuẩn đầy đủ, hiệu năng — chỉ chạy khi bạn chọn bật hoặc chạy hằng đêm. Điều này giữ cho đường dẫn phổ biến luôn nhanh và xác định mà không phải từ bỏ các kiểm tra sâu hơn. Kiểu dữ liệu chặt làm nền tảng cho toàn bộ ngăn xếp. Bộ máy chạy phân tích ở Spec: PHPStan, Level 10 với ngân sách lỗi khóa ở mức không, nên một lớp lớn các khiếm khuyết không bao giờ chạm tới kiểm thử.

  1. Tier 1 of 5 Unit Isolated behaviour of a single class or function; the broad base.
  2. Tier 2 of 5 Integration Collaborating units across a module boundary.
  3. Tier 3 of 5 Structural The emitted PDF object/xref structure is well-formed and conformant.
  4. Tier 4 of 5 Visual Rendered output matches an approved reference within tolerance.
  5. Tier 5 of 5 Golden End-to-end byte/lossless fixtures pinned as the contract; the apex.
Năm tầng kiểm thử của NextPDF, từ đáy lên đỉnh. Unit là phần đáy rộng và nhanh; mỗi tầng phía trên chứng minh một tính chất mà tầng bên dưới không thể, cho đến các fixture golden đầu-cuối ở đỉnh. Chiều rộng chỉ là một gợi ý về số lượng — nó không xếp hạng tầm quan trọng.

Evidence: Test-backed Năm suite tồn tại dưới dạng test suite PHPUnit được khai báo trong cấu hình của bộ máy, mỗi suite gắn với thư mục và hồ sơ thực thi riêng. Từ vựng về các tầng trên trang này là cùng từ vựng mà hạ tầng kiểm thử sử dụng.

Evidence: Standard-backed Lý do cần nhiều hơn một tầng được dựa trên Spec: ISO/IEC/IEEE 29119-4, Annex A : các tiêu chí bao phủ không nhất thiết liên quan đến nhau, và một chiến lược được khuyến nghị nên kết hợp các kỹ thuật chức năng và cấu trúc. Quan trọng là, cùng phụ lục đó lưu ý rằng thứ tự bao hàm giữa các tiêu chí bao phủ không cho biết gì về khả năng phát hiện lỗi của chúng — hiệu quả kiểm thử (ISO/IEC/IEEE 29119-4, §C.2.4). “Bao phủ nhiều hơn” không phải là tuyên bố giống với “kiểm thử tốt hơn”.

Evidence: Standard-backed Việc lựa chọn những tính chất cần chứng minh được ánh xạ tới Spec: ISO/IEC 25010 — các đặc tính chất lượng sản phẩm gồm: tính đúng đắn chức năng (unit, integration), và các tính chất ở mức tệp khiến một tệp PDF thực sự dùng được ở các bước sau (structural, visual, golden). Mô hình chất lượng nói rõ rằng những đặc tính khác nhau lại quan trọng trong những bối cảnh sử dụng khác nhau.

Các tầng có thể được gọi ngay từ các script của bộ máy. Một thay đổi đối với một formatter đơn lẻ được kiểm chứng ở phần đáy. Một thay đổi đối với document facade được kiểm chứng trên nhiều tầng:

<?php
declare(strict_types=1);
// Tier 1 — Unit: one unit, isolated, fast.
// composer test:unit → phpunit --testsuite Unit
// Tier 2 — Integration: collaborating units across a boundary.
// composer test:integration → phpunit --testsuite Integration
// Tier 3 — Structural: the emitted PDF object graph is well-formed.
// vendor/bin/phpunit --testsuite Conformance
// Tier 4/5 — Visual + Golden: rendered/serialized output vs a pinned
// reference (golden is byte/structure-pinned, never auto-updated).
// vendor/bin/phpunit --testsuite Golden
// A change to the document facade touches every API, so the routing
// guidance escalates it from "unit only" to the full unit + integration
// surface — the tier you run is a function of blast radius, not habit.

Trọng tâm của ví dụ là logic định tuyến, không phải các lệnh. Tầng bạn chạy được chọn dựa trên những gì thay đổi có thể làm hỏng. Hạ tầng biến mỗi tầng thành một mục tiêu hạng nhất, có thể chạy riêng.

Kim tự tháp thường bị hiểu là một bảng xếp hạng — kiểm thử unit ở dưới cùng vì chúng ít quan trọng nhất, kiểm thử đầu-cuối ở trên cùng vì chúng quan trọng nhất (hoặc ngược lại). Cả hai cách hiểu đều sai. Trục dọc đại khái là chi phí và số lượng: nhiều kiểm thử unit nhanh, rẻ tạo thành phần đáy rộng; càng lên trên thì càng ít kiểm thử hơn, chậm hơn và có độ trung thực cao hơn. Một kiểm thử golden không “tốt hơn” một kiểm thử unit. Nó bắt một lỗi khác, muộn hơn, tốn kém hơn, và sẽ là một phương án thay thế kém cho hàng nghìn kiểm tra nhanh bên dưới nó.

Hiểu lầm thứ hai là một con số bao phủ cao nghĩa là kim tự tháp vững chắc. Không phải vậy. Độ bao phủ đo lường việc thực thi, không phải việc phát hiện. Các tiêu chuẩn nói rõ là không đánh đồng thứ tự bao phủ với khả năng tìm lỗi. Khoảng cách đó chính là điều mà kiểm thử đột biến tồn tại để phơi bày.

Trang này mô tả hình dạng và ý đồ của chiến lược, không phải kết quả hiện tại của nó. Số lượng kiểm thử, tỷ lệ phần trăm bao phủ và điểm đột biến được cố tình bỏ qua ở đây. Chúng là những tín hiệu chất lượng sống, được tạo ra từ các artifact của continuous integration. Các con số hiện tại được công bố cùng với bản dựng. Nếu bị cố định vào văn bản, chúng sẽ âm thầm lỗi thời. Con số duy nhất được nêu — PHPStan Level 10 — là một sự thật cấu hình ổn định, có thể kiểm chứng trong cấu hình phân tích tĩnh của bộ máy, không phải một phép đo.

Các tên tầng là từ vựng kiến trúc ổn định. Tập hợp chính xác các suite và hồ sơ thực thi của chúng thay đổi theo bộ máy và do cấu hình kiểm thử quản lý; đây là nguồn quyết định nếu nó từng mâu thuẫn với phần giải thích này. Trang này không khẳng định một tỷ lệ đạt cụ thể nào và không so sánh với chiến lược kiểm thử của bất kỳ thư viện nào khác.

  • Tầng kiểm thử — một cấp của chiến lược chứng minh một loại tính chất (ví dụ, hành vi unit hoặc tính hợp lệ về cấu trúc). NextPDF dùng năm tầng.
  • Kiểm thử cấu trúc — một kiểm tra xem đồ thị đối tượng, bảng tham chiếu chéo và trailer của tệp PDF được tạo ra có đúng định dạng và tuân thủ chuẩn hay không, thay vì chỉ kiểm tra một giá trị trả về.
  • Kiểm thử hình ảnh — một kiểm tra xem một trang đã kết xuất có khớp với ảnh tham chiếu đã được phê duyệt trong phạm vi dung sai đã khai báo hay không.
  • Kiểm thử golden — một kiểm tra đầu-cuối đối chiếu với đầu ra tham chiếu được cố định và không bao giờ tự động cập nhật; là cam kết rằng “đầu ra không thay đổi”.
  • Hiệu quả kiểm thử — khả năng của một bộ kiểm thử trong việc phát hiện lỗi, điều mà ISO/IEC/IEEE 29119-4 phân biệt với độ bao phủ. Lưu ý về từ viết tắt: MSI (Mutation Score Indicator) được định nghĩa trên trang kiểm thử đột biến.
  • PHPStan Level 10 — mức phân tích tĩnh nghiêm ngặt nhất; NextPDF chạy nó với ngân sách lỗi khóa ở mức không.