2017-08-02 200 views
2

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

在这里,我提供我的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尝试,但仍需要更多的配置,我不知道该怎么做。任何人有任何想法?

+0

几个月前我遇到了无头浏览器的问题,一些测试失败了,因为它无法将浏览器滚动到我试图查看它们是否存在的元素。如果你有一些失败的测试,记住这一点。 无论如何,你为什么要运行ng服务而不是ng测试? –

+0

,因为我将在稍后的时刻运行'test'命令 –

+0

您是否在使用Selenium webdriver for NodeJS或者您正在使用protactor? –

回答

2

,我发现了一个办法做到这一点:

我我的前端内安装了Chrome Dockerfile:

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 
    } 
}, 
+0

是的,我发现这种方法也适用。 – cuznerdexter

0

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

除了该容器,你可以使用the chrome standalone server作为无头的浏览器,这样就可以从硒容器执行单元测试,我们会打电话给这个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 
+0

谢谢。我会试试看,因为我还没有熟练使用Docker,因此我会在接下来的几天给你提供更新。 –

+0

@PanosVakalopoulos然后这是学习Docker的核心概念的好方法,例如运行多个容器,将它们连接在一起,以及码头工作,祝你好运! – Serey

+0

为什么我应该调查硒,因为我现在正在工作,仅用于单元测试?是不是只需要e2e测试的硒webdriver? –

相关问题