Làm thế nào để kiểm tra tiện ích chrome?


154

Có một cách tốt để làm điều này? Tôi đang viết một tiện ích mở rộng tương tác với một trang web dưới dạng tập lệnh nội dung và lưu dữ liệu bằng cách sử dụng bộ lưu trữ cục bộ. Có bất kỳ công cụ, khung, vv mà tôi có thể sử dụng để kiểm tra hành vi này không? Tôi nhận thấy có một số công cụ chung để kiểm tra javascript, nhưng những công cụ đó có đủ sức mạnh để kiểm tra tiện ích mở rộng không? Kiểm thử đơn vị là quan trọng nhất, nhưng tôi cũng quan tâm đến các loại thử nghiệm khác (chẳng hạn như thử nghiệm tích hợp).


8
Tôi vừa viết một câu trả lời chính tắc nhằm kiểm tra đơn vị kiểm tra và tích hợp cho các tiện ích mở rộng trình duyệt trên tất cả các trình duyệt, không chỉ Chrome. Xem câu trả lời cho "Kiểm tra phần mở rộng trình duyệt" .
Rob W

Câu trả lời:


111

Vâng, các khung hiện có là khá hữu ích ..

Trong quá khứ gần đây, tôi đã đặt tất cả các bài kiểm tra của mình trên trang "kiểm tra" được nhúng vào ứng dụng nhưng không thể truy cập được trừ khi được gõ vật lý.

Chẳng hạn, tôi sẽ có tất cả các bài kiểm tra trong một trang có thể truy cập dưới chrome-extension://asdasdasdasdad/unittests.html

Các bài kiểm tra sẽ có quyền truy cập, localStoragev.v. Để truy cập các tập lệnh nội dung, về lý thuyết bạn có thể kiểm tra thông qua IFRAME được nhúng trong trang thử nghiệm của mình, tuy nhiên đây là các bài kiểm tra mức độ tích hợp hơn, các bài kiểm tra đơn vị sẽ yêu cầu bạn trừu tượng ra khỏi các trang thực để bạn không phụ thuộc vào họ, tương tự như vậy với quyền truy cập vào localStorage.

Nếu bạn muốn kiểm tra các trang trực tiếp, bạn có thể sắp xếp tiện ích mở rộng của mình để mở các tab mới (chrome.tab.create ({"url": "someurl"}). Đối với mỗi tab mới, tập lệnh nội dung của bạn sẽ chạy và bạn có thể sử dụng khung kiểm tra của bạn để kiểm tra xem mã của bạn đã làm những gì nó nên làm.

Đối với các khung, JsUnit hoặc Jasmine gần đây sẽ hoạt động tốt.


1
Bạn nói đúng, kiểm tra các trang thực không thuộc thử nghiệm đơn vị. Tôi nên làm cho câu hỏi của tôi rộng hơn. Nhưng đây vẫn là thứ tôi muốn thử nghiệm, đặc biệt là vì cấu trúc html của trang web có thể thay đổi bất cứ lúc nào. Tôi đã sửa đổi câu hỏi.
swampjohn

1
Tôi sẽ kiểm tra thông qua IFrames trong trang thử nghiệm đơn vị của bạn. Các tập lệnh nội dung vẫn sẽ kích hoạt (nếu bạn cho phép các tập lệnh chạy trong iFrame)
Kinlan

3
Tiện ích mở rộng mẫu proxy có một số thử nghiệm chỉ giả định các bit và mẩu API Chrome cần thiết: code.google.com/chrom/extensions/samples.html#chrome.proxy .. Ngoài ra, đồng nghiệp của chúng tôi, Boris đã sử dụng QUnit để thử nghiệm lớp "mô hình" của anh ấy: github.com/borismus/Question-Monitor-for-Stack-Exchange/tree/ mẹo
Paul Irish

63

Làm việc trên nhiều phần mở rộng chrome tôi đã đưa ra sinon-chromedự án cho phép để chạy đơn vị xét nghiệm sử dụng mocha, nodejsphantomjs.

Về cơ bản, nó tạo ra các giả lập sinon của tất cả các chrome.*API nơi bạn có thể đặt bất kỳ phản hồi json nào được xác định trước.

Tiếp theo, bạn tải tập lệnh của mình bằng cách sử dụng nút vm.runInNewContextcho trang nền và phantomjsđể hiển thị trang bật lên / tùy chọn.

Và cuối cùng, bạn khẳng định rằng api chrome được gọi với các đối số cần thiết.

Hãy lấy một ví dụ:
Giả sử chúng ta có tiện ích chrome đơn giản hiển thị số lượng tab đã mở trong huy hiệu nút.

trang nền:

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

Để kiểm tra nó, chúng ta cần:

  1. giả chrome.tabs.queryđể trả về phản hồi được xác định trước, ví dụ hai tab.
  2. tiêm chrome.*api giả của chúng tôi vào một số môi trường
  3. chạy mã mở rộng của chúng tôi trong môi trường này
  4. khẳng định rằng huy hiệu nút bằng '2'

Đoạn mã sau:

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"
});

