Birim testleri

Kodu değiştirdikten veya ekledikten sonra mevcut birim testlerini çalıştırmanız ve daha fazla test yazmanız gerekir. Tüm testler, kodun sıkıştırılmamış sürümlerinde yürütülür.

İki grup birim testi vardır: JS testleri ve blok oluşturucu testleri.

JS Testleri

JS testleri, Blockly'nin temelindeki dahili JavaScript işlevlerinin çalışmasını onaylar. Birim testleri çalıştırmak için Mocha, bağımlılıkları stub yapmak için Sinon ve kod hakkında iddialarda bulunmak için Chai'yi kullanırız.

Testleri Çalıştırma

npm run test, hem bloklu hem de bloklu örneklerde birim testlerini çalıştırır. Blockly'de bu işlem, linting ve derleme gibi diğer testleri de çalıştırır. Şunları yapabilirsiniz: tüm mocha'ları etkileşimli olarak çalıştırmak için tests/mocha/index.html dosyasını da bir tarayıcıda açın testler.

Test Yazma

Testleri yapmak için Mocha TDD arayüzünü kullanırız. Testler paketler halinde düzenlenir, Bunlar hem ek alt paketleri hem de testleri ve/veya testleri içerebilir. Genellikle Blockly'nin her bileşeninin (toolbox veya workspace gibi) bir veya daha fazla paket içeren kendi test dosyası vardır. Her süitte setup ve teardown olabilir her test için ayrı ayrı çağrılacak olan yöntem paketinde yer alır.

Test Yardımcıları

Blockly'ye özel, aşağıdaki durumlarda faydalı olabilecek test edilir. Bu dosyaları core ve blockly-samples klasörlerinde bulabilirsiniz.

Yardımcı işlevler arasında, testlerinizden önce ve sonra çağrılması zorunludur sharedTestSetup ve sharedTestTeardown bulunur (Şartlar bölümüne bakın).

sharedTestSetup:
  • Sinon sahte zamanlayıcılar oluşturur (bazı testlerde this.clock.runAll kullanmanız gerekir).
  • Blockly.Events.fire işlevini hemen tetiklemek için stub oluşturur (yapılandırılabilir).
  • defineBlocksWithJsonArray aracılığıyla tanımlanan blockTypes için otomatik temizleme işlemini ayarlar.
  • this bağlamında erişilebilir olması amaçlanan birkaç mülkü tanımlar:
    • this.clock (ancak geri yüklenmemesi şuralarda sorunlara neden olur: sharedTestTeardown)
    • this.eventsFireStub
    • this.sharedCleanup (addMessageToCleanup ve addBlockTypeToCleanup ile birlikte kullanılır) (NOT: defineBlocksWithJsonArray kullanarak bloğu tanımladıysanız addBlockTypeToCleanup kullanmanız gerekmez)

Fonksiyonda kurulumu yapılandırmak için isteğe bağlı bir options parametresi vardır. Şu anda, yalnızca Blockly.Events.fire ürününün tetiklenip tetiklenmeyeceğini belirlemek için kullanılır hemen (varsayılan olarak saplanır).

sharedTestTeardown:
  • this.workspace çalışma alanını siler (tanımlandığı yere bağlı olarak, daha fazla bilgi için Test Gereksinimleri bölümüne bakın).
  • Tüm saplamaları geri yükler.
  • defineBlocksWithJsonArray ve addBlockTypeToCleanup aracılığıyla eklenen tüm blok türlerini temizler.
  • addMessageToCleanup üzerinden eklenen tüm iletileri temizler.

