Kiểm thử tự động bằng Chrome không có giao diện người dùng

Nếu bạn muốn chạy kiểm thử tự động bằng Headless Chrome, hãy tham khảo bài viết này! Bài viết này sẽ hướng dẫn bạn thiết lập mọi thứ bằng cách sử dụng Karma làm trình chạy và Mocha+Chai để tạo kiểm thử.

Những yếu tố này là gì?

Karma, Mocha, Chai, Chrome không có giao diện người dùng, ôi!

Karma là một bộ kiểm thử hoạt động với bất kỳ khung kiểm thử phổ biến nào (Jasmine, Mocha, QUnit).

Chai là một thư viện xác nhận hoạt động với Node và trong trình duyệt. Chúng ta cần cái sau.

Chrome không có giao diện người dùng là một cách để chạy trình duyệt Chrome trong môi trường không có giao diện người dùng mà không cần giao diện người dùng đầy đủ của trình duyệt. Một trong những lợi ích của việc sử dụng Chrome không có giao diện người dùng (thay vì kiểm thử trực tiếp trong Node) là các kiểm thử JavaScript của bạn sẽ được thực thi trong cùng một môi trường với người dùng trang web của bạn. Chrome không có giao diện người dùng cung cấp cho bạn ngữ cảnh trình duyệt thực mà không gây hao tổn bộ nhớ khi chạy phiên bản đầy đủ của Chrome.

Thiết lập

Cài đặt

Cài đặt Karma, các trình bổ trợ và trình chạy kiểm thử có liên quan bằng yarn:

yarn add --dev karma karma-chrome-launcher karma-mocha karma-chai
yarn add --dev mocha chai

hoặc sử dụng npm:

npm i --save-dev karma karma-chrome-launcher karma-mocha karma-chai
npm i --save-dev mocha chai

Tôi đang sử dụng MochaChai trong bài đăng này, nhưng nếu bạn không thích, hãy chọn thư viện xác nhận mà bạn yêu thích và hoạt động trong trình duyệt.

Định cấu hình Karma

Tạo tệp karma.conf.js sử dụng trình chạy ChromeHeadless.

karma.conf.js

module.exports = function(config) {
  config.set({
    frameworks: ['mocha', 'chai'],
    files: ['test/**/*.js'],
    reporters: ['progress'],
    port: 9876,  // karma web server port
    colors: true,
    logLevel: config.LOG_INFO,
    browsers: ['ChromeHeadless'],
    autoWatch: false,
    // singleRun: false, // Karma captures browsers, runs the tests and exits
    concurrency: Infinity
  })
}

Viết mã kiểm thử

Tạo chương trình kiểm thử trong /test/test.js.

/test/test.js

describe('Array', () => {
  describe('#indexOf()', () => {
    it('should return -1 when the value is not present', () => {
      assert.equal(-1, [1,2,3].indexOf(4));
    });
  });
});

Chạy chương trình kiểm thử

Thêm tập lệnh test trong package.json để chạy Karma với các chế độ cài đặt của chúng ta.

package.json

"scripts": {
  "test": "karma start --single-run --browsers ChromeHeadless karma.conf.js"
}

Khi bạn chạy kiểm thử (yarn test), Headless Chrome sẽ khởi động và xuất kết quả ra thiết bị đầu cuối:

Kết quả từ Karma.

Tạo trình chạy Chrome không có giao diện người dùng của riêng bạn

Trình chạy ChromeHeadless rất tuyệt vời vì có thể dùng ngay để kiểm thử trên Headless Chrome. Tệp này bao gồm các cờ Chrome phù hợp cho bạn và khởi chạy phiên bản gỡ lỗi từ xa của Chrome trên cổng 9222.

Tuy nhiên, đôi khi bạn có thể muốn truyền cờ tuỳ chỉnh đến Chrome hoặc thay đổi cổng gỡ lỗi từ xa mà trình chạy sử dụng. Để làm việc đó, hãy tạo một trường customLaunchers mở rộng trình chạy ChromeHeadless cơ sở:

karma.conf.js

module.exports = function(config) {
  ...

  config.set({
    browsers: ['Chrome', 'ChromeHeadless', 'MyHeadlessChrome'],

    customLaunchers: {
      MyHeadlessChrome: {
        base: 'ChromeHeadless',
        flags: ['--disable-translate', '--disable-extensions', '--remote-debugging-port=9223']
      }
    },
  }
};

Chạy tất cả trên Travis CI

Việc định cấu hình Karma để chạy kiểm thử trong Headless Chrome là phần khó khăn. Bạn chỉ cần thêm vài dòng mã nữa là có thể tích hợp liên tục trong Travis!

Để chạy chương trình kiểm thử trong Travis, hãy sử dụng dist: trusty và cài đặt tiện ích bổ sung ổn định của Chrome:

.travis.yml

language: node_js
node_js:
  - "7"
dist: trusty # needs Ubuntu Trusty
# Note: if you switch to sudo: false, you'll need to launch Chrome with --no-sandbox.
# See https://github.com/travis-ci/travis-ci/issues/8836
sudo: required
addons:
  chrome: stable # have Travis install Chrome stable.
cache:
  yarn: true
  directories:
    - node_modules
install:
  - yarn
script:
  - yarn test