İçeriğe geç

NextPDF test piramidi

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

NextPDF yalnızca tek bir test türüne dayanmaz. Beş katmanı vardır ve her biri motorla ilgili farklı bir soruyu yanıtlar. Çünkü bir PDF, bir birim testinden geçip buna rağmen diskte yapısal olarak bozuk bir dosya olabilir. Bu sayfa, bu beş katmanı ve her birinin neyi kanıtlamakla sorumlu olduğunu adlandırır.

Bir PDF motorunun hata yüzeyi alışılmadık derecede geniştir. Aynı kod yolu, işlev düzeyinde ve bayt akışı düzeyinde doğru olabilir; buna rağmen uyumlu bir okuyucunun reddettiği bir dosya üretebilir. Ayrıca, yalnızca sayfanın sonunda fark edilmesi güç biçimde yanlış işlenen bir dosya da üretebilir. Motoru tek bir ayrıntı düzeyinde test ederseniz, yalnızca tam olarak o ayrıntı düzeyine güven kazanırsınız; başka hiçbir şeye değil.

Standartlar literatürü bu konuda açıktır. Belirtim tabanlı ve yapı tabanlı test tasarım teknikleri birbiriyle ilişkili değildir ve bir test stratejisinde, en az biri işlevsel ve biri yapısal olmak üzere birden fazla ölçütün kullanılması önerilir (ISO/IEC/IEEE 29119-4, Ek A). Tek bir katman, iyi bir stratejinin küçültülmüş bir sürümü değildir. Bu, farklı bir stratejidir ve eksik bir stratejidir.

NextPDF testlerini tabandan tepeye doğru beş katman halinde düzenler:

  1. Birim — yalıtılmış halde tek bir sınıf veya işlev. Geniş taban.
  2. Entegrasyon — bir modül sınırı boyunca birlikte çalışan birimler.
  3. Yapısal — üretilen PDF’in nesne grafiği, çapraz başvuru tablosu ve fragmanı iyi biçimlendirilmiş ve uyumludur.
  4. Görsel — işlenen sayfa, belirtilen bir tolerans dahilinde onaylanmış bir referansla eşleşir.
  5. Altın — son çıktıdaki istenmeyen sapmaları yakalayan, sabitlenmiş uçtan uca fikstürler. Tepe.

Her katman, altındaki katmanın kanıtlayamadığı bir şeyi kanıtlar. Hiçbiri süs amaçlı değildir. Piramit biçimi nicelikle ilgilidir — çok sayıda ucuz birim testi, daha az sayıda pahalı uçtan uca test — önemle ilgili değildir.

Katmanlar fiziksel olarak vardır; temenni düzeyinde etiketler değildir. Deponun PHPUnit yapılandırması, her birini bir dizinle bire bir eşleşen adlandırılmış bir test paketi olarak tanımlar. Bu nedenle bir katman, çalıştırıcıyı yönlendirebileceğiniz somut bir yerdir; slayttaki bir etiket değildir. Deneyimli bir mühendisin tanıyacağı paketler arasında Unit, Integration, Golden, Snapshot, Reproducibility, Conformance, Standards ve Performance yer alır; her birinin kendi yürütme profili vardır (yalıtım, zaman dilimi ve sürekli entegrasyonda varsayılan olarak çalışıp çalışmadığı).

Bu ayrım bilinçli olarak yapılmıştır. Hızlı taban katmanı (Unit), test başına bir saniyelik bir bütçeyle her değişiklikte çalışır. Daha yavaş, ortama duyarlı katmanlar — görsel işleme, tam uyumluluk, performans — isteğe bağlı veya gecelik olarak çalışır. Bu, daha derin denetimlerden vazgeçmeden yaygın yolu hızlı ve belirlenimci tutar. Katı tür belirleme, tüm yığının temelini oluşturur. Motor, hata bütçesi sıfıra kilitlenmiş olarak Spec: PHPStan, Level 10 düzeyinde çözümleme çalıştırır; böylece büyük bir kusur sınıfı herhangi bir teste ulaşmadan elenir.

  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.
NextPDF'in beş test katmanı, tabandan tepeye. Birim, geniş ve hızlı tabandır; üstteki her katman, altındaki katmanın kanıtlayamadığı bir özelliği kanıtlar, tepedeki altın uçtan uca fikstürlere kadar. Genişlik yalnızca bir nicelik ipucudur — önemi sıralamaz.

Evidence: Test-backed Beş paket, motorun yapılandırmasında tanımlı PHPUnit test paketleri olarak yer alır; her biri kendi dizinine ve yürütme profiline bağlıdır. Bu sayfadaki katman terminolojisi, test altyapısında kullanılan terminolojinin aynısıdır.

Evidence: Standard-backed Birden fazla katmanın gerekçesi temelini Spec: ISO/IEC/IEEE 29119-4, Annex A belgesinden alır: kapsam ölçütlerinin tümü birbiriyle ilişkili değildir ve bir stratejinin işlevsel ve yapısal teknikleri birleştirmesi önerilir. Önemli olarak aynı ek, kapsam ölçütleri arasındaki kapsama (subsumes) sıralamasının, hataları açığa çıkarma yeteneği — test etkililiği — hakkında hiçbir gösterge vermediğini belirtir (ISO/IEC/IEEE 29119-4, §C.2.4). “Daha fazla kapsam”, “daha iyi testler” ile aynı iddia değildir.

