Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 使用Chrome的Docker图像进行Karma测试_Angular_Karma Jasmine_Karma Runner_Puppeteer - Fatal编程技术网

Angular 使用Chrome的Docker图像进行Karma测试

Angular 使用Chrome的Docker图像进行Karma测试,angular,karma-jasmine,karma-runner,puppeteer,Angular,Karma Jasmine,Karma Runner,Puppeteer,对于CI服务器上的测试,我希望使用Chrome的映像,而不是PhantomJS。 我可以在有或没有Puppeter的情况下完成这项工作,但两者都需要我在服务器上安装chrome stable软件包。因此,我需要一种更轻量级的方法,即使用docker图像 对于Karma,根据文档,如果我想使用自定义浏览器,我必须为浏览器指定一个脚本。此外,Karma将向这个脚本传递一个参数,url。为了满足这个需求,我还提取了无浏览器的docker图像 我已经创建了脚本,可以进行业力测试,但在脚本完成执行之前,业

对于CI服务器上的测试,我希望使用Chrome的映像,而不是PhantomJS。 我可以在有或没有Puppeter的情况下完成这项工作,但两者都需要我在服务器上安装chrome stable软件包。因此,我需要一种更轻量级的方法,即使用docker图像

对于Karma,根据文档,如果我想使用自定义浏览器,我必须为浏览器指定一个脚本。此外,Karma将向这个脚本传递一个参数,url。为了满足这个需求,我还提取了无浏览器的docker图像

我已经创建了脚本,可以进行业力测试,但在脚本完成执行之前,业力似乎进入了失败状态。你知道我哪里出了问题吗。容器按预期运行,curl命令返回预期的结果

自定义脚本

#!/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

我通过karma selenium webdriver launcher(而不是自定义浏览器)插件并使用selenium/standalone chrome(而不是browserless)作为图像,成功地实现了这一点。我相信这种方法同样适用于无浏览器,但selenium为我提供了更多的未来选择,如不同的浏览器和使用selenium网格等

两个重要的警告是,Karma使用的主机名必须在配置中更改为运行Karma的vm的主机名。你会想到的另一个名字是docker正在运行的地方。这恰好也在localhost上,因此在指定karma期望浏览器的位置时将使用它。现在知道这里有很多是我的因果报应配置文件来实现这一点

1其他重要的事情要考虑的是,你想在詹金斯奴隶上运行这些测试,这样硬编码主机名就不起作用了。因此,你必须找到一种方法,在你的业力配置中获得该地址

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

我必须补充一点,在我的karma配置中使用没有chromium下载的Puppeter和根本不使用它会产生相同的输出