Запуск .CORE (3.1) Rest API тестів та генерація репортів у Docker контейнері

Усі статті, обговорення, новини про тестування — в одному місці. Підписуйтеся на DOU | QA!

Всім привіт. Мене звати Костянтин Телтов. Я вже більше 14 років працюю як QA у різних компаніях та на різних позиціях. Зараз займаю позицію Senior QA Automation та роль технічного ліда на одному з проєктів у Grid Dynamics. Також, кому цікаво, за посиланням можна знайти мій GitHub профіль.

Оригінал статті англійською мовою.

Контекст (чого я взагалі тут горлаю)

Знаю, зараз не найкращий час, але інколи хочеться відволіктись від усього. Тому для мене це стаття про «відволіктись» та зробити щось корисне (не обіцяю).

Коли ми налаштували наші CI пайплайни на проєкті, то зіткнулися з проблемою дефолтного .trx репорта для наших REST API тестів на NUNIT. Цей репорт мав дуже обмежений фільтр та й взагалі виглядав не надто презентабельно. Куа та деви постійно питали, як його можна покращити. Я їх розумів, бо мені вони теж не дуже подобалися (я не про моїх колег, а про репорти).

Я знав, що багато людей давно вже використовує ALLURE Reports як репортингову систему. Але несподівано я побачив, що не так багато статей присвячено саме .NET/.CORE фреймворкам. Я почав читати ці статті, але далі довелося копати та розбиратися самостійно. В результаті я й вирішив це зробити за допомогою Docker контейнера. Цю статтю я написав для тих, хто, можливо, зіткнеться зі схожими проблемами. Сподіваюся, вона стане вам у нагоді.

Початкові вимоги (Initial Conditions якось приємніше звучить)

1. Як я вже писав на початку, наш проєкт був побудований на .CORE проєкті з використанням деяких nuget-пакетів. Із тих важливих, що нам потрібні, я б хотів відзначити NUNIT та NUnit.Allure. Все інше — це вже деталі імплементації.

Всередині тестового проєкту також додано конфігураційний файл — «allureConfig.json»

{
  "allure": {
    "directory": "allure-results",
    "links": [
      "https://github.com/AutomateThePlanet/Meissa/issues/{issue}",
      "https://github.com/AutomateThePlanet/Meissa/projects/2#card-{tms}",
      "{link}"
    ]
  }
}

Тестовий проєкт можна знайти тут.

2. Також треба поставити Docker на вашу машину. Я використовую систему Windows 10, тому скидаю саме її установку. Але ви можете інсталювати Docker на іншу систему. Головне — обережно ідіть по пунктах. Особливо ті, хто ще не має досвіду роботи з Docker.

Важливо: для тих, хто хоче запускати репорти без Docker контейнера, важливо також інсталювати «allure-command line»: docs.qameta.io/allure

У свою чергу, для запуску сервера потрібно поставити JAVA та прописати шлях до неї. Але, як я вже писав, тут ми будемо це робити у контейнері.

План/Завдання

  1. Створити .Dockerfile документ, з якого буде створюватися базовий Image. Копіюємо туди весь репозиторій, відновлюємо нюгет-пакети та встановлюємо необхідні депенденсі (JAVA, allure-commandline and etc).
  2. Створити script файл, який буде запускати тести, генерацію результатів та відкриття репортів на сервері. Я планую створити Docker image на базі одного з LINUX контейнерів, тому це буде Shell file.
  3. Можна створювати image.
  4. Можна ранити Docker контейнер зі скриптом, який заранить тести та репорти.

Створення .Dockerfile

Що ж, настав час створювати Dockerfile у руті проєкту. Просто створіть .Dockerfile та відкрийте його за допомогою текстового редактора.

Зараз починається найцікавіше (окрім запуску, коли воно запрацює). Починаємо додавати команди.

FROM mcr.microsoft.com/dotnet/sdk:3.1-alpine #Our base image
WORKDIR /app #Just creation of separate directory for our test solution
COPY . . #Copying all solution to our /App directory
RUN dotnet restore #Restore our projects nuget packages
RUN apk add openjdk8 #Install java, in my case openjdk
ENV PATH $PATH:/usr/lib/jvm/java-1.8-openjdk/bin #Add java path
RUN apk add — update npm && npm install -g allure-commandline — save-dev && chmod +x runTestsWithAllureReport.sh #Install packages and give #persmission to execute sh file
EXPOSE 9999 9999 #Expose container port to local port
CMD sh runTestsWithAllureReport.sh #Run shell file will runs all tests, generates allure-results and opens results on server

