Docs: Add QA report with exported pdf and images
This commit is contained in:
Binary file not shown.
|
After Width: | Height: | Size: 211 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 70 KiB |
Binary file not shown.
@@ -0,0 +1,250 @@
|
|||||||
|
\documentclass{article}
|
||||||
|
\setlength{\parindent}{0pt}
|
||||||
|
\usepackage[a4paper,margin=2.5cm]{geometry}
|
||||||
|
\usepackage{listings}
|
||||||
|
|
||||||
|
% External links
|
||||||
|
\usepackage{hyperref}
|
||||||
|
|
||||||
|
% Colored text
|
||||||
|
\usepackage{xcolor}
|
||||||
|
% Graphics
|
||||||
|
\usepackage{graphicx}
|
||||||
|
|
||||||
|
% Customized table
|
||||||
|
\usepackage{float}
|
||||||
|
\usepackage{array}
|
||||||
|
\newcolumntype{L}[1]{>{\raggedright\arraybackslash}p{#1}}
|
||||||
|
\usepackage{booktabs}
|
||||||
|
|
||||||
|
% Create plots
|
||||||
|
\usepackage{pgfplots}
|
||||||
|
\usepackage{pgf-pie}
|
||||||
|
|
||||||
|
\title{QS-Report für MS6}
|
||||||
|
\author{Syntax Syndicate - Casono}
|
||||||
|
\begin{document}
|
||||||
|
\maketitle
|
||||||
|
|
||||||
|
\section{Einleitung}
|
||||||
|
Dieses Dokument ist die Fortsetzung des QA-Konzeptes für unser Mehrspieler-Spiel \textit{Casono}.
|
||||||
|
Es wurde von uns als Teil der Programmierprojekt-Vorlesung (ehemals bekannt als cs108) an der Universität Basel von uns entwickelt.
|
||||||
|
|
||||||
|
Dieser Report folgt dem selben \textit{DIN ISO 9126}, und ist wie auch das Konzept für den ersten Teil in die selben Themenbereiche unterteilt:
|
||||||
|
\begin{itemize}
|
||||||
|
\item \textbf{Konstruktives Qualitätsmanagement} - Maßnahmen, die \emph{während} der Entwicklung ergriffen werden, um die Qualität von Anfang an sicherzustellen.
|
||||||
|
Einschließlich technischer Standards, Werkzeuge und internen Organisation.
|
||||||
|
\item \textbf{Analytisches Qualitätsmanagement} - Maßnahmen zur \emph{Kontrolle und Untersuchung} des bestehenden Produkts, durch Anwendung automatisierte Analysen, Metrik-Schwellenwerte und Unit-Tests.
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
|
\section{Konstruktives Qualitätsmanagement}
|
||||||
|
Ein konstruktives Qualitätsmanagement umfasst alle Maßnahmen, die proaktiv Mängel verhindern, indem gemeinsame Standards, Prozesse und Werkzeuge festgelegt werden, die jedes Teammitglied während der Entwicklung einhält.
|
||||||
|
|
||||||
|
\subsection{Technische Maßnahmen}
|
||||||
|
|
||||||
|
\subsubsection{JavaDoc}
|
||||||
|
JavaDoc wurde genutzt um alle Öffentlichen Klassen, Interfaces, Records und Methoden zu dokumentieren.
|
||||||
|
Als Teil der GitLab-Build-Pipeline wird JavaDoc auf Richtigkeit überprüft. Werden strukturelle Fehler wie ungültige Referenzen erkannt, schlägt die Pipeline fehl und der Merge wird verhindert.\\
|
||||||
|
|
||||||
|
Unsere implizite Form für JavaDoc-Kommentare ist wie folgt:
|
||||||
|
\begin{itemize}
|
||||||
|
\item Eine prägnante Zusammenfassung in einem Satz in der ersten Zeile
|
||||||
|
\item Zusätzliche Informationen oder Beispiele in weiteren Absätzen.
|
||||||
|
\item Dokumentation aller Parameter (\texttt{@param}), Rückgabewerte (\texttt{@return}) und Fehler (\texttt{@throws}).
|
||||||
|
\end{itemize}
|
||||||
|
Leider konnten wir das in MS4 vorgenommene Ziel, das auch Warnungen zu einem Abbruch der Pipeline führen, aus Technischen Gründen nicht umsetzen.
|
||||||
|
|
||||||
|
\newpage
|
||||||
|
\subsubsection{Logging}
|
||||||
|
Das Projekt verwendet Log4J~2 (\texttt{log4j-api} und \texttt{log4j-core} zur Laufzeit) zusammen mit Jansi für eine farbige Konsolenausgabe.
|
||||||
|
Das Format der Ausgabe ist durch eine Konfigurationsdatei vereinheitlicht.\\
|
||||||
|
|
||||||
|
Die Protokollstufen werden wie folgt einheitlich verwendet:
|
||||||
|
\begin{itemize}
|
||||||
|
\item \texttt{DEBUG} für interne Zustandsänderungen
|
||||||
|
\item \texttt{INFO} für Lebenszyklusereignisse wie Serverstart, Verbindungsaufbau/-trennung des Clients
|
||||||
|
\item \texttt{WARN} für behebbare Anomalien
|
||||||
|
\item \texttt{ERROR} für nicht behebbare Fehler
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
|
Im Gegensatz zu MS4 wurden die Namen der Logger gekürzt und nicht mehr der gesamte Classpath verwendet. Ein Beispiel für die Ausgabe sieht so aus:
|
||||||
|
\begin{figure}[H]
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=\textwidth]{../../images/milestones/ms-6/qa-report/server_log.png}
|
||||||
|
\caption{Konsolenausgabe des Servers während dem Verbindungsaufbau und Anmeldung eines Nutzers}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
\subsection{Organisatorische Maßnahmen}
|
||||||
|
|
||||||
|
\subsubsection{Teamkultur und die \texttt{CONTRIBUTORS}-Datei}
|
||||||
|
Das Stammverzeichnis des GitLab-Repositories enthält eine Datei namens \texttt{CONTRIBUTORS.md}, die die seit MS4 unveränderten Teamkonventionen dokumentiert:
|
||||||
|
\begin{itemize}
|
||||||
|
\item Die Verwendung von Branches - Feature-Branches werden in \texttt{main} zusammengeführt
|
||||||
|
\item Merge-Richtlinie - CI muss bestanden werden. Eine Genehmigung durch Kollegen ist wünschenswert wenn Änderungen an dessen Code vorgenommen wurden.
|
||||||
|
\item Namenskonventionen für Branches und Commits
|
||||||
|
\item Code-Stil - Google-Java-Format, AOSP-Variante, Einrückung mit vier Leerzeichen
|
||||||
|
\item Jede Änderung beginnt mit einem Issue oder Task in GitLab, bevor mit der Umsetzung begonnen wird
|
||||||
|
\item Branch-Namen folgen dem Muster \texttt{<typ>/<kurzbeschreibung>} gemäß \href{https://conventional-branch.github.io/}{Conventional Branch} Standard
|
||||||
|
\item Commit-Messages folgen dem \href{https://www.conventionalcommits.org/en/v1.0.0/}{Conventional Commits} Standard
|
||||||
|
\item Code-Style wird durch Linter (Checkstyle) und Formatter (Spotless, Google/AOSP Java Style) automatisiert überprüft
|
||||||
|
\item Merge Anfragen müssen eine Beschreibung enthalten und auf das zugehörige Issue oder den Task verweisen
|
||||||
|
\item Zusammenarbeit und Kommunikation erfolgen bevorzugt über Issue-Kommentare, nicht über private Nachrichten
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
|
\subsubsection{GitLab-Task- und Issue-Vorlagen für Fortschrittsverfolgung}
|
||||||
|
GitLab-Vorlagen für Tasks und Issues werden für alle geplanten Arbeitselemente verwendet. Die Aufgabenvorlage sorgt für eine einheitliche Struktur, die die Fortschrittsverfolgung erleichtert und das Risiko vager oder unvollständiger Arbeitselemente reduziert.
|
||||||
|
|
||||||
|
Durch die Vergabe von Labels kann Tasks und Issues weiterer Kontext gegeben werden.
|
||||||
|
|
||||||
|
\newpage
|
||||||
|
\section{Analytisches Qualitätsmanagement}
|
||||||
|
|
||||||
|
\subsection{Analytische Verfahren}
|
||||||
|
|
||||||
|
\subsubsection{Eigentumsrechte an Programmcode über GitLab \texttt{CODEOWNERS}}
|
||||||
|
In unserem Konzept haben wir uns vorgenommen, durch eine \texttt{CODEOWNERS} Datei den Teammitgliedern die Eigentumsrechte ihres Programmcodes zuzusprechen. Leider hat sich bestätigt das die von SciCORE betriebene Instanz nicht die Premium-Stufe hat, wodurch diese Funktion für uns nicht zur Verfügung steht. \\
|
||||||
|
|
||||||
|
Statt auf eine Automatisierte Grundlage zu vertrauen, haben wir uns für den nächstbesten Weg der Disziplinarität entschieden, wie am Beispiel von \href{https://git.scicore.unibas.ch/cs108-fs26/Gruppe-13/-/merge_requests/166}{dieser Merge-Anfrage} gesehen werden kann.
|
||||||
|
|
||||||
|
\subsubsection{Automatisiertes CI-Linting und Build-Verifizierung}
|
||||||
|
Jeder Push und jede Merge-Anfrage löst die CI-Pipeline aus.
|
||||||
|
|
||||||
|
Für Pushes und Merge-Anfragen setzt sich die Pipeline aus folgenden Phasen zusammen:
|
||||||
|
\begin{enumerate}
|
||||||
|
\item \textbf{Linting-Phase} \textcolor{blue}{[Push, MR]} - Checkstyle und Spotless überprüfen, ob der Programmcode dem vereinbarten Stil entspricht.
|
||||||
|
\item \textbf{Build-Phase} \textcolor{blue}{[Push, MR]} - \texttt{./gradlew assemble} prüft, ob das gesamte Projekt fehlerfrei kompiliert werden kann.
|
||||||
|
\item \textbf{Checkstyle-Report} \textcolor{blue}{[MR]} - Ein zusätzlicher Checkstyle-Report wird für Merge-Anfragen erzeugt und als Code-Quality-Report bereitgestellt.
|
||||||
|
\item \textbf{Javadoc-Prüfung} \textcolor{blue}{[MR]} - JavaDoc wird auf Korrektheit geprüft.
|
||||||
|
\item \textbf{Test-Phase} \textcolor{blue}{[Push, MR]} - Automatisierte Tests werden ausgeführt und ein Testreport erzeugt.
|
||||||
|
\end{enumerate}
|
||||||
|
Die Entscheidung das fehlgeschlagene Jobs keinen Push aber dafür eine Merge-Anfrage verhindern können, hat sich als vernünftig bewehrt.
|
||||||
|
Über die Dauer des Projektes hat diese Pipeline mehrmals verhindert das Fehlerhafter oder sogar kaputter Programmcode in den main Branch gelangen konnte.
|
||||||
|
|
||||||
|
\newpage
|
||||||
|
\subsection{Testverfahren}
|
||||||
|
Unit-Tests wurden mit \textit{JUnit 5} geschrieben und in der Testphase der CI-Pipeline ausgeführt. Ein fehlgeschlagener Test blockiert die Merge-Anfrage.
|
||||||
|
|
||||||
|
Als weiteres Werkzeug verwendeten wir \textit{JaCoCo} für die Ermittlung der Testabdeckung. \\
|
||||||
|
Die Testabdeckung für Meilenstein sechs ist wie folgt:
|
||||||
|
|
||||||
|
\begin{table}[H]
|
||||||
|
\centering
|
||||||
|
\renewcommand{\arraystretch}{1.4}
|
||||||
|
\begin{tabular}{L{7.5cm} r r}
|
||||||
|
\textbf{Paketname (gekürzt)} & \textbf{Instr.\ Cov.} & \textbf{Branch Cov.} \\
|
||||||
|
\midrule
|
||||||
|
\texttt{client.chat} & 30\,\% & 16\,\% \\
|
||||||
|
\texttt{client.game} & 15\,\% & 2\,\% \\
|
||||||
|
\texttt{client.network} & 2\,\% & 1\,\% \\
|
||||||
|
\texttt{client.ui} (von Abdeckung ausgeschlossen) & 0\,\% & 0\,\% \\
|
||||||
|
\texttt{server.app.checks} & 0\,\% & 0\,\% \\
|
||||||
|
\texttt{server.app.commands} & 0\,\% & 0\,\% \\
|
||||||
|
\texttt{server.domain.game} & 68\,\% & 43\,\% \\
|
||||||
|
\texttt{server.domain.*} & 59\,\% & 44\,\% \\
|
||||||
|
\texttt{server.network.transport} & 0\,\% & 0\,\% \\
|
||||||
|
\texttt{server.network.protocol} & 67\,\% & 55\,\% \\
|
||||||
|
\texttt{server.network.*} & 67\,\% & 55\,\% \\
|
||||||
|
\midrule
|
||||||
|
\textbf{Summe} & \textbf{18\,\%} & \textbf{11\,\%} \\
|
||||||
|
\bottomrule
|
||||||
|
\end{tabular}
|
||||||
|
\end{table}
|
||||||
|
|
||||||
|
Im vierten Meilenstein haben wir uns das Ziel gesetzt die Testabdeckung für die Game-Engine und wichtige Netzwerkkomponenten auf mindestens 50\% zu erhöhen, dieses Ziel haben wir laut JaCoCo nicht erreicht.\\
|
||||||
|
Geht man jedoch nach der Abdeckung der "Test Runner for Java" Erweiterung in VSCode, dann beträgt die Abdeckung 51\%. Sowohl Julian (Game-Engine) als auch Lars (Serverseitiges Netzwerk) haben sich nach diesen Angaben gereichtet, weshalb wir dachten wir hätten unser Ziel erreicht.
|
||||||
|
|
||||||
|
\begin{figure}[H]
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=0.4\textwidth]{../../images/milestones/ms-6/qa-report/vscode_code_coverage.png}
|
||||||
|
\caption{Abweichende Angaben bezüglich der Abdeckung von VSCode zu JaCoCo}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
Die Verwendung zwei unterschiedlicher Tools zur Beurteilung des Fortschritts ist definitiv etwas, was es in Zukunft zu vermeiden gilt.
|
||||||
|
|
||||||
|
\newpage
|
||||||
|
\section{Metriken}
|
||||||
|
\textit{Die nachfolgenden Metriken wurden am 17. Mai 2026 um 20:58 Uhr erhoben, neuere Änderungen sind daher nicht berücksichtigt.}
|
||||||
|
|
||||||
|
\subsection{Lines of Code}
|
||||||
|
\begin{figure}[H]
|
||||||
|
\centering
|
||||||
|
\begin{tikzpicture}
|
||||||
|
\begin{axis}[
|
||||||
|
width=\textwidth,
|
||||||
|
height=0.45\textwidth,
|
||||||
|
xlabel={Meilenstein},
|
||||||
|
ylabel={Zeilen},
|
||||||
|
ymin=0,
|
||||||
|
ymax=31000,
|
||||||
|
xtick={1,2,3},
|
||||||
|
xticklabels={MS4,MS5,MS6},
|
||||||
|
legend pos=north west,
|
||||||
|
grid=both,
|
||||||
|
scaled y ticks=false,
|
||||||
|
yticklabel style={/pgf/number format/fixed}
|
||||||
|
]
|
||||||
|
|
||||||
|
% Actual Java code
|
||||||
|
\addplot[
|
||||||
|
color=blue,
|
||||||
|
mark=o,
|
||||||
|
thick
|
||||||
|
]
|
||||||
|
coordinates {
|
||||||
|
(1,9760)
|
||||||
|
(2,12972)
|
||||||
|
(3,15319)
|
||||||
|
};
|
||||||
|
\addlegendentry{Java code (actual)}
|
||||||
|
|
||||||
|
% Total Java
|
||||||
|
\addplot[
|
||||||
|
color=red,
|
||||||
|
mark=square*,
|
||||||
|
thick
|
||||||
|
]
|
||||||
|
coordinates {
|
||||||
|
(1,16396)
|
||||||
|
(2,21203)
|
||||||
|
(3,24319)
|
||||||
|
};
|
||||||
|
\addlegendentry{Java total}
|
||||||
|
|
||||||
|
% Total in src
|
||||||
|
\addplot[
|
||||||
|
color=green!60!black,
|
||||||
|
mark=diamond*,
|
||||||
|
thick
|
||||||
|
]
|
||||||
|
coordinates {
|
||||||
|
(1,18012)
|
||||||
|
(2,22872)
|
||||||
|
(3,29639)
|
||||||
|
};
|
||||||
|
\addlegendentry{Total in src}
|
||||||
|
|
||||||
|
\end{axis}
|
||||||
|
\end{tikzpicture}
|
||||||
|
\caption{Entwicklung der Java-Zeilen (tatsächlicher Code vs. Gesamt) über die Meilensteine hinweg}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
\subsection{Verteilung der Code-Zeilen auf verschiedene Dateitypen}
|
||||||
|
\begin{figure}[H]
|
||||||
|
\centering
|
||||||
|
\begin{tikzpicture}
|
||||||
|
\pie[
|
||||||
|
text=legend,
|
||||||
|
radius=4
|
||||||
|
]{
|
||||||
|
62.26/Java,
|
||||||
|
17.19/PostCSS,
|
||||||
|
14.90/Markdown,
|
||||||
|
2.87/XML,
|
||||||
|
2.79/HTML
|
||||||
|
}
|
||||||
|
\end{tikzpicture}
|
||||||
|
\caption{Verteilung der Code-Zeilen (Top 5 Dateitypen)}
|
||||||
|
\label{fig:loc-pie}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
\end{document}
|
||||||
Reference in New Issue
Block a user