【发布时间】:2019-07-24 19:04:07
【问题描述】:
我试图将我的角度 e2e 测试 dockerize。简单来说,我创建了一个 docker-compose.test.yml 文件:
version: "3.4"
services:
# set up angular app
angular:
build:
context: ./frontend
dockerfile: sample.Dockerfile
target: test
image: angular:test
container_name: angular
ports:
- "4200:4200"
depends_on:
- nodejs
command: npm run e2e -- --protractor-config=e2e/protractor-docker.conf.js --host 0.0.0.0
nodejs:
build:
context: ./backend
dockerfile: Dockerfile
target: development
image: nodejs:dev
container_name: nodejs
ports:
- "3000:3000"
networks:
- backend
depends_on:
- db
restart: always
# the mongo database
db:
image: mongo
container_name: db
networks:
- backend
ports:
- "27017:27017"
networks:
backend:
driver: bridge
对于量角器配置,我按照此链接中的教程进行操作:
Angular Tutorial for Travis CI
我不得不做一些调整,例如:
let config = require('./protractor.conf').config;
// Tell protrator where the chrome driver is
// https://gitlab.com/dasch8/angular-ci/
// https://hub.docker.com/r/weboaks/node-karma-protractor-chrome/
config.chromeDriver = "/usr/bin/chromedriver";
config.allScriptsTimeout = 60000;
config.getPageTimeout = 60000;
config.jasmineNodeOpts.defaultTimeoutInterval = 60000;
// have it connect to the angular app
// config.baseUrl = "http://angular:4200";
config.capabilities = {
browserName: 'chrome',
chromeOptions: {
args: ['--headless', '--no-sandbox', '--disable-gpu']
},
};
exports.config = config;
使用配置,e2e 测试在我的本地机器上成功。但是,当我在 .travis.yml 的脚本中运行它时:
before_script:
- docker-compose -f docker-compose.test.yml build
script:
- docker-compose -f docker-compose.test.yml run --name angular -p 4200:4200 angular
Travis CI 失败。输出为:
- Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.
- Failed: Timed out waiting for asynchronous Angular tasks to finish after 60 seconds. This may be because the current page is not an Angular application. Please see the FAQ for more details: https://github.com/angular/protractor/blob/master/docs/timeouts.md#waiting-for-angular
这很奇怪,因为我写道:
import { AppPage } from './app.po';
// Test bed
describe('workspace-project App', () => {
let page: AppPage;
beforeEach(() => {
page = new AppPage();
});
it('should display navbar with title', () => {
page.navigateTo().then(() => {
console.log('Successfully connected to the page');
});
expect(page.getHeaderText()).toEqual('hobbies');
});
});
在 Travis CI 的日志中,日志会打印出来:
成功连接到页面。其余日志可在此处找到:
我不确定我做错了什么。测试在我的本地机器上通过真是太奇怪了。我尝试通过使用 selenium/hub 和 selenium/node-chrome 图像以不同的方式解决此问题,并使量角器连接到该 selenium 服务器。这是同一个故事。我让它在我的本地机器上工作,但它在 TravisCI 中失败了。我将在另一个问题中询问硒问题。
【问题讨论】:
-
你的意思是端到端测试在容器中在你的机器上是成功的,还是你直接运行它们?当你在本地使用这些 docker-compose 命令时会发生什么?
-
容器中的端到端测试在我的机器上是成功的。当我在本地运行 docker-compose 命令时,测试通过了。 @jonrsharpe
-
你好。我将所有超时值(config.allScriptsTimeout、config.getPageTimeout、config.jasmineNodeOpts.defaultTimeoutInterval)增加到 180000 毫秒。这样做使我的测试通过了 Travis CI。但是,如果我遇到需要更长时间的测试怎么办?我是否必须猜测适当的超时时间才能确保我的测试在 Travis CI 中通过?
-
我建议仔细研究失败的确切位置并在此之前添加动态等待。它在您的测试中是否始终在同一点失败?
-
@C.Peck 是的,它一直在同一点失败。我也在考虑添加等待。
标签: angular selenium docker protractor travis-ci