如何在Docker容器中运行单元测试

时间:2017-08-02 10:36:51

标签: angular docker karma-jasmine

我创建了一个运行我的角度项目的docker容器,现在我试图在容器内运行我的单元测试失败。我需要一个无头浏览器来运行我的测试,而PhantomJS对于我的口味来说太麻烦了,在运行测试时也会给Chrome带来不同的结果。

在这里,我提供了我的Dockerfile:

# download (or use if it's in cache) the latest official image from node
FROM node:latest

# create directory in the container and set all privileges
RUN mkdir -p /usr/src/app && chmod 777 /usr/src/app

# make the directory available for following commands
WORKDIR /usr/src/app

# copy all local's frontend content to the WORKDIR
COPY . /usr/src/app

# Expose the port the app runs in
EXPOSE 4200

CMD ["npm", "start"]

我尝试使用Headless Chrome,但它还需要一些我不知道如何操作的配置。有没有想过的人?

2 个答案:

答案 0 :(得分:2)

经过大量调查后,我找到了一种方法:

我在我的前端Dockerfile中安装了Chrome:

RUN wget -q -O - https://dl.google.com/linux/linux_signing_key.pub | apt-key add -
RUN echo 'deb http://dl.google.com/linux/chrome/deb/ stable main' >> /etc/apt/sources.list
RUN apt-get update && apt-get install --no-install-recommends -y google-chrome-stable

我使用无头Chrome进行测试,并使用karma.config中的正确配置:

browsers: ['Chrome_without_sandbox'],
customLaunchers: {
  Chrome_without_sandbox: {
    base: 'ChromeHeadless',
    flags: ['--no-sandbox'] // with sandbox it fails under Docker
  }
},

答案 1 :(得分:0)

如果你使用的是Selenium,我建议你创建一个不同的容器来执行selenium测试,我们称之为selenium-container。由于您使用的是Node,因此您可以编写单元测试的现有selenium webdriver for node

除了该容器,您可以使用the chrome standalone server作为无头浏览器,以便您可以从selenium-container执行单元测试,我们将其称为chrome-container

编写单元测试时,可以通过以下方式连接到无头浏览器服务器来开始测试:

var driver = new webdriver.Builder()
    .forBrowser('chrome')
    .usingServer('http://localhost:4444/wd/hub')

这只是为了让您入门,API已有详细记录且易于使用以编写测试。

将单元测试与Angular项目隔离开来是很好的,这样它们就不会以任何方式相互干扰。可以使用docker compose在一个命令中开始测试。您的docker-compose.yml可能如下所示:

version: '3'
services:
  angular-app:
    build:
      context: .
      dockerfile: Dockerfile
  selenium_container: 
    build:
      context: .
      dockerfile: Dockerfile.selenium.test
    depends_on:
      - chrome-container
      - angular-app
  chrome-container:
    image: selenium/standalone-chrome:3.4.0-einsteinium