Bây giờ chúng ta có thể gói nó vào các describe..itchức năng của mocha và chạy từ thiết bị đầu cuối:

$ mocha

background page
  ✓ should display opened tabs count in button badge

1 passing (98ms)

Bạn có thể tìm thấy ví dụ đầy đủ ở đây .

Ngoài ra, sinon-chrome cho phép kích hoạt bất kỳ sự kiện chrome nào với phản hồi được xác định trước, ví dụ:

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

Liên kết cho ví dụ dường như đã chết - bạn có thể vui lòng cập nhật nó không?
Raisen

1
Cập nhật liên kết đến ví dụ. Ngoài ra sinon-chrome hiện được chuyển sang github.com/acvetkov và sẽ sớm có ví dụ mới
Vitalets

3

Mặc dù sinon.jscó vẻ hoạt động rất tốt, bạn cũng có thể chỉ cần sử dụng Jasmine đơn giản và chế nhạo các cuộc gọi lại Chrome mà bạn cần. Thí dụ:

Chế nhạo

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

Kiểm tra

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

Chỉ cần sửa đổi mặc định SpecRunner.htmlđể chạy mã của bạn.


2

Về công cụ đã có trong Chrome:

  1. Trong công cụ phát triển chrome, có phần Tài nguyên dành cho lưu trữ cục bộ.

    Công cụ dành cho nhà phát triển> Tài nguyên> Bộ nhớ cục bộ

    Xem những thay đổi của lưu trữ cục bộ ở đó.

  2. Bạn có thể sử dụng console.profile để kiểm tra hiệu năng và xem ngăn xếp cuộc gọi thời gian chạy.

  3. đối với tệp Hệ thống Bạn có thể sử dụng URL này để kiểm tra tệp của mình có được tải lên hay không: filesystem: chrome-extension: /// tạm thời /

Nếu bạn đang sử dụng tập lệnh nội dung và bộ nhớ cục bộ cùng nhau mà không có trang / tập lệnh nền và không có tin nhắn đi qua, bộ nhớ cục bộ sẽ chỉ có thể truy cập từ trang web đó. Vì vậy, để kiểm tra các trang đó, bạn phải đưa tập lệnh kiểm tra của mình vào các tab đó.


1
Nó không làm việc cho tôi, nhưng nó đã giúp tôi tiến xa hơn trong javascript của mình. +1 cho điều đó.
mobibob

Đối với tệp Hệ thống Bạn có thể sử dụng: hệ thống tệp: chrome-extension: // <yourextension-id> / tạm thời /
Nafis Ahmad

1

Tôi thấy rằng tôi có thể sử dụng trình điều khiển web Selenium để bắt đầu phiên bản trình duyệt mới với tiện ích mở rộng được cài đặt sẵn và pyautogui cho các nhấp chuột - vì Selenium không thể điều khiển "xem" tiện ích mở rộng. Sau khi nhấp, bạn có thể tạo ảnh chụp màn hình và so sánh chúng với 'dự kiến', mong đợi 95% tương tự (vì trên các trình duyệt khác nhau, chuyển động đánh dấu chấp nhận được với một vài pixel).


0

Để xác nhận một vài câu trả lời trước đó, Jasmine dường như hoạt động tốt với các tiện ích mở rộng của Chrome. Tôi đang sử dụng phiên bản 3.4.0.

Bạn có thể sử dụng gián điệp Jasmine để dễ dàng tạo các bài kiểm tra nhân đôi cho các API khác nhau. Không cần phải xây dựng của riêng bạn từ đầu. Ví dụ:

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);

  });

});

Một số chi tiết, nếu nó giúp:

Như đã đề cập trong một câu trả lời khác, tôi đã tạo một trang HTML như một phần của tiện ích mở rộng trình duyệt chạy thử nghiệm của mình. Trang HTML bao gồm thư viện Jasmine, cộng với mã JavaScript của tiện ích mở rộng của tôi, cộng với bộ thử nghiệm của tôi. Các bài kiểm tra được chạy tự động và kết quả được định dạng cho bạn. Không cần phải xây dựng một người chạy thử nghiệm hoặc một định dạng kết quả. Chỉ cần làm theo các hướng dẫn cài đặt và sử dụng tài liệu HTML ở đó để tạo trang chạy thử nghiệm của bạn và bao gồm cả bộ thử nghiệm của bạn trong trang.

Tôi không nghĩ rằng bạn có thể tìm nạp khung công tác Jasmine một cách linh hoạt từ một máy chủ khác, vì vậy tôi chỉ đưa phiên bản Jasmine vào tiện ích mở rộng của mình. Tôi sẽ bỏ qua nó và tất cả các trường hợp thử nghiệm của tôi khi tôi xây dựng phần mở rộng của mình cho sản xuất, tất nhiên.

Tôi đã không nhìn vào cách thực hiện các thử nghiệm của mình tại dòng lệnh. Điều đó sẽ có ích cho các công cụ triển khai tự động.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.