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

6
我已经创建了一个运行Angular项目的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"]

我尝试使用无头Chrome,但仍需要一些我不知道如何配置的内容。有没有人有任何想法?


几个月前,我遇到了无头浏览器的问题,一些测试失败了,因为它无法将浏览器滚动到我想要查看其是否存在的元素。如果您有一些测试失败了,请记住这一点。不管怎样,为什么你要运行ng serve而不是ng test呢? - Bogdan Bogdanov
你是在使用NodeJS的Selenium webdriver还是在使用Protractor? - Tarun Lalwani
我正在使用预配置的karma运行测试,因为我使用Angular CLI。我不太清楚其中哪一个被使用了。我该如何检查呢? - Panos Vakalopoulos
这个回答解决了你的问题吗?如何从Docker容器中运行Karma测试? - Nishant
嗨@Nishant。自从我发布了这个问题已经过去5年了,下面你可以看到我实际上做了你在那个问题中建议的相同的事情;) - Panos Vakalopoulos
显示剩余2条评论
2个回答

3

经过大量调查,我找到了一种方法来实现这个目标:

我在我的前端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

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

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

0

如果你正在使用Selenium,我建议你创建一个不同的容器来执行Selenium测试,我们称之为selenium-container。由于你正在使用Node,有一个Node的Selenium webdriver存在,你可以在其中编写单元测试。

除此之外,你可以使用Chrome独立服务器作为无头浏览器,以便从selenium容器中执行单元测试,我们称之为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

谢谢。我要试一试,因为我还不熟练使用 Docker,我会在接下来的几天给你更新。 - Panos Vakalopoulos
@PanosVakalopoulos 那么这是学习 Docker 核心概念的好方法,例如运行多个容器、将它们链接在一起以及使用 docker-compose,祝你好运! - Serey
我现在只从事单元测试,为什么要研究Selenium呢?难道Selenium WebDriver只有在端到端测试时才需要吗? - Panos Vakalopoulos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接