Skip to content

Commit

Permalink
Merge 6b4d428 into b43c0cc
Browse files Browse the repository at this point in the history
  • Loading branch information
SergeyAkkuratov authored Jul 29, 2024
2 parents b43c0cc + 6b4d428 commit c0a2f3d
Show file tree
Hide file tree
Showing 89 changed files with 18,818 additions and 128 deletions.
83 changes: 83 additions & 0 deletions .github/workflows/build_deploy.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
name: Check, Build and Artifact Deploy
on:
pull_request:
push:
branches:
- main

permissions:
contents: write
pages: write
id-token: write
pull-requests: write
deployments: write

jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin' # https://github.com/actions/setup-java/issues/298

- name: Install Packages
working-directory: src/frontend
run: |
npm install
- name: Lint check
working-directory: src/frontend
run: |
npm run lint
- name: Test check
working-directory: src/frontend
run: |
npm run test
- name: Build
working-directory: src/frontend
run: |
npm run build
- name: Setup Gradle
uses: gradle/actions/[email protected]

- name: Build with Gradle
run: ./gradlew clean bootJar
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

- name: Zip artifact for deployment
run: |
zip zucchini-launcher.zip ./build/libs/* -r
echo "GITHUB_SHA_SHORT=$(echo $GITHUB_SHA | cut -c 1-6)" >> $GITHUB_ENV
- name: Create Draft Release
id: create_release
uses: actions/create-release@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
tag_name: ${{ env.GITHUB_SHA_SHORT }}
release_name: Zucchini Launcher ${{ env.GITHUB_SHA_SHORT }}
draft: true
prerelease: false

- uses: actions/[email protected]
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ steps.create_release.outputs.upload_url }}
asset_path: ./zucchini-launcher.zip
asset_name: zucchini-launcher.zip
asset_content_type: application/zip

- uses: eregon/publish-release@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
release_id: ${{ steps.create_release.outputs.id }}
9 changes: 9 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -38,3 +38,12 @@ bin

# Ignore test results
allure-results
/features/
allure-reports
src/main/resources/static/index.html
src/main/resources/static/main.bundle.js
src/main/resources/static/main.bundle.js.LICENSE.txt
src/main/resources/static/runtime.bundle.js
src/main/resources/static/zucchini.png
src/main/resources/static/images/zucchini.png
СКОПИРОВАТЬ СЕБЕ_16_9_Защита проекта_черная.pptx
152 changes: 133 additions & 19 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,19 +1,133 @@
# ZucchiniLauncher

Система запуска автоматизированных тестов "Zucchini Launcher" — это инструмент для создания, запуска, мониторинга
выполнения и предоставление результатов автоматизированного тестирования.
Система должна обладать следующей функциональностью:

1. Авторизация: пользователь должен авторизовываться в системе, иметь одну из ролей, иметь доступ к функциональности,
согласно роли, доступ к странице настроек.
2. Создание тестовых сценариев: пользователь должен иметь возможность создавать тестовые сценарии в текстовом редакторе
и сохранять их на сервере.
3. Просмотр и редактирование тестовых сценариев: пользователь должен иметь возможность просматривать существующее
сценарии и редактировать их текст.
4. Запуск тестовых сценариев: пользователь должен иметь возможность гибкого запуска тестовых сценариев из каталога.
5. Мониторинг текущих запусков: пользователь должен иметь возможность видеть текущее состояние запусков в системе –
какие сценарии запущены, какие в очереди, какие завершены. В зависимости от роли пользователь может управлять
состоянием сценария (останавливать, повышать приоритет и т.д.).
6. Просмотр результатов: пользователь должен иметь возможность просматривать результаты каждого завершенного запуска и
тестового сценария.
Системе будет иметь серверную и клиентскую часть.
<br/>
<p align="center">
<h3 align="center">ZucchiniLauncher</h3>
<p align="center">
Приложение для запуска Cucumber тестов.
<br/>
<br/>
</p>
</p>

[![Check, Build and Artifact Deploy](https://github.com/SergeyAkkuratov/ZucchiniLauncher/actions/workflows/build_deploy.yml/badge.svg)](https://github.com/SergeyAkkuratov/ZucchiniLauncher/actions/workflows/build_deploy.yml)
![Contributors](https://img.shields.io/github/contributors/SergeyAkkuratov/ZucchiniLauncher?color=dark-green) ![Issues](https://img.shields.io/github/issues/SergeyAkkuratov/ZucchiniLauncher)

**Backend**

![Java](https://img.shields.io/badge/java-%23ED8B00.svg?style=for-the-badge&logo=openjdk&logoColor=white)
![SpringBoot](https://img.shields.io/badge/Spring_Boot-F2F4F9?style=for-the-badge&logo=spring-boot)

**Frontend**

![typescript](https://img.shields.io/badge/TypeScript-007ACC?style=for-the-badge&logo=typescript&logoColor=white)
![react](https://img.shields.io/badge/React-20232A?style=for-the-badge&logo=react&logoColor=61DAFB)
![redux](https://img.shields.io/badge/Redux-593D88?style=for-the-badge&logo=redux&logoColor=white)
![router](https://img.shields.io/badge/React_Router-CA4245?style=for-the-badge&logo=react-router&logoColor=white)

## Содержание

- [О проекте](#о-проекте)
- [Установка](#установка)
- [Использование](#использование)
- [Структура проекта](#структура-проекта)

## О проекте

<img src="src/frontend/src/images/zucchini-real.jpg">

Приложение **ZuccchiniLauncher** служит для запуска, мониторинга и обработки результатов Cucumber тестов.

## Требования

Для локального запуска приложения вам потребуется Java 17 версии или выше.

## Установка

Для локального запуска приложения вам нужно скачать
пакет [zucchini-launcher.jar](https://github.com/SergeyAkkuratov/ZucchiniLauncher/releases/tag/major) и запустить его:

```bash
java -jar zucchini-launcher.jar
```

Приложение будет доступно по адресу http://localhost:8080/.

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

```bash
gradlew clean bootJar
```

Для использования Allure Report требуется запустить и настроить [allure-docker-service](https://github.com/fescobar/allure-docker-service).

## Использование

### Логин

Приложение требует авторизации для просмотра и выполнения действий.
На данный момент существует две роли пользователей: user и admin.
Только пользователь с ролью admin может удалять feature файлы и тесты из очереди.
![login](./images/login.png)

### Dashboard

Страница dashboard открывается ппосле авторизации пользователя и содержит информацию о запущенных, ожидающих и завершенных тестах.
![dashboard](./images/dashboard.png)

При первональном запуске все таблицы будут пусты (так как ниодного теста ещё не было запущено):
![dashboard](./images/dashboard_empty.png)

При наведении курсора мыши на строчку в любой таблицы будут появляться детали запуска с задержкой в 1 секунду:
![deatails](./images/dashboard_details.png)

Так же вы можете кликнуть по строке любой таблице, чтобы открыть окно с деталями запуска и, например, скопировать информацию.
В окне с деталями завершенного запуска вы найдете кнопку, открывающую Allure report (
требует [allure-docker-service](https://github.com/fescobar/allure-docker-service)).
![results](./images/dashboard_results.png)

### Запуск тестов

Запустить тест вы может с любой страницы программы нажам кнопку "Run test" в правом верхнем углу.
После этого откроется окно, в котором нужно будет указать параметры запуска теста:
![runTest](./images/runNewTests.png)
В строке "Feature file name" нужно выбрать конкретный .feature файл для запуска. В поле Tags - указать тэги, запускаемого теста (можно посмотреть в
.feature файле). В поле таймаут указывается маскимально допустимое время выполнения теста.

Если требуется запустить больше одно теста, то можно отметить чекбокс "Run another test" и окно запуска не будет закрваться при нажатии кнопки "Run".

### Удаление тестов из очереди

Если пользователь обладает ролью admin, то он может удалять тест из очереди ожидания.
Для этого требуется нажать на крестик в соотвествующей этом тесту строке в таблице и подвердить своё действие в всплывающем окне.
![delete](./images/remove_test.png)

### Features

На страницы Features пользователь может просмтривать, редактировать, создавать новые и удалять .feature файлы, хранящиеся на серевере.
![features](./images/features.png)

Для того, чтобы открыть конкретный .feature файл, нужно выбрать его имя в поле "Feature file name".
В редакторе ниже отобразится текст .feature файла.
Если изменить текст .feature файла - станет доступна кнопка "Save changes". Нажав её можно сохранить изменение на сервере.
Если же нажать "Cancel" - все изменения отменятся.

Для создания нового .feature файла нужно нажать на стрелочку рядом с кнопкой "Save changes" и выбрать пункт "Add new feature". После этого откроется
окно:
![newFeature](./images/addNewFeature.png)
В поле "File name" нужно ввести имя нового .feature файла (расширение указывать не нужно, оно подставится автоматически).

Пользователь с ролью admin может так же удалять .feature файлы.
Для этого он должен выбрать файл и нажать кнопку "Delete". В появившемся окне требуется подтвердить своё действие.
![deleteFeature](./images/remove_feature.png)
## Структура проекта

- github
- workflows - настройки для GitHub Actions
- src
- frontend - исходный код для Frontend
- images - скриншоты и .gif файлы для файла README.md
- mocks - файлы для моков тестов
- src - исходный код проекта
- components - React компоненты программы
- pages - страницы приложения
- store - описание и Redus Store приложения
- java - исходный код для Backend
27 changes: 26 additions & 1 deletion build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,11 @@ plugins {
java
id("org.springframework.boot") version "3.2.2"
id("io.spring.dependency-management") version "1.1.4"
id("maven-publish")
}

group = "ru.sakkuratov.autotests"

repositories {
maven {
url = uri("https://dl.bintray.com/alfa-laboratory/maven-releases/")
Expand Down Expand Up @@ -42,7 +45,7 @@ dependencies {
// Apply a specific Java toolchain to ease working on different environments.
java {
toolchain {
languageVersion = JavaLanguageVersion.of(21)
languageVersion = JavaLanguageVersion.of(17)
}
}

Expand All @@ -56,3 +59,25 @@ tasks.named<Test>("test") {
// Use JUnit Platform for unit tests.
useJUnitPlatform()
}

springBoot {
mainClass = "ru.sakkuratov.autotests.ZucchiniLauncher"
}

publishing {
publications {
create<MavenPublication>("zucchini-launcher") {
artifact(tasks.named("bootJar"))
}
}
repositories {
maven {
name = "GitHubPackages"
url = uri("https://maven.pkg.github.com/SergeyAkkuratov/ZucchiniLauncher")
credentials {
username = System.getenv("GITHUB_ACTOR")
password = System.getenv("GITHUB_TOKEN")
}
}
}
}
1 change: 1 addition & 0 deletions docker-run.bat
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
docker run -p 5050:5050 -e CHECK_RESULTS_EVERY_SECONDS=3 -e KEEP_HISTORY=1 -e KEEP_HISTORY_LATEST=10 -v E:\_Study\IdeaProjects\ZucchiniLauncher\allure-results:/app/allure-results -v E:\_Study\IdeaProjects\ZucchiniLauncher\allure-reports:/app/default-reports frankescobar/allure-docker-service
Empty file modified gradlew
100644 → 100755
Empty file.
Binary file added images/addNewFeature.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added images/dashboard.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added images/dashboard_details.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added images/dashboard_empty.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added images/dashboard_results.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added images/features.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added images/login.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added images/remove_feature.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added images/remove_test.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added images/runNewTests.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 1 addition & 1 deletion settings.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,4 @@ plugins {
id("org.gradle.toolchains.foojay-resolver-convention") version "0.7.0"
}

rootProject.name = "ZucchiniLauncher"
rootProject.name = "zucchini-launcher"
5 changes: 5 additions & 0 deletions src/frontend/.eslintignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
coverage
dist
webpack.config.js
module
storybook-static
37 changes: 37 additions & 0 deletions src/frontend/.eslintrc.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
module.exports = {
env: {
browser: true,
es2021: true,
"jest/globals": true,
},
parser: "@typescript-eslint/parser",
extends: ["airbnb-base", "plugin:jest/recommended", "plugin:@typescript-eslint/recommended", "prettier", "plugin:storybook/recommended"],
overrides: [
{
env: {
node: true,
},
files: [".eslintrc.{js,cjs}"],
parserOptions: {
sourceType: "script",
},
},
],
parserOptions: {
ecmaVersion: "latest",
sourceType: "module",
},
plugins: ["jest", "eslint-plugin-html", "@typescript-eslint"],
rules: {
"import/no-unresolved": "off", // https://github.com/typescript-eslint/typescript-eslint/issues/1624
"import/extensions": ["warn", "never"], // https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/extensions.md
"import/no-extraneous-dependencies": [
"off",
{
devDependencies: ["**/*.test.ts?(x)", "**/*.spec.ts?(x)", "**/test-utils.ts", "webpack.config.js"],
},
],
"no-shadow": "off",
"@typescript-eslint/no-shadow": "error",
},
};
Loading

0 comments on commit c0a2f3d

Please sign in to comment.