Тесты кармы с использованием Docker-образа Chrome - PullRequest
0 голосов
/ 03 января 2019

Для тестов на сервере CI я хочу использовать образ Chrome вместо PhantomJS. Я могу сделать это с и без кукловода, но оба требуют, чтобы я установил пакет chrome-stable на сервер. Таким образом, я хочу более легкий метод, следовательно, использование образа докера.

Для Кармы, согласно документам, я должен указать скрипт для браузера, если я хочу использовать собственный браузер. Также Карма передаст 1 аргумент этому сценарию, URL. Для этого требования я также вытащил образ докера без браузера быстрый запуск без браузера .

Я создал сценарий и могу настроить тест Кармы, но похоже, что карма входит в состояние сбоя до того, как сценарий завершится. Любые идеи о том, где я иду не так, как надо. Контейнер выполняется должным образом, и команда curl для localhost: 3000 возвращает ожидаемое.

Пользовательский скрипт

#!/bin/bash

set -euxo pipefail

URL="$1"
# http://localhost:9876/?id=30931514 this is the argument passed in by Karma
# Change the port to the port the docker container exposes 3000
DOCKER_URL=$( echo "$URL" | sed s/9876/3000/g )

killDockerContainer(){
 echo 'Killing Docker Container'
 docker rm -f browserless
}

trap "killDockerContainer; exit 0" EXIT


echo "Launching browserless: $DOCKER_URL"

docker run   -d   -p 3000:3000   --shm-size 2gb   --name browserless   --restart always   -e "DEBUG=browserless/chrome"   -e "MAX_CONCURRENT_SESSIONS=10" browserless/chrome 

Выход из тестового прогона

3 01 2019 11:53:08.471:INFO [karma-server]: Karma v3.1.3 server started at 
http://0.0.0.0:9876/
03 01 2019 11:53:08.471:INFO [launcher]: Launching browsers /software/applications/app/browserle 14% building modules 38/38 modules 0 active03 01 2019 11:53:08.491:INFO [launcher]: Starting browser /software/applications/app/browserless.sh
03 01 2019 11:53:08.491:DEBUG [temp-dir]: Creating temp dir at /tmp/karma-34604420
03 01 2019 11:53:08.543:DEBUG [launcher]: /software/applications/app/browserless.sh http://local 17% building modules 60/60 modules 0 active03 01 2019 11:53:10.906:DEBUG [launcher]: Process /software/applications/app/browserless.sh exited with code 0
03 01 2019 11:53:10.907:ERROR [launcher]: Cannot start /software/applications/app/browserless.sh
        + URL='http://localhost:9876/?id=34604420'
++ sed s/9876/3000/g
++ echo 'http://localhost:9876/?id=34604420'
+ DOCKER_URL='http://localhost:3000/?id=34604420'
+ trap 'killDockerContainer; exit 0' EXIT
+ echo 'Launching browserless: http://localhost:3000/?id=34604420'
+ docker run -d -p 3000:3000 --shm-size 2gb --name browserless --restart always -e DEBUG=browserless/chrome -e MAX_CONCURRENT_SESSIONS=10 domain:9082/browserless/chrome 'http://localhost:3000/?id=34604420'
+ killDockerContainer
+ echo 'Killing Docker Container'
+ docker rm -f browserless
+ exit 0

03 01 2019 11:53:10.907:ERROR [launcher]: /software/applications/app/browserless.sh stdout: Launching browserless: http://localhost:3000/?id=34604420
b7144002bc2c9abc786dbdd015a8426c9afcbd0713f408cf3103e980e2278649
Killing Docker Container
browserless

1 Ответ

0 голосов
/ 04 января 2019

Мне удалось добиться этого с помощью плагина karma-selenium-webdriver-launcher (вместо пользовательского браузера) и использования в качестве изображения селена / автономного хрома (вместо браузера).Я уверен, что этот метод сработал бы и без браузера, но селен дает мне больше возможностей для будущего, таких как различные браузеры и использование сеток селена и т. Д.

Два важных предостережения в том, что имя хоста, которое использует Карма, должноизменить в конфиге на имя хоста, на котором работает vm karma.Другое имя, к которому вы будете относиться, будет где Docker работает.Это также происходит на локальном хосте, поэтому будет использоваться при указании того, где карма ожидает браузер.Теперь, зная, что именно здесь был мой конфигурационный файл кармы, чтобы приступить к работе.

1, еще одна важная вещь, которую следует учитывать, - это случай, когда вы хотите запустить эти тесты на подчиненных jenkins, поэтому жесткое кодирование имени хоста не будет работать.Поэтому вам нужно найти способ получить этот адрес в вашей конфигурации Karma.

const webdriver = require('selenium-webdriver');
module.exports = function (config) {

  config.set({
    basePath: '',
    frameworks: ['jasmine', '@angular-devkit/build-angular'],
    plugins: [
      require('karma-jasmine'),
      require('karma-jasmine-html-reporter'),
      require('karma-coverage-istanbul-reporter'),
      require('karma-selenium-webdriver-launcher'),
      require('@angular-devkit/build-angular/plugins/karma')
    ],
    hostname: 'server_hostname', // Here we need to change from default localhost to the hostname of the server
    client:{
      clearContext: false // leave Jasmine Spec Runner output visible in browser
    },
    coverageIstanbulReporter: {
      dir: require('path').join(__dirname, 'coverage'), reports: [ 'html', 'lcovonly' ],
      fixWebpackSourcePaths: true,
      reporters : ['coverage'],
      preprocessors : {'src/app/*.ts' : 'coverage'}
    },
    angularCli: {
      environment: 'dev'
    },
    reporters: ['progress', 'kjhtml'],
    port: 9876,
    colors: true,
    logLevel: config.LOG_DEBUG,
    autoWatch: false,
    browsers: ['Chrome-wd'],
     customLaunchers: {
        'Chrome-wd': {
                base: 'SeleniumWebdriver',
                browserName: 'Chrome',
                getDriver: function() {
                return new webdriver.Builder()
                        .forBrowser('chrome')
                        .usingServer('http://hostname:4444/wd/hub') // Docker is run using docker run -d -p 4444:4444 -v /dev/shm:/dev/shm selenium/standalone-chrome
                        .build()
                }
        //      flags: ['--no-sandbox', '--headless', '--disable-gpu', '--disable-software-rasterizer', '--disable-dev-shm-usage', '--remote-debugging-port=9222']
        }
    },
    singleRun: true
  });
};
...