\documentclass[10pt,a4paper]{article} % Packages \usepackage{fancyhdr} % For header and footer \usepackage{multicol} % Allows multicols in tables \usepackage{tabularx} % Intelligent column widths \usepackage{tabulary} % Used in header and footer \usepackage{hhline} % Border under tables \usepackage{graphicx} % For images \usepackage{xcolor} % For hex colours %\usepackage[utf8x]{inputenc} % For unicode character support \usepackage[T1]{fontenc} % Without this we get weird character replacements \usepackage{colortbl} % For coloured tables \usepackage{setspace} % For line height \usepackage{lastpage} % Needed for total page number \usepackage{seqsplit} % Splits long words. %\usepackage{opensans} % Can't make this work so far. Shame. Would be lovely. \usepackage[normalem]{ulem} % For underlining links % Most of the following are not required for the majority % of cheat sheets but are needed for some symbol support. \usepackage{amsmath} % Symbols \usepackage{MnSymbol} % Symbols \usepackage{wasysym} % Symbols %\usepackage[english,german,french,spanish,italian]{babel} % Languages % Document Info \author{Huluvu424242 (FunThomas424242)} \pdfinfo{ /Title (junit-5.pdf) /Creator (Cheatography) /Author (Huluvu424242 (FunThomas424242)) /Subject (JUnit 5 Cheat Sheet) } % Lengths and widths \addtolength{\textwidth}{6cm} \addtolength{\textheight}{-1cm} \addtolength{\hoffset}{-3cm} \addtolength{\voffset}{-2cm} \setlength{\tabcolsep}{0.2cm} % Space between columns \setlength{\headsep}{-12pt} % Reduce space between header and content \setlength{\headheight}{85pt} % If less, LaTeX automatically increases it \renewcommand{\footrulewidth}{0pt} % Remove footer line \renewcommand{\headrulewidth}{0pt} % Remove header line \renewcommand{\seqinsert}{\ifmmode\allowbreak\else\-\fi} % Hyphens in seqsplit % This two commands together give roughly % the right line height in the tables \renewcommand{\arraystretch}{1.3} \onehalfspacing % Commands \newcommand{\SetRowColor}[1]{\noalign{\gdef\RowColorName{#1}}\rowcolor{\RowColorName}} % Shortcut for row colour \newcommand{\mymulticolumn}[3]{\multicolumn{#1}{>{\columncolor{\RowColorName}}#2}{#3}} % For coloured multi-cols \newcolumntype{x}[1]{>{\raggedright}p{#1}} % New column types for ragged-right paragraph columns \newcommand{\tn}{\tabularnewline} % Required as custom column type in use % Font and Colours \definecolor{HeadBackground}{HTML}{333333} \definecolor{FootBackground}{HTML}{666666} \definecolor{TextColor}{HTML}{333333} \definecolor{DarkBackground}{HTML}{A3A3A3} \definecolor{LightBackground}{HTML}{F3F3F3} \renewcommand{\familydefault}{\sfdefault} \color{TextColor} % Header and Footer \pagestyle{fancy} \fancyhead{} % Set header to blank \fancyfoot{} % Set footer to blank \fancyhead[L]{ \noindent \begin{multicols}{3} \begin{tabulary}{5.8cm}{C} \SetRowColor{DarkBackground} \vspace{-7pt} {\parbox{\dimexpr\textwidth-2\fboxsep\relax}{\noindent \hspace*{-6pt}\includegraphics[width=5.8cm]{/web/www.cheatography.com/public/images/cheatography_logo.pdf}} } \end{tabulary} \columnbreak \begin{tabulary}{11cm}{L} \vspace{-2pt}\large{\bf{\textcolor{DarkBackground}{\textrm{JUnit 5 Cheat Sheet}}}} \\ \normalsize{by \textcolor{DarkBackground}{Huluvu424242 (FunThomas424242)} via \textcolor{DarkBackground}{\uline{cheatography.com/19991/cs/19112/}}} \end{tabulary} \end{multicols}} \fancyfoot[L]{ \footnotesize \noindent \begin{multicols}{3} \begin{tabulary}{5.8cm}{LL} \SetRowColor{FootBackground} \mymulticolumn{2}{p{5.377cm}}{\bf\textcolor{white}{Cheatographer}} \\ \vspace{-2pt}Huluvu424242 (FunThomas424242) \\ \uline{cheatography.com/funthomas424242} \\ \uline{\seqsplit{github}.com/Huluvu424242} \end{tabulary} \vfill \columnbreak \begin{tabulary}{5.8cm}{L} \SetRowColor{FootBackground} \mymulticolumn{1}{p{5.377cm}}{\bf\textcolor{white}{Cheat Sheet}} \\ \vspace{-2pt}Not Yet Published.\\ Updated 23rd March, 2019.\\ Page {\thepage} of \pageref{LastPage}. \end{tabulary} \vfill \columnbreak \begin{tabulary}{5.8cm}{L} \SetRowColor{FootBackground} \mymulticolumn{1}{p{5.377cm}}{\bf\textcolor{white}{Sponsor}} \\ \SetRowColor{white} \vspace{-5pt} %\includegraphics[width=48px,height=48px]{dave.jpeg} Measure your website readability!\\ www.readability-score.com \end{tabulary} \end{multicols}} \begin{document} \raggedright \raggedcolumns % Set font size to small. Switch to any value % from this page to resize cheat sheet text: % www.emerson.emory.edu/services/latex/latex_169.html \footnotesize % Small font. \begin{multicols*}{2} \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{JUnit5 Grundlagen}} \tn \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{{\bf{Architektur}} \newline % Row Count 1 (+ 1) JUnit 5 besteht aus 3 Teilen: \newline % Row Count 2 (+ 1) * Das Jupiter API für Testautoren \newline % Row Count 3 (+ 1) * Das JUnit Platform Launcher API für BuildTools und IDE Integration \newline % Row Count 5 (+ 2) * Das Test Engine SPI für andere Testing Framework \newline % Row Count 7 (+ 2) {\bf{Test Engines}} \newline % Row Count 8 (+ 1) JUnit 5 besteht aus 2 \seqsplit{Test-Engine-Implementierungen:} \newline % Row Count 10 (+ 2) * Jupiter Engine zur Ausführung von JUnit 5 Testf{\"a}llen \newline % Row Count 12 (+ 2) * Vintage Engine zur Ausführung von JUnit 3 oder JUnit 4 Testf{\"a}llen \newline % Row Count 14 (+ 2) In einem Projekt kann entweder die eine oder die andere Engine oder beide zugleich zum Einsatz kommen. \newline % Row Count 17 (+ 3) Über die Vintage Engine bleibt die M{\"o}glichkeit Frameworks zu nutzen, welche nur das JUnit 4 API unterstützen z.B. \{\{popup="https://github.com/google/compile-testing"\}\}compile-testing\{\{/popup\}\}. \newline % Row Count 21 (+ 4) Da im gleichen Projekt zus{\"a}tzlich zur Vintage Engine auch die Jupiter Engine eingesetzt werden kann, k{\"o}nnen die eigenen Tests dann in JUnit 5 geschrieben werden und somit von den neuen Features provitieren. \newline % Row Count 26 (+ 5) {\bf{Integration in Build Tools}} \newline % Row Count 27 (+ 1) * Gradle ab 4.6 \newline % Row Count 28 (+ 1) * Maven Surefire ab 2.22.0 \newline % Row Count 29 (+ 1) * Ant ab 1.10.3 \newline % Row Count 30 (+ 1) } \tn \end{tabularx} \par\addvspace{1.3em} \vfill \columnbreak \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{JUnit5 Grundlagen (cont)}} \tn \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{{\bf{Integration in IDEs}} \newline % Row Count 1 (+ 1) * IntelliJ IDEA ab 2016.2 \newline % Row Count 2 (+ 1) * Eclipse ab 4.71a \newline % Row Count 3 (+ 1) * Visual Studio Code Java Testrunner ab 0.4.0 \newline % Row Count 4 (+ 1) * Netbeans ab 10.0 (noch in Arbeit)% Row Count 5 (+ 1) } \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{Features von JUnit 5}} \tn \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{{\bf{Features von JUnit 5}} \newline % Row Count 1 (+ 1) * Trennung der Testnamen von den Methodennamen \newline % Row Count 2 (+ 1) Über @DisplayName lassen sich S{\"a}tze zur fachliche Testbezeichnung festlegen. So k{\"o}nnen die Methoden immer noch alle mit testXXXX beginnen um in der Aufrufhierarchie Testmethoden sofort erkennen zu k{\"o}nnen. Im Report steht trotzdem ein sinnvoller fachlicher Name oder Satz welcher den Test beschreibt. \newline % Row Count 9 (+ 7) * Parameterisierte Tests \newline % Row Count 10 (+ 1) Über @ParameterizedTest lassen sich parametrisierte Tests erstellen. Bei diesen ist es m{\"o}glich die Quelle der Parameter separat festzulegen. Beispielsweise kann mit @CsvSource eine inline kommaseparierte Liste als Datenquelle genutzt werden. Über @CsvFileSource l{\"a}sst sich eine CSV Datei als Datenquelle nutzen und damit auch über diverse Tests sharen. \newline % Row Count 18 (+ 8) Allgemein ist es nicht notwendig aber wer m{\"o}chte kann über @ConvertWith Konverter für den Datenimport verwenden. CSV ist nicht das einzige Format für Datenquellen, hier entstehen kontinuierlich weitere. \newline % Row Count 23 (+ 5) * Dynamische Tests \newline % Row Count 24 (+ 1) Dynamische Tests sind eine neue Art von Tests im JUnit Universum. Über die @TestFactory Annotation lassen sich dynamisch, zur Laufzeit Testf{\"a}lle erzeugen. Wofür ist das gut? Angenommen wir haben 10 Tests geschrieben von denen jeder jeweils eine andere Eigenschaft zur Barrierefreiheit einer Webseite überprüft. Um diese Tests auf 3 Webseiten anzuwenden, müssten wir jeden der 10 Tests als parametrisierten Test realisieren und stets eine Liste der 3 zu prüfenden Webseiten übergeben. Mit dynamischen Tests kann man sich dieses Vorgehen sparen. Die Tests werden in einer Methode dynamisch zusammengebaut per return Befehl an das Testframework zurück gegeben. Dieses führt die Tests dann aus und l{\"a}sst diese in Reports erscheinen als ob sie wie normale Tests geschrieben wurden. \newline % Row Count 40 (+ 16) } \tn \end{tabularx} \par\addvspace{1.3em} \vfill \columnbreak \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{Features von JUnit 5 (cont)}} \tn \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{{\bf{Achtung}}: Die Lifecycle Methoden @Before, @BeforeAll, @After, @AfterAll werden von dynamische Tests nicht berücksichtigt - bleiben also ohne Wirkung auf die dynamischen Tests. \newline % Row Count 4 (+ 4) Eine sehr gute Einführung in das Thema findet sich man bei \{\{popup="https://www.baeldung.com/junit5-dynamic-tests"\}\}Baeldung\{\{/popup\}\} \newline % Row Count 7 (+ 3) * Repeated Tests \newline % Row Count 8 (+ 1) Hierbei handelt es sich um eine weitere neue Art von Testf{\"a}llen. Bei diesen kann über die Annotation @RepeatedTest die Anzahl der Testausführungen angegeben werden. Denkbare Eins{\"a}tze für diese Testart w{\"a}ren zur Realisierung von Zufallstests (eine erg{\"a}nzende Testart beim Modultest) oder zur Erkennung von Flackertests. Falls man diese Art Test{\"a}lle für Zufallstests nutzt, sollte man darauf achten, dass die verwendeten Testparameter im Report erscheinen, da sonst bei der Auswertung nicht klar ist unter welchen Bedingungen der Test fehl geschlagen ist. \newline % Row Count 20 (+ 12) * Extensions \newline % Row Count 21 (+ 1) In JUnit 5 wurde das Konzept der @RunWith und @Rule Erweiterungen durch das Konzept der @ExtendWith ersetzt. Der Vorteil ist ein nun einheitliches Konzept zur Erweiterung. Extensions lassen sich verstehen wie Plugins welche bestimmte Extensions Points des JUnit 5 Frameworks erweitern. In der Regel nutzen Frameworks wie Mockito, Spring, Testcontainers, Wiremock, Kafka und viele mehr diese Schnittstelle aber natürlich kann man auch selbst hierüber das Framework erweitern. Zur Erweiterung stehen folgende Arten zur Verfügung: \newline % Row Count 32 (+ 11) } \tn \end{tabularx} \par\addvspace{1.3em} \vfill \columnbreak \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{Features von JUnit 5 (cont)}} \tn \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{** Verarbeitung der Testinstanz nach Testausführung \newline % Row Count 2 (+ 2) ** Bedingte Testausführung \newline % Row Count 3 (+ 1) ** Lifecycle Callbacks \newline % Row Count 4 (+ 1) ** Parameteraufl{\"o}sung \newline % Row Count 5 (+ 1) ** Exception handling \newline % Row Count 6 (+ 1) Ein sehr guter Einstieg in dieses Thema findes sich wieder bei \{\{popup="https://www.baeldung.com/junit-5-extensions"\}\}Baeldung\{\{/popup\}\} \newline % Row Count 9 (+ 3) * Kotlin Styled Tests \newline % Row Count 10 (+ 1) Um ein Feeling von Kotlin in das JUnit Framework zu bringen wurden folgende Neuerungen eingeführt: \newline % Row Count 12 (+ 2) * \seqsplit{@TestInstance(Lifecycle.PER\_CLASS)} Alle Testf{\"a}lle teilen sich die gleiche Testsinstanz \newline % Row Count 14 (+ 2) * assertAll und assertThrow \newline % Row Count 15 (+ 1) * Parallele Testausführung \newline % Row Count 16 (+ 1) Mit Hilfe des \seqsplit{junit.jupiter.execution.parallel.enabled} Konfigurationsparameters kann dem Framework mitgeteilt werden, dass alle Testf{\"a}lle parallel ausgeführt werden sollen. Weiterhin kann eingestellt werden, wieviel maximal parallel ausgeführt werden. \newline % Row Count 22 (+ 6) Da in der Regel nicht alle Testf{\"a}lle eine parallele Ausführung vertrage, kann per @Excecution Annotation festgelegt werden, welche Testf{\"a}lle im gleichen Thread ausgeführt werden sollen. Um bei der parallelen Ausführung nicht in Deadlocks zu laufen, kann per @ResourceLock Annotation beschrieben werden, auf welche Resourcen ein Testfall lesend oder schreibend zugreift. JUnit sorgt dann dafür, dass Testf{\"a}lle mit ungünstiger Kombination (schreibend/lesend) nicht zu gleich ausgeführt werden. \newline % Row Count 33 (+ 11) } \tn \end{tabularx} \par\addvspace{1.3em} \vfill \columnbreak \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{Features von JUnit 5 (cont)}} \tn \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{* Warum sollte ich von JUnit 4 umsteigen? \newline % Row Count 1 (+ 1) * M{\"o}glicherweise wolltest Du schon immer einmal fachliche S{\"a}tze in Deinen Testreports sehen - das geht jetzt. \newline % Row Count 4 (+ 3) * Du wolltest einen Spring-Boot Tests als Parametrisierten Test ausführen und dabei keine super kniffligen Worarounds verstehen - das geht jetzt. \newline % Row Count 7 (+ 3) * Du wolltest schon mal zwei @RunWith Annotationen an einer Testklasse befestigen und hast gemerkt, dass das nicht geht? Mit Extensions geht es jetzt. \newline % Row Count 11 (+ 4) * Du wolltest letztens Deine Testf{\"a}lle direkt aus der Testinstanz ableiten und dynamisch erstellen aber es ging nicht - jetzt kannst Du @TestFactory nutzen. \newline % Row Count 15 (+ 4) * Die Laufzeit Deiner Tests ist extrem lang weil Du viele kleine Tests hast, die eigentlich auf dem selben Objekt arbeiten k{\"o}nnten ohne sich zu st{\"o}ren aber JUnit 4 baut jedes Mal eine neue isolierte Umgebung auf und das dauert - jetzt kannst Du \seqsplit{@TestInstance(Lifecycle.PER\_CLASS)} nutzen \newline % Row Count 21 (+ 6) * Du wolltests schon immer Deine Tests mit diversen Tags versehen und dann selbst per Tagauswahl entscheiden welche Tests zur Ausführung kommen - das geht jetzt. \newline % Row Count 25 (+ 4) * Du wolltest schon immer Lambda Ausdrücke und andere Java 8 Features im JUnit Test nutzen - das geht jetzt. \newline % Row Count 28 (+ 3) * Du brauchst JUnit 4 weiterhin weil ein Framework das Du nutzt nicht mehr weiterentwickelt wird und nur mit JUnit 4 klar kommt - JUnit 5 ist kompatible über die Vintage Engine. Du kannst JUnit 5 und JUnit 4 Testf{\"a}lle in einem Projekt realisieren ohne st{\"o}rende Nebenwirkungen.% Row Count 34 (+ 6) } \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} % That's all folks \end{multicols*} \end{document}