Рубрики
Uncategorized

Непрерывное тестовое отчетность с Allure

Отключение между Tech и клиентом я разговаривал с одним из моих клиентов, которые пошли так … Теги с Java, DevOps, Testing, Kubernetes.

У меня поговорил с одним из моих клиентов, которые пошли так:

Tekton и Kubernetes приятно, и все, наши Devs, кажется, довольно счастливы, но где я вижу результаты теста? Jenkins имеет такую функцию, но теперь все разработчики используют этот Tekton Parts и все эти причудливые команды консоли. Я просто хочу посмотреть на мои сообщения и взглянуть на то, как пошли мягкие софт. Эти терминалы на самом деле не делают этого для меня. Можете ли вы получить мне что-то подобное?

Это место наблюдения за моим клиентом. Многие инструменты Kubernetes сильно сосредоточены на CLI-использовании, или на «ранних этапах развития», когда функции выше приоритетного списка, чем блестящий УИ.

Один из этих примеров будет экосистемой Tekton. Есть редко любой UIS, и если есть, например, приборная панель Tekton, они очень босые.

Поскольку я очень CLI-ориентированный парень, и по привычке, на самом деле не думаем об использовании UIS, что часто просьба моего клиента провела меня, как грузовик.

Итак, мы немного выкопали и нашли очень многообещающий инструмент. Allure Framework Отказ

Что значит и почему я должен использовать это?

Основная структура делает несколько вещей:

  • Генерация результатов в JSON-формате (Слава Богу больше XML)
  • Создание отчета
  • Сбор данных истории

Все это затем ударится вместе в довольно статическом HTML-отчете, готовым подавать на ваш любимый сервер. Если у вас нет ни одного под рукой, необязательно загружаемая CLI может также раскрутить веб-сервер через Allure Служить PathtoreportDir Команда и проводя сама отчеты. Магический!

Чтобы дать вам небольшой тур о том, как выглядит отчет, иметь GIF!

Я пытался получить GIF на работу, но 80% времени я получаю ошибки от dev, и те, которые визуализируют в качестве картофеля. Не имею, что делает это обладанные вещи, но это не здорово ..

Так что, если это слишком мало/уродливая для вас, что я могу только винить на себе, не волнуйся! Я покажу тебе, как раскрутить демонстрацию:)

Как это работает?

Во-первых, allure есть тонны разъемов для различных рамх и языков, которые документируются здесь Отказ

Но позвольте мне предупредить вас: документация кажется очень минимальной прямо сейчас. Есть много пробных и ошибок, чтобы получить то, что вы хотите Быть справедливым, кажется, очень мощный инструмент со многими поддерживаемыми языками и рамками. Документировав все до самой маленькой детали, вероятно, будет огромная задача.

Мой клиент был особенно заинтересован в поддержке огурца и JUnit5. На данный момент мы примерно закончили реализацию непрерывного интеграционного трубопровода с генерацией отчета для тестовых люков JUnit 5. Огурец, вероятно, следует, как только я нахожу время.

Давайте тестируем вещи!

Чтобы доливаться для создания отчета для вас, все, что вам нужно, это следующие дополнения к вашему POM.XML:


  2.22.2
  2.13.3
  1.9.5



  io.qameta.allure
  allure-junit5
  ${allure.version}
  test



  
    
      maven-surefire-plugin
      ${surefire-plugin.version}
      
        true
        
          -javaagent:"${settings.localRepository}/org/aspectj/aspectjweaver/${aspectj.version}/aspectjweaver-${aspectj.version}.jar"
        
        
          ${project.build.directory}/allure-resultsorg.jboss.logmanager.LogManager
        
      
      
        
          org.aspectj
          aspectjweaver
          ${aspectj.version}
        
      
    
    
      io.qameta.allure
      allure-maven
      2.10.0
      
        
          package
          
            report
          
          
            ${allure.version}
            https://repo.maven.apache.org/maven2/io/qameta/allure/allure-commandline/${allure.version}/allure-commandline-${allure.version}.zip
              
        
      
    
  

Allure также приносит свой собственный набор аннотаций для тестовых случаев. Вот несколько я люблю использовать:

