Chrome uzantıları nasıl test edilir?


154

Bunu yapmanın iyi bir yolu var mı? Bir web sitesi ile içerik komut dosyası olarak etkileşimde bulunan ve localstorage kullanarak veri kaydeden bir uzantı yazıyorum. Bu davranışı sınamak için kullanabileceğim araçlar, çerçeveler vb. Var mı? Javascript test etmek için bazı genel araçlar olduğunu biliyorum, ama bunlar bir uzantı test etmek için yeterli güç? Birim testi en önemlisidir, ancak diğer test türleriyle de ilgileniyorum (entegrasyon testi gibi).


8
Sadece Chrome'da değil, tüm tarayıcılarda tarayıcı uzantıları için birim testi ve entegrasyon testini ele alan standart bir cevap yazdım . "Tarayıcı uzantılarını test etme" yanıtına bakın .
Rob W

Yanıtlar:


111

Evet, mevcut çerçeveler oldukça faydalı.

Yakın geçmişte, tüm testlerimi uygulamaya yerleştirilmiş ancak fiziksel olarak yazılmadığı sürece erişilemeyen bir "test" sayfasına yerleştirdim.

Örneğin, bir sayfadaki tüm testleri aşağıda chrome-extension://asdasdasdasdad/unittests.html

Testlerin localStorage , içerik komut dosyaları erişen vb teoride test sayfanızda gömülü IFRAME'ler aracılığıyla bu test edebilir, ancak bunlar daha fazladır entegrasyon seviyesi testi, ünite testleri soyut gerektirebilir ki uzağa kadar gerçek sayfalarından sen misin localStorage'a erişim ile onlara bağımlı olmayın.