Test Şartları

  • Her test,sharedTestSetup.call(this); sharedTestTeardown.call(this); ve en dıştaki paket için dosyanın en dıştaki paketinin sökümündeki son satırı içerir.
  • Genel bir araç kutusu olan bir çalışma alanına ihtiyacınız varsa hazır ayar araç kutuları index.html testinde. Aşağıda konuyla ilgili bir örnek verilmiştir.
  • this.workspace adlı cihazı uygun şekilde atmalısınız. Çoğu testte this.workspace değerini en dıştaki pakette tanımlar ve sonraki tüm testler için kullanırsınız ancak bazı durumlarda bunu bir iç pakette tanımlayabilir veya yeniden tanımlayabilirsiniz (örneğin, testlerinizden biri için başlangıçta ayarladığınızdan farklı seçeneklere sahip bir çalışma alanı gerekir). Testin sonunda imha edilmelidir.
    • this.workspace öğesini en dış pakette tanımlar ve hiçbir zaman yeniden tanımlamazsanız başka bir işlem yapmanız gerekmez. Şu tarih ve saatte otomatik olarak imha edilecek: sharedTestTeardown
    • this.workspace öğesini bir iç pakette ilk kez tanımlarsanız (yani en dıştaki pakette tanımlamadıysanız) manuel olarak workspaceTeardown.call(this, this.workspace) numaralı telefonu arayarak iptal edin yıkılmasından etkilendi.
    • En dıştaki pakette this.workpace öğesini tanımlar ancak daha sonra yeniden tanımlarsanız dahili bir test paketinde kullanıyorsanız önce Yeniden tanımlamadan önce workspaceTeardown.call(this, this.workspace) üst düzey pakette tanımlanan orijinal çalışma alanını ortadan kaldırın. Ayrıca, bu iç paketin yıkımında workspaceTeardown.call(this, this.workspace) işlevini tekrar çağırarak yeni değeri manuel olarak da imha etmeniz gerekir.

Test Yapısı

Birim testleri genellikle düzenle, hareket et, iddia et şeklinde özetlenebilir belirli bir yapıya uyar.

  1. Düzenleme: Dünyanın durumunu ve bu duruma ilişkin gerekli koşulları emin olmanız gerekir.
  2. İşlem yap: Test edilen davranışı tetiklemek için test edilen kodu çağırın.
  3. İddia: Döndürülen değer veya şunlarla etkileşimler hakkında iddialarda bulunun: sahte nesnelerden kaçının.

Basit bir testte, ayarlanması gereken bir davranış olmayabilir ve doğrulama aşamaları, komut dosyasında test edilen koda yapılan çağrının doğrulama işlemidir. Daha karmaşık durumlarda testleriniz daha okunaklı olur. devam ettireceğiz.

Aşağıda bir örnek test dosyası (orijinal dosyadan basitleştirilmiştir) verilmiştir.

suite('Flyout', function() {
  setup(function() {
    sharedTestSetup.call(this);
    this.toolboxXml = document.getElementById('toolbox-simple');
    this.workspace = Blockly.inject('blocklyDiv',
        {
          toolbox: this.toolboxXml
        });
  });

  teardown(function() {
    sharedTestTeardown.call(this);
  });

  suite('simple flyout', function() {
    setup(function() {
      this.flyout = this.workspace.getFlyout();
    });
    test('y is always 0', function() {
      // Act and assert stages combined for simple test case
      chai.assert.equal(this.flyout.getY(), 0, 'y coordinate in vertical flyout is 0');
    });
    test('x is right of workspace if flyout at right', function() {
      // Arrange
      sinon.stub(this.flyout.targetWorkspace, 'getMetrics').returns({
        viewWidth: 100,
      });
      this.flyout.targetWorkspace.toolboxPosition = Blockly.TOOLBOX_AT_RIGHT;
      this.flyout.toolboxPosition_ = Blockly.TOOLBOX_AT_RIGHT;

      // Act
      var x = this.flyout.getX();

      // Assert
      chai.assert.equal(x, 100, 'x is right of workspace');
    });
  });
});