@Feature("Some Name")
@Epic("Some Name")
@Story("Some Name")
@Severity(SeverityLevel.CRITICAL)
@Description("non-dev readable description")
@Link("link to JIRA-Tickets or some cool resources)

Хотите пойти? Вот простой докер, который я ударил вместе, что нуждается в минимальной работе с вашей стороны. Просто создайте простой проект Maven, настройте свой POM.xml, как я показал выше, добавьте некоторые тесты, аннотируйте их и дайте ему запуск за деньги с пакетом MVN!

FROM maven:3.6.3-jdk-11 as builder

WORKDIR /opt/service

# This is for caching purposes in local builds
# That way you don't have to download the whole internet every time your source changes
COPY pom.xml . 
RUN mvn dependency:go-offline

COPY src/ src/

# Run the Build and generate a report
RUN mvn clean install && mvn allure:report


FROM nginx:1.19.0-alpine as server

# Copy the report and serve it via nginx
COPY --from=builder /opt/service/target/site/allure-maven-plugin/ /usr/share/nginx/html/

Задача СНГ

Теперь у нас хороший инструмент, но что сейчас? Я быстро заметил, что эти сообщения могут быть хорошими, но если я собираюсь развернуть эти отчеты в контейнере, мне нужно немного больше, чем то, что я показал вам ранее. Allures History-Fuction не может ничего делать таким образом. Allure не может создать историю, если нет данных о предыдущих работах.

Итак, давайте создадим решение для этого!

Я думал, что у меня была нефте-идея, разработав процесс генерации отчета, как это:

Как видите, я представил новый компонент. Минио как провайдер хранения S3. Почему минион? Потому что это командная линия клиента имеет отличное — Нью-Чем/- старше, чем функция . Так что миниум может сделать сортировку для меня, мне не нужно делать это сам!

Если я хотел создать отчет с данными до 7 дней, это было бы так же легко, как

mc cp --recursive --newer-than 7d minio/allure/results/ results/
allure generate results/ -o report/
mc cp --recursive report/ minio/allure/reports-history/$(date +%y-%m-%d-%H%M)/ 

И я получил отчет с данными в течение 7 дней. Он будет храниться в минионе и будет готов к положению в контейнер. Честно говоря, я любил эту идею и был гордиться этим решением. Если у вас есть лучшая идея, я все уши!

Давайте контейнеризируем это!

Так как этот взгляд в контейнер?

FROM maven:3.6.3-jdk-11 as builder

WORKDIR /opt/service

# This is for caching purposes in local builds
# That way you don't have to download the whole internet every time your source changes
COPY pom.xml . 
RUN mvn dependency:go-offline

COPY src/ src/
RUN mvn clean install && mvn allure:report

FROM openjdk:14-alpine as generator

WORKDIR /tmp
COPY --from=builder /opt/service/target/allure-results/* results/
COPY --from=builder /opt/service/target/site/allure-maven-plugin/* reports/

RUN apk add curl tar gzip \
    && curl -L https://bintray.com/qameta/maven/download_file?file_path=io%2Fqameta%2Fallure%2Fallure-commandline%2F2.13.4%2Fallure-commandline-2.13.4.tgz | tar xvz \
    && curl -LO https://dl.min.io/client/mc/release/linux-amd64/mc \
    && chmod +x mc \
    && ln -s $PWD/mc /usr/bin/mc \
    && mc config host add minio http://ipofminio:9000 minioadmin minioadmin \
    && mc mb -p minio/allure \
    && mc cp --recursive results/* minio/allure/results/ \
    && mc cp --recursive reports/* minio/allure/reports/$(date +'%Y-%m-%d-%H%M')/ \
    && mc cp --recursive minio/allure/results/ results/  \
    && allure-2.13.4/bin/allure generate results/ -o reports-with-history-data/ \
    && mc cp --recursive reports-with-history-data/ minio/allure/reports-history/$(date +'%Y-%m-%d-%H%M')/

FROM nginx:1.19.0-alpine as server

COPY --from=generator /tmp/reports-with-history-data/ /usr/share/nginx/html/

То, что мы сделали, мы представили еще один этап с От OpenJDK: 14-Alpine As Generator В котором мы выполняем все материалы загрузки/выбора/сортировки для наших историй. Все, что вам нужно будет построить, это мини-экземпляр, который является для локального тестирования, легко развернута через:

docker run -p 9000:9000 --name minio --rm minio/minio server /data

Но как насчет Tekton и Kubernetes?

Вы можете спросить это, по праву, так как я дразнил его в начале. Делать этот пробег в Tekton был довольно легким, хотя ему нужно немного больше подготовить.

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

Что мы должны сделать? Во-первых, я хочу разложить свой контейнер на два.

  • Контейнер отчетности, который создает отчеты и толкает их в минио
  • контейнер Nginx, который тянет отчет и обслуживает его

Почему я хочу это? Необходимость создавать изображение, которое содержит ваш отчет каждый раз, когда отчет меняется, не кажется жизнеспособным для меня. Требуется ненужное пространство в вашем реестре Docker и не приносит этой большой выгоды. IMO было бы лучше иметь динамический контейнер, который может быть параметризован и выполняет все вытягивание результатов, генерации и архивирования в его въездной точке. Итак, давайте сделаем только это!

Allure-репортерский контейнер

Dockerfile.allure.

FROM openjdk:14-alpine

WORKDIR /tmp

RUN apk add curl tar gzip \
    && curl -L https://bintray.com/qameta/maven/download_file?file_path=io%2Fqameta%2Fallure%2Fallure-commandline%2F2.13.4%2Fallure-commandline-2.13.4.tgz | tar xvz \
    && curl -LO https://dl.min.io/client/mc/release/linux-amd64/mc \
    && chmod +x mc \
    && ln -s $PWD/mc /usr/bin/mc \
    && ln -s $PWD/allure-2.13.4/bin/allure /usr/bin/allure \
    && allure --version \
    && mc --version

WORKDIR /opt/myproject
VOLUME /opt/myproject/results

COPY entrypoint-allure.sh /usr/local/bin/entrypoint
RUN chmod +x /usr/local/bin/entrypoint 

USER nobody
ENTRYPOINT bash -c entrypoint

entrypoint-allure.sh

#!/bin/bash

set -e

# Capture the name of the project, so we can differentiate results in minio
CURRENT_DATE=$(date '+%Y%m%d%H%M') 

# Gather all results you can find
# Should be Emulated via Volume Mount locally
mkdir results
for resultDir in $(find . -type d -iname allure-results);do
  cp $resultDir/* results
done
# Generate the actual allure report of this testrun and publish it
allure generate results/ -o allure-report/

# Configure Minio and make sure the bucket allure exists
mc config host add minio $MINIO_ENDPOINT $MINIO_ACCESS_KEY $MINIO_SECRET_KEY 
mc mb -p minio/allure 

# Publish the results
mc cp --recursive results/ minio/allure/$PROJECTNAME/allure-results/
# Publish the report
mc cp --recursive allure-report/ minio/allure/$PROJECTNAME/allure-report-independent/$CURRENT_DATE/

# Get all results, including those from past runs, and generate a history report to publish
mc cp --recursive minio/allure/$PROJECTNAME/allure-results/ results/ 
allure generate results -o allure-report-history/ 
mc cp --recursive allure-report-history/ minio/allure/$PROJECTNAME/allure-report-history/$CURRENT_DATE/

Контейнер для Allure-Server

Dockerfile.nginx:

FROM nginx:1.19.0-alpine as server

ARG MINIO_ENDPOINT=http://minio.default.svc.cluster.local:9000
ARG MINIO_SECRET_KEY=minioadmin
ARG MINIO_SECRET_PASS=minioadmin
ARG PROJECTNAME=myproject

RUN curl -LO https://dl.min.io/client/mc/release/linux-amd64/mc \
    && chmod +x mc \
    && ln -s $PWD/mc /usr/bin/mc \
    && ln -s $PWD/allure-2.13.4/bin/allure /usr/bin/allure \
    && mc --version

COPY entrypoint-nginx.sh /usr/local/bin/entrypoint
RUN chmod +x /usr/local/bin/entrypoint 

USER nobody
ENTRYPOINT bash -c entrypoint

entrypoint-nginx.sh:

#!/bin/bash

set -e

# Capture the name of the project, so we can differentiate results in minio
CURRENT_DATE=$(date '+%Y%m%d%H%M') 

# Configure Minio and make sure the bucket allure exists
mc config host add minio $MINIO_ENDPOINT $MINIO_ACCESS_KEY $MINIO_SECRET_KEY
mc mb -p minio/allure 

NEWEST_REPORT=$(mc find minio/allure/$PROJECTNAME/allure-report-history/ --maxdepth 1 --newer-than 1d | cut -d'/' -f5- | sort -r | head -n1)
NEWEST_REPORT=${NEWEST_REPORT%/}
mc cp --recursive minio/allure/$PROJECTNAME/allure-report-history/$NEWEST_REPORT report
rm /opt/nginx/html/index.html
cp -r report/$NEWEST_REPORT/* /opt/nginx/html

nginx

С этими двумя контейнерами и четырьмя файлами вы должны быть в значительной степени, чтобы пойти. Мы разделим наш все в одном контейнере на две отдельные контейнеры, которые поступают без подключения к минимуму. Наш репортер и это nginx-сервер.

Давайте пойдем K8S

Я предполагаю, что у вас установка Kubernetes, если нет, вы можете взглянуть на мой « Lazy K8S-решение », чтобы запустить Кубернаны, которые могут позаботиться об этом для вас.

В качестве заключительной части интеграции Tekton вы можете использовать эту задачу для запуска генератора отчета (первый контейнер там) и разверните Nginx-Server через файл, который ссылается на шаге Kubectl. Allure-Reporter-task.yaml:

apiVersion: tekton.dev/v1beta1
kind: Task
metadata: 
  name: allure-reporter-task
  namespace: tekton
spec:
  workspaces: 
    - name: git
  params: 
   - name: minioEndpoint
     default: http://minio.default.svc.cluster.local:9000
   - name: minioAccessKey
     default: minioadmin
   - name: minioSecretKey
     default: minioadmin
   - name: pathToDeploymentYaml
     default: k8s/allure-server.yaml
  steps:
    - name: generate-and-publish-allure-report
      image: allure-report-generator:1.0.0
      command: 
        - /bin/bash
      args:
        - -c
        - |
          cd /workspace/git/
          entrypoint
      env:
        - name: MINIO_ENDPOINT
          value: $(params.minioEndpoint)
        - name: MINIO_ACCESS_KEY
          value: $(params.minioAccessKey)
        - name: MINIO_SECRET_KEY
          value: $(params.minioSecretKey)
    - name: serve-allure-report
      image: lachlanevenson/k8s-kubectl
      command: ["kubectl"]
      args:
        - "apply"
        - "-f"
        - "$(workspaces.git.path)/$(params.pathToDeploymentYaml)"

Чтобы получить развернутый сервер Allure-Server, следующий файл должен быть в ваших приложениях Git-Repository, поэтому Tekton может найти его во время TaskRun

Пример k8s/allure-server.yaml:

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: allure-server
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: allure-server
  template:
    metadata:
      labels:
        app: allure-server
    spec:
      containers:
        - name: allure-server
          image: your-registry/allure-server:1.0.0
          imagePullPolicy: Always
---
apiVersion: v1
kind: Service
metadata:
  name: allure-server
  namespace: default
spec:
  selector:
    app: allure-server
  type: ClusterIP 
  ports:
    - port: 80
      targetPort: 80
--------
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: allure-server-ingress-route
  namespace: default
spec:
  entryPoints:
    - http
  routes:
  - match: Host(`localhost`) && PathPrefix(`/allure`)
    kind: Rule
    services:
    - name: allure-server
      port: 80
    middlewares:
    - name: allure-stripprefix
--------
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: allure-stripprefix
  namespace: default
spec:
  stripPrefix:
    prefixes:
      - /allure

Разница в этом подходе, по сравнению с DockerFile я продемонстрировал там, я положил всю логику DockerFile в скрипты въезда. Вы знаете, все копирование, генерация отчета, сортировка, все.

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

Кроме того, изображения, которые вам нужны, могут быть построены с помощью CI, который обычно не должен иметь никакого доступа к решениям хранения, такими как минион. Таким образом, сборка DockerFiles с мини-соединением сломала бы вашу сборку. Именно поэтому мы поставили все сетевые вещи в выпускные точки, так как они не будут выполнены вашим CI.

Будущее

Я уже работаю над практическим демонстрацией ожога и Tekton с ZERO-TO-K8S Отказ Таким образом, вам не нужно делать все копирование и вставка отсюда.

Конец истории

Но на данный момент я оставляю вас с этим. Случайный ассортимент вещей, просто чтобы получить хороший блестящий пользовательский интерфейс для ваших TestResults: D

Если у вас есть вопросы, предложения или другие отзывы, не стесняйтесь забивать на своей клавиатуре:)

Оригинал: «https://dev.to/habereder/continuous-test-reporting-with-allure-1ag4»