Gitlab CI, выполняющий тесты Angular Jasmine без сбоев - PullRequest
0 голосов
/ 15 марта 2019

Просто настроив Gitlab CI для запуска тестов Jasmine в моем проекте Angular, я обнаружил, что конвейер взорвется с очень небольшим указанием причины.

Все мои тесты пройдут при локальном запуске с использованием ng test или локально в Chrome без головы (следуя документам и другому руководству по настройке). Однако конвейер должен пройти примерно 13/90 тестов, а затем отключиться.

Вот пример выходных данных отладки (с logLevel: config.LOG_DEBUG в karma.conf.js ):

HeadlessChrome 74.0.3723 (Linux 0.0.0): Executed 2 of 92 SUCCESS (0 secs / 0.311 secs)
HeadlessChrome 74.0.3723 (Linux 0.0.0): Executed 3 of 92 SUCCESS (0 secs / 0.475 secs)
15 03 2019 00:09:46.911:DEBUG [middleware:source-files]: Requesting /assets/img/logo.png
HeadlessChrome 74.0.3723 (Linux 0.0.0): Executed 11 of 92 SUCCESS (0 secs / 1.659 secs)
15 03 2019 00:09:47.738:DEBUG [middleware:source-files]: Requesting /media/img/showcase-image.jpg
HeadlessChrome 74.0.3723 (Linux 0.0.0): Executed 12 of 92 SUCCESS (0 secs / 1.875 secs)
15 03 2019 00:09:48.312:DEBUG [HeadlessChrome 74.0.3723 (Linux 0.0.0)]: Disconnected during run, waiting 2000ms for reconnecting.
15 03 2019 00:09:48.312:DEBUG [HeadlessChrome 74.0.3723 (Linux 0.0.0)]: EXECUTING -> EXECUTING_DISCONNECTED
15 03 2019 00:09:50.320:WARN [HeadlessChrome 74.0.3723 (Linux 0.0.0)]: Disconnected (0 times)reconnect failed before timeout of 2000ms (transport close)
HeadlessChrome 74.0.3723 (Linux 0.0.0) ERROR
  Disconnectedreconnect failed before timeout of 2000ms (transport close)
HeadlessChrome 74.0.3723 (Linux 0.0.0): Executed 12 of 92 DISCONNECTED (4.476 secs / 1.875 secs)
HeadlessChrome 74.0.3723 (Linux 0.0.0) ERROR
HeadlessChrome 74.0.3723 (Linux 0.0.0): Executed 12 of 92 DISCONNECTED (4.476 secs / 1.875 secs)
15 03 2019 00:09:50.340:DEBUG [karma-server]: Run complete, exiting.

1 Ответ

1 голос
/ 15 марта 2019

Даже с журналами отладки было очень мало, чтобы продолжить.Моей последней надеждой было заглянуть в подозрительные сообщения

[middleware:source-files]: Requesting /assets/img/logo.png
[middleware:source-files]: Requesting /media/img/showcase-image.jpg

.Я также видел журналы, такие как WARN [web-server]: 404: /media/img/showcase-image.png, но они приходили как с локальных прогонов, так и с Gitlab CI.

Было полезно прочитать , как исправить 404 предупреждения для изображений во время тестирования юнитов кармы , а также файлов кармы документов.

Решением было исправить эти 404 и обеспечить, чтобы все мои «фиктивные» URL-адреса тестовых изображений были разрешены до реальных изображений .После чего задача Gitlab CI работала правильно.

Вот конфиг, который мне нужно было добавить в karma.conf.js :

files: [
   {pattern: 'assets/img/*.png', watched: false, included: false, served: true, nocache: false},
   {pattern: 'testing/assets/img/*.png', watched: false, included: false, served: true, nocache: false}
],
proxies: {
   "/assets/": "/base/assets/",
   "/media/": "/base/testing/assets/img/"
},

Объяснение

My AngularПриложение использует изображения, связанные в папке assets в проекте Angular, а также изображения, передаваемые из серверной части CMS.

Первый элемент в списке files настраивает Karma для загрузки локальных ресурсов, таких как assets / img / logo.png , в браузер тестирования.Карма обслуживает загруженные активы по /base/ URL, поэтому logo.png может быть доступно по /base/assets/img/logo.png.Первая строка в proxies передает запрос от assets/img/logo.png до /base/assets/img/logo.png, таким образом гарантируя, что logo.png загружается в тест.

Та же идея верна для поддельных URL, предоставленных для изображений, обслуживаемыхCMS.Я добавил «фальшивое» изображение в testing / assets / img / fake.png в моем проекте.В этом случае мой бэкэнд обычно обслуживал статические файлы на /media/, поэтому я смог обновить все свои тесты, указав /media/fake.png в качестве URL-адреса, который проксируется на /base/testing/assets/img/fake.png.

Пример теста

beforeEach(() => {
    fixture = TestBed.createComponent(ProductComponent);
    component = fixture.componentInstance;
    component.product = {
      // other data here
      image: {
        url: '/media/fake.png'
      }
    };
    fixture.detectChanges();
}

it('should display image in card', () => {
    const img = fixture.nativeElement.querySelector('img');
    expect(img.src).toEqual('/media/fake.png')
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...