\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{ZH (openkeyword)} \pdfinfo{ /Title (gherkin.pdf) /Creator (Cheatography) /Author (ZH (openkeyword)) /Subject (Gherkin++ 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}{166F67} \definecolor{LightBackground}{HTML}{F0F6F5} \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{Gherkin++ Cheat Sheet}}}} \\ \normalsize{by \textcolor{DarkBackground}{ZH (openkeyword)} via \textcolor{DarkBackground}{\uline{cheatography.com/68516/cs/17281/}}} \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}ZH (openkeyword) \\ \uline{cheatography.com/openkeyword} \\ \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 1st June, 2021.\\ 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{1.2 cm} x{6.8 cm} } \SetRowColor{DarkBackground} \mymulticolumn{2}{x{8.4cm}}{\bf\textcolor{white}{Categories}} \tn % Row 0 \SetRowColor{LightBackground} {\bf{(I)}} & {\bf{Input category}} - Input categories can be preconditions or input variables. \tn % Row Count 3 (+ 3) % Row 1 \SetRowColor{white} {\bf{(O)}} & {\bf{Output category}} - Expected result data of the test case. \tn % Row Count 5 (+ 2) % Row 2 \SetRowColor{LightBackground} {\bf{(A)}} & {\bf{Action category}} - An action is a simple element of the test process. \tn % Row Count 8 (+ 3) % Row 3 \SetRowColor{white} {\bf{(F)}} & {\bf{Feature call}} \tn % Row Count 10 (+ 2) \hhline{>{\arrayrulecolor{DarkBackground}}--} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{x{1.2 cm} x{6.8 cm} } \SetRowColor{DarkBackground} \mymulticolumn{2}{x{8.4cm}}{\bf\textcolor{white}{Choices}} \tn % Row 0 \SetRowColor{LightBackground} {\bf{(S)}} & {\bf{Single}} - Select the choice only once. \tn % Row Count 2 (+ 2) % Row 1 \SetRowColor{white} {\bf{(D)}} & {\bf{Default}} - Is the default value of the choices. \tn % Row Count 4 (+ 2) \hhline{>{\arrayrulecolor{DarkBackground}}--} \SetRowColor{LightBackground} \mymulticolumn{2}{x{8.4cm}}{{\bf{Example:}} \newline \newline {\emph{Categorie}} \newline paying method (O): card{\bf{(D)}}; on site; money transfer \newline price (O): 0; 100; 1000 \newline \newline {\emph{Constraint}} \newline {\bf{WHEN}} …. {\bf{THEN}} price {\bf{IS}} 100 \newline \newline The generated test will be: \newline … paying method=card, price=100} \tn \hhline{>{\arrayrulecolor{DarkBackground}}--} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{x{3.04 cm} x{4.96 cm} } \SetRowColor{DarkBackground} \mymulticolumn{2}{x{8.4cm}}{\bf\textcolor{white}{Constraints}} \tn % Row 0 \SetRowColor{LightBackground} Constraint name/test name & each constraint may have a name, which is inherited to the generated test \tn % Row Count 4 (+ 4) % Row 1 \SetRowColor{white} {\bf{GIVEN}} & describes preconditions, and can be omitted\{\{nl\}\}In Multilayer structures the {\emph{outputs are suppressed}} \tn % Row Count 9 (+ 5) % Row 2 \SetRowColor{LightBackground} {\bf{WHEN}} & contains the inputs and obligatory \tn % Row Count 11 (+ 2) % Row 3 \SetRowColor{white} {\bf{THEN}} & contains the output and obligatory \tn % Row Count 13 (+ 2) % Row 4 \SetRowColor{LightBackground} {\bf{AND}} & connects two {\bf{GIVEN}}/{\bf{WHEN}}/{\bf{THEN}} expressions \tn % Row Count 16 (+ 3) % Row 5 \SetRowColor{white} {\bf{IS}}/{\bf{ARE}} & connects a category and a choice of this category, such as MyCat {\bf{IS}} MyChoice. \tn % Row Count 20 (+ 4) \hhline{>{\arrayrulecolor{DarkBackground}}--} \SetRowColor{LightBackground} \mymulticolumn{2}{x{8.4cm}}{{\bf{Note 1:}} The basic difference between {\bf{GIVEN}} and {\bf{WHEN}} is that if a {\bf{GIVEN}} contains a existing test (see Multilayer structure syntax elements), then {\emph{outputs are suppressed}}, only input will remain. \newline \newline {\bf{Note 2:}} The original Gherkin syntax requires the {\bf{GIVEN}} - {\bf{WHEN}} - {\bf{THEN}} series. \newline However, state transition testing requires {\bf{WHEN}} - {\bf{THEN}} - {\bf{WHEN}} - {\bf{THEN}} - {\bf{WHEN}} - {\bf{THEN}} series as well. 4Test permits this syntax.} \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}{Table}} \tn % Row 0 \SetRowColor{LightBackground} \mymulticolumn{1}{x{8.4cm}}{{\bf{WHEN}} original price {\bf{IS}} 20 {\bf{AND}} reduction is 10 {\bf{THEN}} total price IS 19\{\{nl\}\}{\bf{WHEN}} original price {\bf{IS}} 100 {\bf{AND}} reduction is 12 THEN total price IS 88\{\{nl\}\}\{\{nl\}\}{\bf{The same in one constraint:}}\{\{nl\}\}{\bf{WHEN}} original price IS 20 | 100 {\bf{AND}}\{\{nl\}\}reduction {\bf{IS}} 10 | 12\{\{nl\}\}{\bf{THEN}} total price {\bf{IS}} 19 | 88} \tn % Row Count 7 (+ 7) \hhline{>{\arrayrulecolor{DarkBackground}}-} \SetRowColor{LightBackground} \mymulticolumn{1}{x{8.4cm}}{Tables reducing the number of constraint if they differ in only the choices. If you are a test analyst, you will understand this constraint and your model will be shorter. On the other hand, the generated test cases will remain understandable for everybody.} \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}{Extraction}} \tn % Row 0 \SetRowColor{LightBackground} \mymulticolumn{1}{x{8.4cm}}{{\bf{PRECONDITION}} - make models simpler. In lots of the cases when we would like to end-toend test a feature, we have to reach the feature to be tested. This requires to set some preconditions, i.e. the necessary input values. It's not reasonable to include these preconditions to each constraint, and it's reasonable to separate the preconditions and the tests for the feature. {\bf{PRECONDITION}} does this.} \tn % Row Count 9 (+ 9) \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{x{2.72 cm} x{5.28 cm} } \SetRowColor{DarkBackground} \mymulticolumn{2}{x{8.4cm}}{\bf\textcolor{white}{AC: Acceptance Criterion}} \tn % Row 0 \SetRowColor{LightBackground} {\bf{SUB}} {\emph{{[}AC-Name{]}}}: & SUB-keyword defines an AC as SUB call. \tn % Row Count 2 (+ 2) % Row 1 \SetRowColor{white} {\emph{{[}AC-Name{]}}} {\bf{:}} & Acceptance Criterion \tn % Row Count 4 (+ 2) \hhline{>{\arrayrulecolor{DarkBackground}}--} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{x{4.32 cm} x{3.68 cm} } \SetRowColor{DarkBackground} \mymulticolumn{2}{x{8.4cm}}{\bf\textcolor{white}{Use Case Step Counter}} \tn % Row 0 \SetRowColor{LightBackground} {\bf{@1}}\{\{nl\}\}{\bf{@2}} & First arder Step \tn % Row Count 1 (+ 1) % Row 1 \SetRowColor{white} {\bf{@1a}}\{\{nl\}\}{\bf{@1b}} & Second order Step \tn % Row Count 2 (+ 1) % Row 2 \SetRowColor{LightBackground} \mymulticolumn{2}{x{8.4cm}}{{\bf{@1}}\{\{nl\}\}~{\bf{@1a}}\{\{nl\}\}~{\bf{@1b}}} \tn % Row Count 3 (+ 1) \hhline{>{\arrayrulecolor{DarkBackground}}--} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{OKW}} \tn % Row 0 \SetRowColor{LightBackground} \mymulticolumn{1}{x{8.4cm}}{{\bf{Input-Caregory}}} \tn % Row Count 1 (+ 1) % Row 1 \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{`CN (I): CHOICE` -\textgreater{} `SetValue( CN, CHOICE )`} \tn % Row Count 2 (+ 1) % Row 2 \SetRowColor{LightBackground} \mymulticolumn{1}{x{8.4cm}}{{\bf{Action-Category}}} \tn % Row Count 3 (+ 1) % Row 3 \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{`button (A): CHOICE` -\textgreater{} `ClickOn( CHOICE )`} \tn % Row Count 4 (+ 1) % Row 4 \SetRowColor{LightBackground} \mymulticolumn{1}{x{8.4cm}}{`Button (A): CHOICE` -\textgreater{} `ClickOn( CHOICE )`} \tn % Row Count 5 (+ 1) % Row 5 \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{`CN (A): {\bf{clicked}}` -\textgreater{} `ClickOn( CN )`} \tn % Row Count 6 (+ 1) % Row 6 \SetRowColor{LightBackground} \mymulticolumn{1}{x{8.4cm}}{{\bf{Output-Caregory}}} \tn % Row Count 7 (+ 1) % Row 7 \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{`CN (O): CHOICE` -\textgreater{} `VerifyValue( CN, CHOICE )`} \tn % Row Count 8 (+ 1) % Row 8 \SetRowColor{LightBackground} \mymulticolumn{1}{x{8.4cm}}{`CN (O): \#caption CHOICE` -\textgreater{} `VerifyCaption( CN, CHOICE )`} \tn % Row Count 10 (+ 2) % Row 9 \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{`CN (O): \#label CHOICE` -\textgreater{} `VerifyLabel( CN, CHOICE )`} \tn % Row Count 12 (+ 2) % Row 10 \SetRowColor{LightBackground} \mymulticolumn{1}{x{8.4cm}}{`CN (O): \#placeholder CHOICE` -\textgreater{} `VerifyPlaceholder( CN, CHOICE )`} \tn % Row Count 14 (+ 2) % Row 11 \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{`CN (O): \#tooltip CHOICE` -\textgreater{} `VerifyTooltip( CN, CHOICE )`} \tn % Row Count 16 (+ 2) % Row 12 \SetRowColor{LightBackground} \mymulticolumn{1}{x{8.4cm}}{`CN (O): \#exist yes` -\textgreater{} `VerifyExists( CN, 'YES' )`} \tn % Row Count 18 (+ 2) % Row 13 \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{`CN (O): @exist no` -\textgreater{} `VerifyExists( CN, 'NO' )`} \tn % Row Count 19 (+ 1) % Row 14 \SetRowColor{LightBackground} \mymulticolumn{1}{x{8.4cm}}{`CN (O): @exist yes` -\textgreater{} `VerifyIsActive( CN, 'YES' )`} \tn % Row Count 21 (+ 2) % Row 15 \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{`CN (O): @exist no` -\textgreater{} `VerifyIsActive( CN, 'NO' )`} \tn % Row Count 23 (+ 2) % Row 16 \SetRowColor{LightBackground} \mymulticolumn{1}{x{8.4cm}}{`CN (O): @exist yes` -\textgreater{} `VerifyHasFocus( CN, 'YES' )`} \tn % Row Count 25 (+ 2) % Row 17 \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{`CN (O): @exist no` -\textgreater{} `VerifyHasFocus( CN, 'NO' )`} \tn % Row Count 27 (+ 2) \hhline{>{\arrayrulecolor{DarkBackground}}-} \SetRowColor{LightBackground} \mymulticolumn{1}{x{8.4cm}}{{\bf{Note:}} \newline CN: {\bf{C}}ategorie {\bf{N}}ame \newline \newline Boolean VerifyExists(); \newline Boolean VerifyIsActive(); \newline Boolean VerifyHasFocus();} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} % That's all folks \end{multicols*} \end{document}