Сокращение времени выполнения теста благодаря возможности запуска в разных версиях браузера

Авторы:

Оливер Агар, старший инженер по разработке программного обеспечения в отделе тестирования компании Sidetrade

Сэм Берри, инженер-разработчик программного обеспечения в отделе тестирования компании Sidetrade

Саймон Парр, старший разработчик программного обеспечения в отделе тестирования компании Sidetrade

Здесь, в Sidetrade, мы сосредоточились на разработке наших автоматических тестов для запуска в конвейере сборки. Наша мантра — иметь возможность запускать наши тесты в любое время в любой среде — будь то выпуск или разработка — чтобы мы могли предоставить нашим клиентам максимально возможное качество.

Ниже мы объясним, как нам удалось запустить наши автоматизированные тесты пользовательского интерфейса в Azure DevOps вместе с параллельным выполнением тестов, чтобы сократить время выполнения теста, а также предоставить нам гибкость для запуска в разных версиях браузера.

Настройка агентов Azure DevOps

Изначально нам нужно было установить Cypress на каждый агент в нашем пайплайне. Не обязательно проблема, так как он просто устанавливается через Node Package Manager (npm). Однако со временем это отнимало ресурсы у агентов с каждой новой версией Cypress.

Имея это в виду, мы создали образы докеров, которые содержали образ Cypress и связанные с ним необходимые инструменты (например, Oracle Instant Client). Агенты проверяли наши тесты и запускали их внутри док-контейнера. Без необходимости устанавливать Cypress при каждом запуске агенты не тратили время на установку необходимых пакетов при каждом запуске, что, в свою очередь, ускоряло выполнение тестов.

Однако если тесты застревают или занимают слишком много времени, Azure DevOps останавливает выполнение, но образ контейнера по-прежнему работает на агенте, потребляя свои ресурсы. Нам нужно было зайти в агента, чтобы убить контейнер.

Затем мы рассмотрели возможность создания контейнерных образов Docker для использования нашими агентами. Это единый образ, который наши агенты сборки могут использовать и выполнять наши тесты. Теперь нам нужно только поддерживать наш образ, который затем можно использовать для нескольких агентов.

Было создано два изображения:

· Базовый образ с Edge, Chrome и Firefox на основе Cypress Base Node Image

· Используя образ нашего браузера, создается другой образ, в котором установлен Cypress и другие инструменты, необходимые для нашего теста.

Это дало нам возможность повторно использовать один и тот же образ снова и снова, а также возможность легко масштабировать наши агенты сборки. Используя наш собственный образ в качестве агента, при выполнении теста он будет копироваться в наши тесты и запускать тестируемую функцию.

Управление версиями браузера

Чтобы адекватно представить целевых пользователей нашего приложения, нам нужно провести тестирование в Chrome, Edge и Firefox. Каждый из этих браузеров выпускает новую основную версию примерно каждые шесть недель.

Исходя из опыта, мы видели серьезные проблемы с введением новых функций браузера, особенно в области безопасности и обработки файлов cookie, поэтому важно внимательно отслеживать текущую версию выпуска каждого браузера, обновляя наш базовый образ каждые несколько месяцев.

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

Мы также отслеживаем бета-версию большинства браузеров, чтобы своевременно получать оповещения о любых серьезных проблемах.

Распараллеливание тестов

По мере роста наших наборов тестов нам нужно было сократить время, необходимое для выполнения тестов. Хотя это возможно с помощью Cypress Dashboard, это не вариант.

Таким образом, мы использовали Матричную стратегию в Azure DevOps, чтобы передать тестовую спецификацию/выполнение браузера через доступные агенты.

parameters:
- name: platform
displayName: Platform Under Test
type: string
default: Platform01
values:
- Platform01
- Platform02
- Platform03
- name: uiSuites
displayName: UI Feature Tests
type: object
default:
suites:
- ‘Feature1’
- ‘Feature2’
- ‘Feature3’
- ‘Feature4’
- name: testBrowser
displayName: Browsers to Run
type: object
default:
browsers:
- chrome
- edge
- firefox
variables:
dockerContainer: <Our Custom Cypress Docker Image>
stages:
- stage: uiRun
dependsOn: []
condition: succeededOrFailed()
jobs:
- job: uiSuites
timeoutInMinutes: X
pool: Linux
container: $[ variables[‘dockerContainer’] ]
dependsOn: []
strategy:
matrix:
${{ each suite in parameters.uiSuites.suites }}:
${{ each browser in parameters.testBrowser.browsers }}:
${{ suite }}-${{ browser }}:
TAG: ${{ suite }}
BROWSER: ${{ browser }}
steps:
- script: npm run cy:run:$(platform) run — — browser $(BROWSER) –spec “cypress/integration/$(TAG).feature
continueOnError: true
- task: PublishBuildArtifacts@1
inputs:
PathtoPublish: ‘$(System.DefaultWorkingDirectory)’
ArtifactName: ‘drop_$(TAG)_$(BROWSER)’
publishLocation: ‘Container’
- task: PublishTestResults@2
inputs:
testResultsFormat: ‘JUnit’
testResultsFiles: ‘**/test-results.*.xml’
failTaskOnFailedTests: true
testRunTitle: ‘UI Run $(uiSuites) — $(BROWSER)’

Это дает нам гибкость в выборе платформы для тестирования, функций для запуска и браузеров для запуска во время выполнения конвейера. Для каждой комбинации функции и браузера в Azure DevOps создается задание сборки. Когда агент становится доступным из пула, запускается проверка функций. Чем больше агентов доступно, тем больше комбинаций функций/браузеров мы можем запускать параллельно. У нас также есть возможность подключить к сети больше агентов в зависимости от загрузки заданий в Azure DevOps. В целом, это улучшило время выполнения нашего теста более чем на 80%.

Не все тесты подходят для распараллеливания либо из-за недосмотров в приложении, наших тестах, либо по дизайну — для эффективности. Чтобы гарантировать, что мы включаем только подходящие наборы тестов в параллельные запуски, мы определили, какие из наших наборов будут иметь проблемы при параллельном запуске, и создали отдельный шаг в конвейере, чтобы гарантировать, что каждый из них выполняется на одном агенте, называемом «последовательными наборами». .

Заключение

Используя наши собственные образы сборки докеров в качестве контейнерных агентов в сочетании со стратегией Matrix, мы увидели, что время выполнения теста сократилось с восьми часов до всего одного часа. Чтобы не использовать агенты сборки из сборок разработчиков, мы также ввели специальные агенты тестовой фермы для выполнения наших тестов.

Дайте нам знать, что вы думаете в комментариях ниже, и не забудьте дать нам знать, чтобы узнать больше о том, чем мы занимаемся здесь, в техническом центре Sidetrade!