Skip to content

Commit

Permalink
Merge pull request #2 from BME-MIT-IET/final
Browse files Browse the repository at this point in the history
Commit from E1LX0J/kozlegeny repository
  • Loading branch information
E1LX0J authored May 20, 2024
2 parents f5436e8 + 4ec09a8 commit 5c755a1
Show file tree
Hide file tree
Showing 439 changed files with 6,248 additions and 0 deletions.
42 changes: 42 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
.gradle
build/
!gradle/wrapper/gradle-wrapper.jar
!**/src/main/**/build/
!**/src/test/**/build/

### IntelliJ IDEA ###
.idea/modules.xml
.idea/jarRepositories.xml
.idea/compiler.xml
.idea/libraries/
*.iws
*.iml
*.ipr
out/
!**/src/main/**/out/
!**/src/test/**/out/

### Eclipse ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
bin/
!**/src/main/**/bin/
!**/src/test/**/bin/

### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/

### VS Code ###
.vscode/

### Mac OS ###
.DS_Store
112 changes: 112 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
plugins {
id 'java'
id 'application'
id 'org.javamodularity.moduleplugin' version '1.8.12'
id 'org.openjfx.javafxplugin' version '0.0.13'
id 'org.beryx.jlink' version '2.25.0'
}

version '1.0-SNAPSHOT'

repositories {
mavenCentral()
}

ext {
junitVersion = '5.9.1'
}

sourceCompatibility = '17'
targetCompatibility = '17'

tasks.withType(JavaCompile) {
options.encoding = 'UTF-8'
}

application {
mainModule = 'com.example.pipeline'
mainClass = 'menu.Main_Menu'
}

javafx {
version = '17.0.2'
modules = ['javafx.controls', 'javafx.fxml', 'javafx.web', 'javafx.media']
}

dependencies {
//testImplementation('junit:junit:4.13')
testImplementation 'io.cucumber:cucumber-java:7.17.0'
testImplementation 'io.cucumber:cucumber-junit:7.17.0'
implementation('org.controlsfx:controlsfx:11.1.2')
implementation('com.dlsc.formsfx:formsfx-core:11.5.0') {
exclude(group: 'org.openjfx')
}
implementation('net.synedra:validatorfx:0.4.0') {
exclude(group: 'org.openjfx')
}
implementation('org.kordamp.ikonli:ikonli-javafx:12.3.1')
implementation('org.kordamp.bootstrapfx:bootstrapfx-core:0.4.0')
/*implementation('eu.hansolo:tilesfx:17.1.15') {
exclude(group: 'org.openjfx')
}*/
implementation('com.github.almasb:fxgl:17.2') {
exclude(group: 'org.openjfx')
}

testImplementation("org.junit.jupiter:junit-jupiter-api:${junitVersion}")
testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:${junitVersion}")
}


jlink {
imageZip = project.file("${buildDir}/distributions/app-${javafx.platform.classifier}.zip")
options = ['--strip-debug', '--compress', '2', '--no-header-files', '--no-man-pages']
launcher {
name = 'app'
}
}

jlinkZip {
group = 'distribution'
}

configurations {
cucumberRuntime {
extendsFrom testImplementation
}
}

project.ext {
cucumberVersion = '5.6.0'
}

dependencies {
testImplementation 'io.cucumber:cucumber-java:' + cucumberVersion
}

task cucumberTest() {
dependsOn assemble, compileTestJava
doLast {
javaexec {
main = "io.cucumber.core.cli.Main"
classpath = configurations.cucumberRuntime + sourceSets.main.output + sourceSets.test.output
args = ['--plugin', 'html:reports/test-report', '--plugin', 'pretty', '--glue', 'com.example.pipeline', 'src/test/resources']
}
}
}

task junitTest(type: Test) {
useJUnitPlatform()
testLogging {
events "passed", "skipped", "failed"
exceptionFormat "full"
showStandardStreams = true
}
}

tasks.withType(Test) {
maxParallelForks = Runtime.runtime.availableProcessors()
}

test.dependsOn 'cucumberTest', 'junitTest'

63 changes: 63 additions & 0 deletions doc/cucumber.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
### DOKUMENTÁCIÓ - *Madagaszkár Pingvinjei*

#

#

# Cucumber beüzemelése
## Célkitűzés
*BDD tesztek készítése Cucumber-rel, egyszerűbb use-case-ek megfogalmazása.*