Evidence: Standard-backed Hangi özelliklerin kanıtlanacağı seçimi, söz konusu Spec: ISO/IEC 25010 ürün kalitesi özellikleriyle eşlenir: işlevsel doğruluk (birim, entegrasyon) ve bir PDF’i sonraki aşamalarda gerçekten kullanılabilir kılan dosya düzeyindeki özellikler (yapısal, görsel, altın). Kalite modeli, farklı özelliklerin farklı kullanım bağlamlarında önemli olduğu konusunda açıktır.

Katmanlar, motorun kendi betikleriyle hedeflenebilir. Tek bir biçimlendiricideki değişiklik, tabanda doğrulanır. Belge cephesindeki bir değişiklik, katmanlar boyunca doğrulanır:

<?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.

Örneğin amacı komutları değil, yönlendirme mantığını göstermektir. Çalıştırdığınız katman, değişikliğin neyi bozabileceğine göre seçilir. Altyapı, her katmanı birinci sınıf ve ayrı olarak çalıştırılabilir bir hedef haline getirir.

Piramit çoğu zaman bir sıralama olarak okunur — birim testleri en az önemli oldukları için altta, uçtan uca testler en önemli oldukları için üstte (ya da tersi). İkisi de değildir. Dikey eksen kabaca maliyet ve niceliktir: geniş bir taban oluşturan birçok hızlı, ucuz birim testi; üstte giderek daha az, daha yavaş, daha yüksek doğruluklu testler. Bir altın test, bir birim testinden “daha iyi” değildir. Farklı bir hatayı daha geç ve daha pahalı biçimde yakalar ve altındaki binlerce hızlı denetimin yerini tutamaz.

İkinci yanlış anlama, yüksek bir kapsam sayısının piramidin sağlam olduğu anlamına geldiğidir. Anlamına gelmez. Kapsam, yakalamayı değil, çalıştırmayı ölçer. Standartlar, kapsam sıralamasını hata bulma yeteneğiyle eşitlemeyi açıkça reddeder. Mutasyon testinin tam olarak açığa çıkarmak için var olduğu boşluk budur.

Bu sayfa, stratejinin güncel sonuçlarını değil, biçimini ve amacını açıklar. Test sayıları, kapsam yüzdeleri ve mutasyon puanları burada bilinçli olarak yer almaz. Bunlar, sürekli entegrasyon çıktılarından üretilen canlı kalite sinyalleridir. Güncel rakamlar derlemeyle birlikte yayımlanır. Düz metne dondurulmuş olsalar, sessizce eskiyeceklerdi. Belirtilen tek sayı — PHPStan Level 10 — bir ölçüm değil, motorun statik çözümleme yapılandırmasında doğrulanabilen kararlı bir yapılandırma gerçeğidir.

Katman adları, kararlı mimari terminolojidir. Paketlerin tam kümesi ve yürütme profilleri motorla birlikte gelişir ve test yapılandırmasının sorumluluğundadır; bu açıklamayla çelişirse yetkili kaynak test yapılandırmasıdır. Bu sayfa belirli bir geçme oranı ileri sürmez ve başka herhangi bir kitaplığın test stratejisiyle karşılaştırma yapmaz.

  • Altın dosya testi — tepe katmanının referans çıktıyı nasıl sabitlediği ve dürüst kalmasını nasıl sağladığı.
  • Mutasyon testi açıklaması — bir kapsam sayısının, bu katmanlardaki testlerin gerçekten işe yaradığını neden kanıtlamadığı.
  • Her yerde katı türler — PHPStan Level 10’un, herhangi bir katman çalışmadan önce bir kusur sınıfını nasıl ortadan kaldırdığı.
  • Test katmanı — stratejinin tek bir özellik türünü kanıtlayan düzeyi (örneğin, birim davranışı veya yapısal geçerlilik). NextPDF beş tane kullanır.
  • Yapısal test — yalnızca bir dönüş değerini denetlemek yerine, üretilen PDF’in nesne grafiğinin, çapraz başvuru tablosunun ve fragmanının iyi biçimlendirilmiş ve uyumlu olduğunu denetleyen bir kontrol.
  • Görsel test — işlenen bir sayfanın, belirtilen bir tolerans dahilinde onaylanmış bir referans görüntüyle eşleştiğini denetleyen bir kontrol.
  • Altın test — hiçbir zaman otomatik güncellenmeyen, sabitlenmiş bir referans çıktıya karşı uçtan uca bir kontrol; “çıktı değişmedi” sözleşmesi.
  • Test etkililiği — bir test kümesinin hataları açığa çıkarma yeteneği; ISO/IEC/IEEE 29119-4 bunu kapsamdan ayırır. Kısaltma notu: MSI (Mutation Score Indicator), mutasyon testi sayfasında tanımlanmıştır.
  • PHPStan Level 10 — en katı statik çözümleme düzeyi; NextPDF bunu hata bütçesi sıfıra kilitlenmiş olarak çalıştırır.