Важливо: насправді ті ж порти (9999) можна було б винести в .ENV файл та зчитувати з нього. Але для прикладу я вирішив спростити це.

Створення інструкції запуску тестів та репортів

Як ви вже бачили, останній крок у нашому image — це запуск shell файлу. Його ми ще не створювали, тому починаємо.

З чого він складається?

  • Запуск тестів з командного рядка.
  • Генерування репортів.
  • Запуск Allure Server з результатами.

Не буду довго танцювати, ось як можуть виглядати команди у цьому файлі:

dotnet test RestApiTestsOnDotNetCore3_1 -s “./RestApiTestsOnDotNetCore3_1/env.runsettings"
cd RestApiTestsOnDotNetCore3_1
allure generate “/app/RestApiTestsOnDotNetCore3_1/bin/Debug/netcoreapp3.1/allure-results” — clean
allure open “allure-report” — port 9999

Важливо: якщо ви створювали цей файл на DOS/Windows системі, а плануєте його запускати на LINUX-based системі, то вам треба переформатувати цей файл, інакше Linux не зрозуміє прихованих символів. Я рекомендую скачати dos2unix: dos2unix.sourceforge.io.

Білд або ребілд контейнера

Перед тим, як це робити, вам треба залогінитися у своєму Docker-акаунті. Немає Docker акаунта? Ну, це легко, просто створіть його: docs.docker.com/docker-id

Також не забувайте, що Docker може підтримувати два типи контейнерів — Windows чи Linux. У нашому кейсі ми використовуємо дефолтову Linux-ову.

Тепер можна відкривати консоль та запускати команду у руті вашого проєкту:

“docker build -t dneprokos/api-tests .”

Не буду довго пояснювати, що все означає (це інша історія), але дещо тут важливо:

  1. dneprokos/api-tests — перша частина — це ім’я мого аккаунту, а друга — це ім’я контейнера. Також ви можете додати тег. Наприклад: dneprokos/api-test:v1
  2. . — це шлях до вашого .Dockerfile. У нашому кейсі він знаходиться у руті проєкту.

Ви також можете перевірити, що ваш image був створений командою

“docker image ls”

Запуск контейнера

Ну що ж, ви на це заслуговуєте. Час запустити це все.

Запускаємо командою «docker run — rm -it -p 9999:9999 dneprokos/api-tests»

  1. Порти 9999 повинні бути такі самі, як були вказані до цього. Контейнер ізольований, тому нам потрібно відкрити наш локальний порт саме того порту.
  2. Не забуваємо, що частина image — саме ваш логін.

Коли все збереться і завершиться ран тестів, можете відкривати репорт локально у браузері.

Бонус (такий собі)

Всередині «RestApiTestsOnDotNetCore3_1» тестового проєкту ви також можете знайти додатковий Docker файл, який ранає і відкриває тільки репорти. Тобто ви можете заранити тести локально, потім зібрати Docker Image та заранити контейнер (ви це все вже вмієте). Остання частина спрацює так само — вона згенерує репорт та запустить Allure-Report server.

Чого не вистачає

Ну так, ще можна було б додати це все в Docker-compose та запустити на Azure DevOps. Але це, все ж таки, наступний стейдж та інша історія.

Фінал

У своєму прикладі я описав базовий сценарій. Звичайно, його можна покращити, проте навіть з таким прикладом ви вже зможете запускати тести та репорти локально та, можливо, навіть використаєте цей контейнер на CI. Сподіваюся, цей example стане комусь у нагоді. Дуже дякую.

Слава Україні!

👍ПодобаєтьсяСподобалось7
До обраногоВ обраному1
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

А Allure — це хароші руzкє, так?

там разница минимальна с дотнет 6, к тому же в контексте либ используемых это .net standard 2, там что кор 3.1 что 5 что 6 одно и то же по сути.

Підписатись на коментарі