## Leírás
#### Cucumber
A Cucumber egy tesztautomatizálási eszköz, amely támogatja a Behavior Driven Development (BDD) módszertant. Lehetővé teszi a tesztelők és fejlesztők számára, hogy egy természetes nyelvű formátumban írják meg a teszteket, amelyeket a Cucumber képes végrehajtani.

## Munkafolyamat
A Cucumber használatával különböző teszteseteket definiáltunk, amelyek a projekt különböző funkcióit fedik le. A Cucumber tesztfájlok négy fő csoportba sorolhatók: StepDefinitions, Mechanic Actions, Player Actions és Saboteur Actions.

### StepDefinitions.java
#### Tesztek leírása
- **Példányok létrehozása:** A különböző típusú játékosok (játékos, szerelő, szabotőr) és konténerek (cső, szivattyú, ciszterna) példányosítása.
- **Inicializálás és bool check:** A szivattyú és a cső szomszédságának beállítása, a játékos pozíciójának meghatározása (cső, szivattyú, ciszterna), valamint a cső állapotának ellenőrzése (sérült, ragadós, csúszós).
- **Action végrehajtása:** A játékos különböző műveleteket hajt végre, mint például a szivattyú javítása, a cső javítása, a szivattyú mozgatása, a cső ragadóssá tétele, vagy a szivattyú átvétele a ciszternából.

### mechanic_actions.feature
#### Funkciók és tesztesetek
- **Mechanic repairs a pump:** A szerelő megjavít egy sérült szivattyút.
- **Mechanic repairs a pipe:** A szerelő megjavít egy sérült csövet.

### player_actions.feature
#### Funkciók és tesztesetek
- **Player moves to a pump from a pipe:** A játékos egy csőből mozog egy szivattyúba.
- **Player moves to a pipe from a pump:** A játékos egy szivattyúból mozog egy csőbe.
- **Player moves to a slippery pipe from a pump:** A játékos egy csúszós csőbe mozog egy szivattyúból, de nem marad ott.
- **Player moves to a sticky pipe from a pump:** A játékos egy ragadós csőbe mozog egy szivattyúból, és ragadós lesz.
- **Player tries to move to a pump from a pipe while being sticky:** A játékos ragadós állapotban próbál meg mozogni egy csőből egy szivattyúba, de nem sikerül.
- **Player makes a pipe sticky:** A játékos ragadóssá teszi a csövet.
- **Player takes a pump from the cistern:** A játékos átveszi a szivattyút a ciszternából.

### saboteur_actions.feature
#### Funkciók és tesztesetek
- **Saboteur makes a pipe slippery:** A szabotőr csúszóssá teszi a csövet.

## Cucumber tesztek futásának eredménye

#

### Mechanic Actions tesztek eredménye
<img src = "res/cu_mec.png" width = "500">

#

### Player Actions tesztek eredménye
<img src = "res/cu_pla.png" width = "600">

#

### Saboteur Actions tesztek eredménye
<img src = "res/cu_sab.png" width = "500">

#

### Teljes teszt eredménye
<img src = "res/cu_all.png" width = "200">
43 changes: 43 additions & 0 deletions doc/doc_cibuild.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
### DOKUMENTÁCIÓ - *Madagaszkár Pingvinjei*

#

#

### *Technológia 1*
# Build keretrendszer és CI beüzemelése
## Célkitűzés:
*GitHub Actions és Gradle beüzemelése.*

## Leírás
#### Gradle
A Gradle-lel a szoftverfejlesztést bizonyos szinten automatizálni tudjuk, ezzel gyorsítva és biztosabbá téve kódunkat.

#### GitHub Actions
GitHub Actions használatával tudtuk automatizálni folyamatos integrációt, a munkafolyamatok létrehozását közvetlenül a repository-n belül annak minőségének növelésére.

## Munkafolyamat
Első mérföldként a Gradle beüzemelése mellett döntöttünk, amit sikerült gyorsan implementálnunk.

A 'build.gradle' file-ban definiáltuk a függőségek, plug-in-ek és konfigurációk listáját, amikkel a projekt működését, sajátosságait írjuk körül.

A 'gradlew' file szintén külön kiemelést érdemel. Ez a Gradle Wrapper végrehajtható file-ja, amivel tudjuk futtatni a Gradle-t anélkül hogy telepíteni kéne akármiénk gépére, ezzel gyorsítva a feladatok megoldását.