Bu örnekte dikkat edilmesi gereken noktalar:

  • Bir süit, ek setup ve teardown yöntemlerine sahip diğer süitleri içerebilir.
  • Her paket ve testin açıklayıcı bir adı vardır.
  • Çai ifadeleri, kod hakkında iddialarda bulunmak için kullanılır.
    • İsteğe bağlı bir dize bağımsız değişkeni sağlayabilirsiniz. Bu bağımsız değişken test başarısız olur. Bu, bozuk testlerde hata ayıklamayı kolaylaştırır.
    • Parametrelerin sırası chai.assert.equal(actualValue, expectedValue, optionalMessage). actual ve expected değerlerini değiştirirseniz bu hata mesajları bir anlam ifade etmez.
  • Sinon, gerçek kodu çağırmak istemediğinizde yöntemlerin saplanması için kullanılır. Bu örnekte, gerçek metrikler işlevi bu testle alakalı olmadığı için çağrılmak istenmez. Yalnızca sonuçların Google tarafından test edilir. Sinon, getMetrics fonksiyonunu kökten değiştirerek bir hazır yanıt olarak da bilinir.
  • Her paket için setup yöntemlerinde yalnızca şu özelliklere sahip genel ayarlar bulunmalıdır: tüm testler için geçerlidir. Belirli bir davranışla ilgili bir test belirli bir koşula dayanıyorsa bu koşul ilgili testte açıkça belirtilmelidir.

Hata Ayıklama Testleri

  • Testleri bir tarayıcıda açıp geliştirici araçlarını kullanarak kesme noktaları belirleyebilir ve testlerinizin beklenmedik bir şekilde başarısız olup olmadığını (veya beklenmedik bir şekilde başarılı olup olmadığını) inceleyebilirsiniz.
  • Yalnızca belirli bir test grubunu çalıştırmak için bir testte veya pakette .only() ya da .skip() ayarını yapın, veya testi atlayabilirsiniz. Örneğin:

    suite.only('Workspace', function () {
      suite('updateToolbox', function () {
        test('test name', function () {
          // ...
        });
        test.skip('test I don’t care about', function () {
          // ...
        });
      });
    });
    

    Kodunuzu uygulamadan önce bunları kaldırmayı unutmayın.

Blok Oluşturma Aracı Testleri

Her bloğun kendi birim testleri vardır. Bu testler, blokların istendiği gibi işleyen kod oluşturduğunu doğrular.

  1. Firefox veya Safari'de tests/generators/index.html yükleyin. Chrome ve Opera'da, testlerin yerel "file://" sisteminden yüklenmesini engelleyen güvenlik kısıtlamaları olduğunu unutmayın (41024 ve 47416 sorunları).
  2. Açılır menüden test edilecek sistemin ilgili bölümünü seçin ve "Yükle"yi tıklayın. Çalışma alanında bloklar görünür.
  3. "JavaScript"i tıklayın.
    Oluşturulan kodu kopyalayıp bir JavaScript konsolunda çalıştırın. Çıkış "OK" ile bitiyorsa test başarılıdır.
  4. "Python"u tıklayın.
    Oluşturulan kodu kopyalayıp bir Python yorumlayıcısında çalıştırın. Çıkış "OK" ile bitiyorsa test başarılıdır.
  5. "PHP"yi tıklayın.
    . Oluşturulan kodu bir PHP yorumlayıcısında kopyalayıp çalıştırın. Çıkış "OK" ile bitiyorsa test başarılıdır.
  6. "Lua"yı tıklayın.
    . Oluşturulan kodu bir Lua yorumlayıcısında kopyalayıp çalıştırın. Çıkış "OK" ile bitiyorsa test başarılıdır.
  7. "Dart"ı tıklayın.
    . Oluşturulan kodu bir Dart yorumlayıcısında kopyalayıp çalıştırın. Çıkış "OK" ile bitiyorsa test başarılıdır.

Engelleme Oluşturucu Testlerini Düzenleme

  1. tests/generators/index.html dosyasını bir tarayıcıda açın.
  2. Açılır menüden sistemin ilgili bölümünü seçin ve "Yükle"yi tıklayın. Çalışma alanında bloklar görünür.
  3. Bloklarda değişiklik veya ekleme yapın.
  4. "XML"i tıklayın.
  5. Oluşturulan XML'i tests/generators/ içindeki uygun dosyaya kopyalayın.