Sayfaları doğrudan test etmek istiyorsanız, uzantınızı yeni sekmeler açmak için düzenleyebilirsiniz (chrome.tab.create ({"url": "someurl"}). Yeni sekmelerin her biri için içerik komut dosyanız çalışmalı ve kullanabilirsiniz kodunuzun yapması gerekeni yaptığını kontrol etmek için test çerçeveniz.

Çerçevelere gelince, JsUnit veya daha yeni Yasemin iyi çalışmalıdır.


1
Haklısınız, gerçek sayfaları test etmek birim testine girmez. Sorumu daha geniş yapmalıydım. Ama yine de test etmek istediğim bir şey, özellikle web sitesi html yapısı her zaman değişebilir. Soruyu değiştirdim.
swampsjohn

1
Hala birim test sayfanızdaki IFrames üzerinden test ederdim. İçerik komut dosyaları yine de
tetiklenmelidir

3
Proxy örnek uzantısının yalnızca gerekli olan Chrome API'lerinin parçalarını ve parçalarını alay eden bazı testleri vardır: code.google.com/chrome/extensions/samples.html#chrome.proxy . Ayrıca meslektaşımız Boris test için QUnit kullandı onun "model" katmanı: github.com/borismus/Question-Monitor-for-Stack-Exchange/tree/…
Paul Irish

63

Birkaç krom uzantı üzerinde çalışarak , ve sinon-chromekullanarak birim testleri gerçekleştirmeye izin veren bir proje hazırladım .mochanodejsphantomjs

Temel olarak, chrome.*önceden tanımlanmış json yanıtları koyabileceğiniz tüm API'ların sinon alaylarını oluşturur .

Daha sonra, komut dosyalarınızı vm.runInNewContextarka plan sayfası ve phantomjsaçılır pencere / seçenekler sayfası için düğümleri kullanarak yüklersiniz .

Ve son olarak, krom api'nin gerekli argümanlarla çağrıldığını iddia ediyorsunuz.

Bir örnek verelim:
Düğme rozetinde açılan sekmelerin sayısını gösteren basit bir krom uzantımız var.

arka plan sayfası:

chrome.tabs.query({}, function(tabs) {
  chrome.browserAction.setBadgeText({text: String(tabs.length)});
});

Test etmek için ihtiyacımız var:

  1. chrome.tabs.queryönceden tanımlanmış yanıtı döndürmek için alay eder, örneğin iki sekme.
  2. bizim alaycı chrome.*api bazı çevreye enjekte
  3. uzantı kodumuzu bu ortamda çalıştır
  4. Düğme rozetinin "2" ye eşit olduğunu iddia

Kod pasajı aşağıdaki gibidir:

const vm = require('vm');
const fs = require('fs');
const chrome = require('sinon-chrome');

// 1. mock `chrome.tabs.query` to return predefined response 
chrome.tabs.query.yields([
  {id: 1, title: 'Tab 1'}, 
  {id: 2, title: 'Tab 2'}
]);

// 2. inject our mocked chrome.* api into some environment
const context = {
  chrome: chrome
};

// 3. run our extension code in this environment
const code = fs.readFileSync('src/background.js');
vm.runInNewContext(code, context);

// 4. assert that button badge equals to '2'
sinon.assert.calledOnce(chrome.browserAction.setBadgeText);
sinon.assert.calledWithMatch(chrome.browserAction.setBadgeText, {
  text: "2"
});

Şimdi mocha'nın describe..itişlevlerine sarıp terminalden çalışabiliriz:

$ mocha

background page
  ✓ should display opened tabs count in button badge

1 passing (98ms)

Tam örneği burada bulabilirsiniz .

Buna ek olarak, sinon-chrome, önceden tanımlanmış bir yanıtla herhangi bir krom etkinliğini tetiklemeye izin verir, örn.

chrome.tab.onCreated.trigger({url: 'http://google.com'});

Örneğin bağlantısı kesilmiş gibi görünüyor - lütfen güncelleyebilir misiniz?
Raisen

1
Örnek bağlantısı güncellendi. Ayrıca sinon-chrome şimdi github.com/acvetkov'a taşındı ve yakında yeni örnekler olacak
vitalets

3

İken sinon.jsçalışan harika görünüyor, ayrıca sadece düz Jasmine'i kullanmak ve Chrome gerekmez geri aramalar alay edebilir. Misal:

sahte

chrome = {
  runtime: {
    onMessage : {
      addListener : function() {}
    }
  }
}

Ölçek

describe("JSGuardian", function() {

  describe("BlockCache", function() {

    beforeEach(function() {
      this.blockCache = new BlockCache();
    });

    it("should recognize added urls", function() {
      this.blockCache.add("http://some.url");
      expect(this.blockCache.allow("http://some.url")).toBe(false);
    });
} // ... etc

SpecRunner.htmlKodunuzu çalıştırmak için varsayılanı değiştirmeniz yeterlidir.


2

Chrome'da zaten mevcut olan araç hakkında:

  1. Chrome geliştirici aracında Yerel depolama için Kaynaklar bölümü vardır.

    Geliştirici Araçları> Kaynaklar> Yerel Depolama

    Yerel depolama değişikliklerine bakın.

  2. Performansı test etmek ve çalışma zamanı çağrı yığınını izlemek için console.profile dosyasını kullanabilirsiniz.

  3. fileSystem için Dosyanızın yüklenmiş olup olmadığını kontrol etmek için bu URL'yi kullanabilirsiniz: dosya sistemi: chrome-extension: /// geçici /

İçerik komut dosyası ve yerel depolamayı arka plan sayfası / komut dosyası olmadan ve ileti geçirmeden kullanıyorsanız, yerel depolamaya yalnızca bu siteden erişilebilir. Bu nedenle, bu sayfaları test etmek için test komut dosyanızı bu sekmelere enjekte etmeniz gerekir.


1
Benim için işe yaramadı, ama benim javascript beni daha da ilerletti. Bunun için +1.
mobibob

FileSystem için Şunları kullanabilirsiniz: filesystem: chrome-extension: // <yourextension-id> / geçici /
Nafis Ahmad

1

Ben kullanabileceklerini keşfettiler Selenyum web sürücüsünü önceden yüklenmiş uzantısı ve taze bir tarayıcı penceresi başlangıç için pyautogui Selenyum uzantısı "görünümü" sürücü olamaz çünkü - tıklamalar için. Tıklamalardan sonra ekran görüntüleri yapabilir ve bunları% 95 benzerlik bekleyerek 'beklenen' ile karşılaştırabilirsiniz (çünkü farklı tarayıcılarda birkaç piksele işaretleme hareketleri kabul edilebilir).


0

Önceki birkaç cevabı onaylamak için Jasmine, Chrome uzantılarıyla iyi çalışıyor gibi görünüyor. 3.4.0 sürümünü kullanıyorum.

Çeşitli API'ler için kolayca test çiftleri oluşturmak için Jasmine casuslarını kullanabilirsiniz . Sıfırdan kendi inşa etmeye gerek yok. Örneğin:

describe("Test suite", function() {

  it("Test case", function() {

    // Set up spies and fake data.
    spyOn(chrome.browserAction, "setPopup");
    spyOn(chrome.identity, "removeCachedAuthToken");
    fakeToken = "faketoken-faketoken-faketoken";
    fakeWindow = jasmine.createSpyObj("window", ["close"]);

    // Call the function under test.
    logout(fakeWindow, fakeToken);

    // Perform assertions.
    expect(chrome.browserAction.setPopup).toHaveBeenCalledWith({popup: ""});
    expect(chrome.identity.removeCachedAuthToken).toHaveBeenCalledWith({token: fakeToken});
    expect(fakeWindow.close.calls.count()).toEqual(1);

  });

});

Yardımcı olursa bazı ayrıntılar:

Başka bir cevapta belirtildiği gibi, tarayıcı uzantımın bir parçası olarak testlerimi çalıştıran bir HTML sayfası oluşturdum. HTML sayfasında Jasmine kitaplığı, uzantımın JavaScript kodu ve test takımım var. Testler otomatik olarak yapılır ve sonuçlar sizin için biçimlendirilir. Test çalıştırıcısı veya sonuç biçimlendiricisi oluşturmanıza gerek yoktur. Sadece kurulum talimatlarını takip edin test çalıştırıcı sayfanızı oluşturmak için orada belgelenen HTML'yi kullanmanız ve test takımınızı sayfaya da eklemeniz yeterlidir.

Yasemin çerçevesini başka bir ana bilgisayardan dinamik olarak alabileceğinizi düşünmüyorum, bu yüzden Yasemin yayınımı uzantıma ekledim. Elbette üretim için uzantımı oluşturduğumda ve test senaryolarımı atlayacağım.

Testlerimi komut satırında nasıl yürüteceğime bakmadım. Bu, otomatik dağıtım araçları için kullanışlıdır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.