A Gradle tesztelés egyik kimenetét megtekinthetjük az alábbi ábrán.

![gradle teszt példa](res/gr_1.png)

A Gradle megfelelő használatához *@E1LX0J* készített egy útmutatót, amivel el lehetett indítani az alkalmazást a Gradle segítségével.
Ennek legfontosabb részlete volt a megfelelő JDK verzió (*17*) beállítása a környezeti változókon belül, így már a rendszer felismerte a JDK-t és automatikusan használhatta az alkalamzás futtatására.

Ennek a folyamatnak a képekkel ellátott dokumentációját megtalálható a repository-n belül.

A csapat tagjainak review-jai után implementálva is lett a Gradle a projektünkbe, így már akármiénk clone-ozhatott a fő branch-ből és a számára kiosztott tesztelési és integrációs feladatokat könnyedén megoldhatta a Gradle segítségével összetett konfigurációk és telepítés nélkül.

A második lépés a CI (*CI = Continuous Integration*) beüzemelése volt. Itt egyszerűen csak hozzáadtuk a GitHub Actions-höz a "*Java CI with Gradle*"-t, amivel egyszerűen automatizálhattuk a kód tesztelését, építését és telepítését is.

Itt talán a legfontosabb említésre méltó file a '*Workflow*' file, ami magát a CI-t kezeli. Itt definiáltuk az integráció végrehajtandó feladatait, eseményeit.

Ez a file a következő fejezetekben is kitüntetett fontossággal szerepel, mivel a további CI/CD szint emelés érdekében használt szoftvereknek a működését is itt definiálhatjuk.

Ezekkel a lépésekkel felhúztunk az alkalmazás tesztelésére, kezelésére egy közös vázt, amit bárki bármikor egyszerűen elérhet.
49 changes: 49 additions & 0 deletions doc/doc_sq.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
### DOKUMENTÁCIÓ - *Madagaszkár Pingvinjei*

#

#

### *Technológia 2*
# SonarQube beüzemelése
## Célkitűzés
*Statikus hibaanalízis érdekében SonarQube beüzemelése, futtatása.*

## Leírás
#### SonarQube
A SonarQube fő célja a letisztult, optimális "Clean Code", amit a kódunk automatikus felülvizsgálatával ér el, és amivel támogatni tudja a CI/CD megvalósítását. Ezt különböző tesztelésekkel éri el. Az általa ajánlott változtatások akár a projekt architektúrájára is hatással lehetnek.

## Munkafolyamat
Ez a szoftver volt csapatunk számára ez egyik leghasznosabb technológia, amit a repository "Issue" logjának megtekintésével egyértelműen észre lehet venni.

Rengeteg hibát és javaslatot jelzett nekünk a projektben, amik egyszerű átírásoktól akár az osztályok struktúrájának polimorfizmussal történő átépítését is magukkal vonhatták.

Az első lépés a szoftver hozzáadása volt a repository-hoz. Ezt a letöltése után egy új Git-es "*secret*" létrehozásával tudtuk hozzáadni a repository-hoz, majd pedig a létrejött konfigurációs file-ban a kulcs beállításával véglegesíteni.

Ezek után korábban említett Workflow file-unkban tudtuk a SonarQube működését definiálni.

Alább megtekinthető a SonarQube implementációs Workflow file-ra egy példa.

![workflow példa sq-val](res/sq_2.png)

A SonarQube összesen 8 különböző osztályban talált eltérő súlyosságú hibát, amik javításával sokkal értelmesebb, átláthatóbb és kezelhetőbb lett az alkalmazás osztály-, és függvénykészlete, illetve maga a szoftverarchitektúra is.

Ezekből a javításokból szemléltetésképp itt felsorolunk hármat:

*1: Kasztolás elkerülése megfelelő függvények meghívásával*

![példa 1](res/sq_ex_1.png)

*2: Láthatóság korlátozása a biztonság érdekében*

![példa 2](res/sq_ex_2.png)

*3: Kódoptimalizálás megfelelő lista struktúra használatával*

![példa 3.a](res/sq_ex_3a.png)

![példa 3.b](res/sq_ex_3b.png)

A SonarQube-os integráció végső kimenetét megtekinthetjük az alábbi képen.

![sq teszt kimenet](res/sq_1.png)
Loading

0 comments on commit 5c755a1

Please sign in to comment.