Exit codes и CI интеграция

При работе с Jasmine и запуске тестов через командную строку важно учитывать коды завершения процесса (exit codes). Эти коды играют ключевую роль в автоматизации тестирования, особенно в контексте интеграции с системами непрерывной интеграции (CI).

Когда тесты в Jasmine выполняются, система может вернуть различные exit-коды в зависимости от того, как завершилось выполнение тестов. Это позволяет CI-системам, таким как Jenkins, GitLab CI, Travis CI и другие, правильно интерпретировать результаты тестирования и принимать решения на основе успеха или неудачи тестов.

Что такое Exit код?

Exit код — это числовое значение, которое операционная система или приложение возвращает при завершении работы процесса. В контексте Jasmine exit-код выполняет роль индикатора состояния тестов. В зависимости от его значения можно понять, были ли выполнены тесты успешно или возникли ошибки.

  • 0 — все тесты прошли успешно.
  • 1 — возникла ошибка при выполнении тестов (например, один или несколько тестов не прошли).
  • 2 — произошла ошибка при запуске тестов или в конфигурации среды тестирования.

Эти коды соответствуют стандартам, принятым в Unix-подобных операционных системах, где exit-код 0 сигнализирует о нормальном завершении процесса, а любые другие значения — о возникновении ошибок.

Как работает Exit код в Jasmine?

Jasmine сам по себе не возвращает специфичные exit-коды, но они генерируются в зависимости от результата выполнения тестов. Когда вы запускаете тесты с помощью командной строки (например, через npm или yarn), система в зависимости от результатов выполнения тестов возвращает код завершения.

В случае с Jasmine и Node.js обычно используется следующее поведение:

  • При успешном выполнении всех тестов и отсутствии ошибок в коде или тестах возвращается exit-код 0.
  • Если хотя бы один тест не прошел (например, из-за ошибки в коде или неверных ожиданий), возвращается exit-код 1.
  • В случае ошибки конфигурации тестов (например, если не удалось найти файлы тестов или произошла ошибка в настройке тестового окружения), будет возвращен exit-код 2.

Чтобы отследить этот процесс, достаточно запустить тесты с командой вроде:

npm test

После выполнения команды можно проверить, какой код завершения был возвращен:

echo $?

Если код равен 0, значит все тесты прошли успешно. В случае ошибки код будет отличен от нуля.

Применение в CI-системах

Одним из основных применений exit-кодов является интеграция с CI-системами. CI-инструменты часто используют эти коды для принятия решений о том, продолжать ли дальнейшие этапы сборки или развертывания. Например:

  1. CI/CD пайплайн: В большинстве CI-систем после выполнения тестов происходит условная логика, которая зависит от exit-кода. Если тесты не прошли (exit-код не равен 0), пайплайн может быть прерван, а разработчику отправлено уведомление об ошибке.

  2. Отчеты: CI-инструменты могут использовать exit-код для создания отчетов о тестах. Если тесты не прошли, CI-система может автоматически пометить билд как неуспешный и выделить проблемные тесты в отчетах.

  3. Автоматизация: Для автоматической проверки качества кода или выполнения интеграционных тестов на каждом этапе разработки exit-коды служат индикатором для скриптов, которые могут выполнять дальнейшие действия, например, деплой, если тесты прошли успешно.

Интеграция с CI-системами

Интеграция Jasmine с CI-системами — важная составляющая автоматизации тестирования. При настройке CI важно настроить процесс так, чтобы система корректно интерпретировала exit-коды и принимала решения на их основе.

Пример для Jenkins

Jenkins использует exit-коды для определения успешности задач в пайплайне. Пример конфигурации для тестирования с Jasmine в Jenkins может выглядеть следующим образом:

#!/bin/bash
npm install
npm test
EXIT_CODE=$?
if [ $EXIT_CODE -eq 0 ]; then
  echo "Тесты прошли успешно!"
else
  echo "Ошибка при выполнении тестов!"
  exit $EXIT_CODE
fi

В данном скрипте после запуска тестов с помощью npm test проверяется exit-код. Если тесты прошли успешно (exit-код равен 0), выводится сообщение о успешном завершении. В противном случае пайплайн завершается с соответствующим exit-кодом, и Jenkins помечает шаг как неудачный.

Пример для GitLab CI

В GitLab CI можно использовать следующий .gitlab-ci.yml файл:

stages:
  - test

test_job:
  script:
    - npm install
    - npm test
  only:
    - master

GitLab CI автоматически интерпретирует exit-код, возвращаемый при запуске тестов. Если exit-код равен 0, задача считается успешной. В случае, если тесты не прошли, пайплайн будет помечен как неудачный.

Пример для Travis CI

Travis CI использует стандартный подход для работы с exit-кодами:

language: node_js
node_js:
  - "14"
install:
  - npm install
script:
  - npm test

Travis также использует exit-код для интерпретации результатов тестов. В случае успеха пайплайн продолжится, в случае неудачи остановится, и результат тестирования будет отображен в интерфейсе Travis.

Обработка ошибок и нестандартные exit-коды

Иногда необходимо возвращать нестандартные exit-коды, чтобы передать более точную информацию о причинах неудачи. В Jasmine можно использовать дополнительные плагины или настраиваемые скрипты для возврата определенных кодов при специфических ошибках.

Например, можно настроить сценарий, при котором различные типы ошибок (например, ошибки в конфигурации, синтаксические ошибки в тестах) будут иметь разные exit-коды, чтобы CI-система могла дать более точную информацию о проблеме.

Для этого можно использовать такие инструменты, как mocha или karma, которые могут быть интегрированы с Jasmine и предоставляют более гибкие возможности для управления exit-кодами.

Пример с использованием Karma

Karma — это тестовый раннер, который позволяет интегрировать Jasmine с различными CI-системами. Karma позволяет настроить кастомные exit-коды для разных типов ошибок.

Пример конфигурации karma.conf.js:

module.exports = function(config) {
  config.set({
    frameworks: ['jasmine'],
    files: [
      'test/**/*.spec.js'
    ],
    reporters: ['progress'],
    port: 9876,
    colors: true,
    logLevel: config.LOG_INFO,
    autoWatch: true,
    browsers: ['Chrome'],
    singleRun: true,
    captureTimeout: 60000,
    customLaunchers: {
      ChromeHeadlessCI: {
        base: 'ChromeHeadless',
        flags: ['--no-sandbox', '--disable-gpu']
      }
    }
  });
};

Этот конфиг позволяет запускать тесты с использованием Jasmine и при этом обрабатывать нестандартные exit-коды в зависимости от результатов тестов.

Заключение

Правильное использование exit-кодов в Jasmine тестах и интеграция с CI-системами позволяют автоматизировать процесс тестирования и ускорить цикл разработки. CI-системы используют эти коды для анализа результатов и принятия решений о дальнейшем развертывании приложения.