From 5a08ed557c6b24b392c4346ccd84bf93efb4c4ad Mon Sep 17 00:00:00 2001 From: Michael Chen Date: Wed, 4 May 2022 19:06:20 +0200 Subject: [PATCH 1/5] Added phase 2 template --- .../phase_02/project_phase02_tasks/.gitignore | 304 ++++++++++++++++++ .../phase_02/project_phase02_tasks/Makefile | 21 ++ .../Solution_Phase02_MichaelChen.tex | 212 ++++++++++++ 3 files changed, 537 insertions(+) create mode 100644 project_task_sheets/phase_02/project_phase02_tasks/.gitignore create mode 100644 project_task_sheets/phase_02/project_phase02_tasks/Makefile create mode 100644 project_task_sheets/phase_02/project_phase02_tasks/Solution_Phase02_MichaelChen.tex diff --git a/project_task_sheets/phase_02/project_phase02_tasks/.gitignore b/project_task_sheets/phase_02/project_phase02_tasks/.gitignore new file mode 100644 index 0000000..44482bd --- /dev/null +++ b/project_task_sheets/phase_02/project_phase02_tasks/.gitignore @@ -0,0 +1,304 @@ +Solution_Phase*_*.pdf +Solution_Phase*_*.zip + +## Core latex/pdflatex auxiliary files: +*.aux +*.lof +*.log +*.lot +*.fls +*.out +*.toc +*.fmt +*.fot +*.cb +*.cb2 +.*.lb + +## Intermediate documents: +*.dvi +*.xdv +*-converted-to.* +# these rules might exclude image files for figures etc. +# *.ps +# *.eps +# *.pdf + +## Generated if empty string is given at "Please type another file name for output:" +.pdf + +## Bibliography auxiliary files (bibtex/biblatex/biber): +*.bbl +*.bcf +*.blg +*-blx.aux +*-blx.bib +*.run.xml + +## Build tool auxiliary files: +*.fdb_latexmk +*.synctex +*.synctex(busy) +*.synctex.gz +*.synctex.gz(busy) +*.pdfsync + +## Build tool directories for auxiliary files +# latexrun +latex.out/ + +## Auxiliary and intermediate files from other packages: +# algorithms +*.alg +*.loa + +# achemso +acs-*.bib + +# amsthm +*.thm + +# beamer +*.nav +*.pre +*.snm +*.vrb + +# changes +*.soc + +# comment +*.cut + +# cprotect +*.cpt + +# elsarticle (documentclass of Elsevier journals) +*.spl + +# endnotes +*.ent + +# fixme +*.lox + +# feynmf/feynmp +*.mf +*.mp +*.t[1-9] +*.t[1-9][0-9] +*.tfm + +#(r)(e)ledmac/(r)(e)ledpar +*.end +*.?end +*.[1-9] +*.[1-9][0-9] +*.[1-9][0-9][0-9] +*.[1-9]R +*.[1-9][0-9]R +*.[1-9][0-9][0-9]R +*.eledsec[1-9] +*.eledsec[1-9]R +*.eledsec[1-9][0-9] +*.eledsec[1-9][0-9]R +*.eledsec[1-9][0-9][0-9] +*.eledsec[1-9][0-9][0-9]R + +# glossaries +*.acn +*.acr +*.glg +*.glo +*.gls +*.glsdefs +*.lzo +*.lzs +*.slg +*.slo +*.sls + +# uncomment this for glossaries-extra (will ignore makeindex's style files!) +# *.ist + +# gnuplot +*.gnuplot +*.table + +# gnuplottex +*-gnuplottex-* + +# gregoriotex +*.gaux +*.glog +*.gtex + +# htlatex +*.4ct +*.4tc +*.idv +*.lg +*.trc +*.xref + +# hyperref +*.brf + +# knitr +*-concordance.tex +# TODO Uncomment the next line if you use knitr and want to ignore its generated tikz files +# *.tikz +*-tikzDictionary + +# listings +*.lol + +# luatexja-ruby +*.ltjruby + +# makeidx +*.idx +*.ilg +*.ind + +# minitoc +*.maf +*.mlf +*.mlt +*.mtc[0-9]* +*.slf[0-9]* +*.slt[0-9]* +*.stc[0-9]* + +# minted +_minted* +*.pyg + +# morewrites +*.mw + +# newpax +*.newpax + +# nomencl +*.nlg +*.nlo +*.nls + +# pax +*.pax + +# pdfpcnotes +*.pdfpc + +# sagetex +*.sagetex.sage +*.sagetex.py +*.sagetex.scmd + +# scrwfile +*.wrt + +# svg +svg-inkscape/ + +# sympy +*.sout +*.sympy +sympy-plots-for-*.tex/ + +# pdfcomment +*.upa +*.upb + +# pythontex +*.pytxcode +pythontex-files-*/ + +# tcolorbox +*.listing + +# thmtools +*.loe + +# TikZ & PGF +*.dpth +*.md5 +*.auxlock + +# titletoc +*.ptc + +# todonotes +*.tdo + +# vhistory +*.hst +*.ver + +# easy-todo +*.lod + +# xcolor +*.xcp + +# xmpincl +*.xmpi + +# xindy +*.xdy + +# xypic precompiled matrices and outlines +*.xyc +*.xyd + +# endfloat +*.ttt +*.fff + +# Latexian +TSWLatexianTemp* + +## Editors: +# WinEdt +*.bak +*.sav + +# Texpad +.texpadtmp + +# LyX +*.lyx~ + +# Kile +*.backup + +# gummi +.*.swp + +# KBibTeX +*~[0-9]* + +# TeXnicCenter +*.tps + +# auto folder when using emacs and auctex +./auto/* +*.el + +# expex forward references with \gathertags +*-tags.tex + +# standalone packages +*.sta + +# Makeindex log files +*.lpz + +# xwatermark package +*.xwm + +# REVTeX puts footnotes in the bibliography by default, unless the nofootinbib +# option is specified. Footnotes are the stored in a file with suffix Notes.bib. +# Uncomment the next line to have this generated file ignored. +#*Notes.bib diff --git a/project_task_sheets/phase_02/project_phase02_tasks/Makefile b/project_task_sheets/phase_02/project_phase02_tasks/Makefile new file mode 100644 index 0000000..1020180 --- /dev/null +++ b/project_task_sheets/phase_02/project_phase02_tasks/Makefile @@ -0,0 +1,21 @@ +phase = 02 +version = 1 +name = MichaelChen + +solutionname = Solution_Phase$(phase)_$(name) +target = $(solutionname)_V$(version).zip +package = $(solutionname).pdf +latexmkflags = + +.PHONY : all dev + +all : $(target) + +dev : latexmkflags = -pvc +dev : all + +$(target) : $(package) + zip -FSr $(target) $(package) + +%.pdf : %.tex + latexmk -jobname="$*" $(latexmkflags) -pdf $< diff --git a/project_task_sheets/phase_02/project_phase02_tasks/Solution_Phase02_MichaelChen.tex b/project_task_sheets/phase_02/project_phase02_tasks/Solution_Phase02_MichaelChen.tex new file mode 100644 index 0000000..d2ce2ab --- /dev/null +++ b/project_task_sheets/phase_02/project_phase02_tasks/Solution_Phase02_MichaelChen.tex @@ -0,0 +1,212 @@ +\documentclass[a4paper]{scrreprt} +\usepackage[left=4cm,bottom=3cm,top=3cm,right=4cm,nohead,nofoot]{geometry} +\usepackage{graphicx} +\usepackage{tabularx} +\usepackage{listings} +\usepackage{enumitem} +\usepackage{subcaption} + +\usepackage{pgf} +\usepackage{tikz} +\usetikzlibrary{arrows,automata} + +\usepackage{xparse} +\usepackage{multirow} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\setlength{\textfloatsep}{16pt} + +\renewcommand{\labelenumi}{\alph{enumi})} +\renewcommand{\labelenumii}{\arabic{enumii}) } + +\newcommand{\baseinfo}[5]{ + \begin{center} + \begin{tabular}{p{15cm}r} + \vspace{-4.5pt}{ \Large \bfseries #1} & \multirow{2}{*}{} \\[0.4cm] + #2 & \\[0.5cm] + \end{tabular} + \end{center} + \vspace{-18pt}\hrule\vspace{6pt} + \begin{tabular}{ll} + \textbf{Name:} & #4\\ + \textbf{Group:} & #5\\ + \end{tabular} + \vspace{4pt}\hrule\vspace{2pt} + \footnotesize \textbf{Software Testing} \hfil - \hfil Summer 2022 \hfil - \hfil #3 \hfil - \hfil Sibylle Schupp / Sascha Lehmann \hfil \\ +} + +\newcounter{question} +\NewDocumentEnvironment{question}{m o}{% + \addtocounter{question}{1}% + \paragraph{\textcolor{red}{Task~\arabic{question}} - #1\hfill\IfNoValueTF{#2}{}{[#2 P]}} + \leavevmode\\% +}{% + \vskip 1em% +} + +\NewDocumentEnvironment{answer}{}{% + \vspace{6pt} + \leavevmode\\ + \textit{Answer:}\\[-0.25cm] + {\color{red}\rule{\textwidth}{0.4mm}} +}{% + \leavevmode\\ + {\color{red}\rule{\textwidth}{0.4mm}} +} + +\newcommand{\projectinfo}[5]{ + \baseinfo{Project Phase #1 - Submission Sheet}{#2}{#3}{#4}{#5} +} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\def\name{[Add name here]} +\def\group{[Add group here]} + +\begin{document} +\projectinfo{2}{Software Testing - Input Space Partitioning\small}{\today}{\name}{\group} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%% Task 1 %%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\begin{question}{Answer basic questions on ISP-Testing}[3] +\begin{enumerate}[topsep=0pt, leftmargin=*] + \item Define the following terms - related to ISP - in your own words: + \begin{enumerate} + \item Input Domain + \begin{answer} + [TODO: Add answer here] + \end{answer} + + \item Domain Partition (include the two criteria a partitions needs to fulfill) + \begin{answer} + [TODO: Add answer here] + \end{answer} + + \item Characteristics + \begin{answer} + [TODO: Add answer here] + \end{answer} + + \item Equivalence Class + \begin{answer} + [TODO: Add answer here] + \end{answer} + + \end{enumerate} + + \item Which testing situations are suitable for the ISP approach? + \begin{answer} + [TODO: Add answer here] + \end{answer} + + \item Name and briefly explain the two main strategies to model the input domain. What are their significant pros and cons? + \begin{answer} + [TODO: Add answer here] + \end{answer} + + \item Using the standard values that may be provided in the specifications is one way to select the actual test values from each partition block. Which other strategies can you consider to derive representative values from a given partition? Name and describe two of them. + \begin{answer} + [TODO: Add answer here] + \end{answer} + +\end{enumerate} +\end{question} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%% Task 2 %%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\begin{question}{Apply ISP-Testing to a sample component}[5] +\begin{enumerate}[topsep=0pt, leftmargin=*] + \item Gather the results of the following sub-tasks as table: + \begin{enumerate} + \item The distinction between the minimum, maximum and remaining \texttt{int} values is a possible interface-based partition for the input parameters \textit{a} and \textit{b}. Come up with another interface-based characteristic and the corresponding partition. + \item The distinction between valid and invalid divisions / modulo operations is a possible functionality-based partition for the input parameters \textit{a} and \textit{b}. Come up with another functionality-based characteristic and the corresponding partition. + \end{enumerate} + \begin{answer} + [TODO: Add answer here] + \end{answer} + + \item Can you identify any non-valid combinations of blocks from your characteristics? Develop the required constraints that prevent these combinations. + \begin{answer} + [TODO: Add answer here] + \end{answer} + + \item Derive one representative value for each of the blocks of the exemplary and your own characteristics. Which approach did you choose to select the values? + \begin{answer} + [TODO: Add answer here] + \end{answer} + + \item Read the \texttt{acts\_user\_guide} to get a basic understanding of how to create a system for ACTS and how to generate test vector sets of this system. + \begin{answer} + [TODO: Add answer here] + \end{answer} + + \item Create a system named \textit{Phase02\_Task2\_ACTS\_System.txt} based on your characteristics and their representative block values. You can use the \texttt{Enum} type with meaningful names for any characteristics not representable as \texttt{Boolean}, \texttt{Number} or \texttt{Range}. Use ACTS in command line mode to generate the set of test vectors without constraints. + \begin{answer} + [TODO: Add answer here] + \end{answer} + + \item In the \texttt{Constraint} section of your system file, add the constraints you identified for valid combinations of blocks, and generate a new set of test vectors. Compare the number of test vectors of the unconstrained and constrained system. Check if the new set of test vectors still contains non-valid combinations, and adapt your constraints if necessary. + \begin{answer} + [TODO: Add answer here] + \end{answer} + +\end{enumerate} +\end{question} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%% Task 3 %%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\begin{question}{Apply ISP-Testing to your software project}[8] +\begin{enumerate}[topsep=0pt, leftmargin=*] + \item Explain why the selected method is suitable for the input domain model approach (1-2 sentences) + \begin{answer} + [TODO: Add answer here] + \end{answer} + + \item Identify the input domain of your method (2-3 sentences) + \begin{answer} + [TODO: Add answer here] + \end{answer} + + \item Similar to task 2, gather the results of the following sub-tasks as shown in Table~\ref{table:example}: + \begin{enumerate} + \item Identify reasonable characteristics of the possible input data + \item Derive sets of equivalence classes from these characteristics (Note: At least one of your partitions must consist of a number of blocks $\geq 3$. Also make sure that you have enough characteristics and corresponding blocks to derive $12$ distinct tests from them later on.) + \end{enumerate} + \begin{answer} + [TODO: Add answer here] + \end{answer} + + \item Can you identify any non-valid combinations of blocks from your characteristics? (1-2 sentences) + \begin{answer} + [TODO: Add answer here] + \end{answer} + + \item Derive (at least) one representative value for each equivalence class. Which strategy did you use for the value selection? + \begin{answer} + [TODO: Add answer here] + \end{answer} + + \item Combine the selected values from the partitions of each input argument to complete test vectors. You can decide whether you want to approach this sub-task manually or using \textit{ACTS} (therefore, only the resulting vectors should be documented). + \begin{answer} + [TODO: Add answer here] + \end{answer} + + \item Create JUnit tests for your method, which trigger test runs with the selected test vectors, and assert each individual output. For the submission, merge all these tests into one \texttt{*.java} file. + \begin{answer} + [TODO: Add answer here] + + \begin{lstlisting}[language=Java,belowskip=-0.8\baselineskip] +/* Add code here */ + \end{lstlisting} + \end{answer} + +\end{enumerate} +\end{question} + +\end{document} From e9dec446af324b7d81d07bc0059b53365a66c159 Mon Sep 17 00:00:00 2001 From: Michael Chen Date: Wed, 4 May 2022 19:17:14 +0200 Subject: [PATCH 2/5] Finish first task --- .../Solution_Phase02_MichaelChen.tex | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/project_task_sheets/phase_02/project_phase02_tasks/Solution_Phase02_MichaelChen.tex b/project_task_sheets/phase_02/project_phase02_tasks/Solution_Phase02_MichaelChen.tex index d2ce2ab..d61050c 100644 --- a/project_task_sheets/phase_02/project_phase02_tasks/Solution_Phase02_MichaelChen.tex +++ b/project_task_sheets/phase_02/project_phase02_tasks/Solution_Phase02_MichaelChen.tex @@ -63,8 +63,8 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\def\name{[Add name here]} -\def\group{[Add group here]} +\def\name{Michael Chen} +\def\group{Group 01 (fastjson)} \begin{document} \projectinfo{2}{Software Testing - Input Space Partitioning\small}{\today}{\name}{\group} @@ -78,22 +78,26 @@ \begin{enumerate} \item Input Domain \begin{answer} - [TODO: Add answer here] + The input domain is a set that contains all possible sets of input values a program accepts. For instance a function \texttt{int test(bool x, int y)} has the input domain: + \begin{equation} + \left\{ \left\{\texttt{true},0\right\}, \left\{\texttt{false},0\right\}, \left\{\texttt{true},1\right\}, \left\{\texttt{false},1\right\}, \left\{\texttt{true},-1\right\}, \left\{\texttt{false},-1\right\}, \dots \right\} + \end{equation} + Note however, that the input values to a function, especially in low-level programming also includes side-effects such as object state, global variables, persistent data, user input, and many others inherited from the environment. This makes pure functions or lambda functions with explicit captures easier to model. \end{answer} \item Domain Partition (include the two criteria a partitions needs to fulfill) \begin{answer} - [TODO: Add answer here] + A domain partition divides the domain in blocks that are pairwise distinct, meaning every element in the domain is contained by at most one of the blocks (\textit{disjointness}), and the union of those blocks is equivalent to the entire domain, meaning every element in the domain is contained by at least one of the blocks (\textit{completeness}). It follows that every element in the domain is contained by one and only one block in the partition. \end{answer} \item Characteristics \begin{answer} - [TODO: Add answer here] + A characteristic is a property of a domain that can be used to generate a corresponding partition that might be useful for testing. Characteristics usually capture interesting values or relations between different input values. \end{answer} \item Equivalence Class \begin{answer} - [TODO: Add answer here] + An equivalence class is set of values of a domain that are equivalent to another given an application specific equivalence relation, i.e. and area equivalence relation would create a set of equivalence classes of arbitrary shapes that have the same area. Using an equivalence relation corresponding to a well formed characteristic you can partition a domain. \end{answer} \end{enumerate} From 5a4e12e7bd86127be365c3b81d29b0d72fc8eca0 Mon Sep 17 00:00:00 2001 From: Michael Chen Date: Wed, 4 May 2022 19:56:23 +0200 Subject: [PATCH 3/5] Finish task 1 --- .../Solution_Phase02_MichaelChen.tex | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/project_task_sheets/phase_02/project_phase02_tasks/Solution_Phase02_MichaelChen.tex b/project_task_sheets/phase_02/project_phase02_tasks/Solution_Phase02_MichaelChen.tex index d61050c..83a9fc0 100644 --- a/project_task_sheets/phase_02/project_phase02_tasks/Solution_Phase02_MichaelChen.tex +++ b/project_task_sheets/phase_02/project_phase02_tasks/Solution_Phase02_MichaelChen.tex @@ -104,17 +104,21 @@ \item Which testing situations are suitable for the ISP approach? \begin{answer} - [TODO: Add answer here] + ISP is suitable for complex functions that require extensive testing but it is infeasible to test even large parts of the entire input domain. In such scenarios ISP is a tool that can be used to systematically apply input selection from different functionally categories of inputs. Instead of blindly picking inputs ISP can help picking specific values that ideally trigger every possible scenario of errors and additionally it helps you to realize when enough tests were executed because the partitions are complete (of course the characteristics for partitioning have to be ideally complete). \end{answer} \item Name and briefly explain the two main strategies to model the input domain. What are their significant pros and cons? \begin{answer} - [TODO: Add answer here] + \textbf{Interface-Based:} We extract characteristics from the input parameters without knowledge about the relation between input parameters. This allows for a rather easy and automatable identification of characteristics, however it does not incorporate any knowledge of the semantics of the test subject and might thus miss important cases where the functionality is dependent on the input combination. + + \textbf{Functionality-Based:} Here we create characteristics from the behaviour of the program or the output values. This approach requires domain knowledge as well as knowledge of the semantics of the program which makes it reasonably harder to develop characteristics. Sometimes program specifications directly correspond to possible characteristics by specifying the wanted behaviour of programs which \textit{can} sometimes make it easy model the input domain and even develop the IDM in the earlier development stages because specifications are made before the program is implemented. This method is harder to automate because it requires domain knowledge, but it might yield more effective tests for the same reason (No-free-lunch theorem). \end{answer} \item Using the standard values that may be provided in the specifications is one way to select the actual test values from each partition block. Which other strategies can you consider to derive representative values from a given partition? Name and describe two of them. \begin{answer} - [TODO: Add answer here] + \textbf{Pair-wise:} With this strategy we have to select input values from each block and combine them with values from all other blocks. This ensures that most combinations of blocks are covered without having to test the absolute powerset of text values. + + \textbf{Base-choice:} This method again incorporates domain knowledge to select a base block from each characteristic. The base test is then performed using choices form all base blocks for each characteristic and then performing tests for the other characteristics keeping a base block constant and modifying only the other blocks. This massively decreases the amount of test cases while increasing the selection effort (No-free-lunch theorem, similar to functionality-based IDM). \end{answer} \end{enumerate} From 0cebf35e25e044d796d7892b0026195d1375bdd5 Mon Sep 17 00:00:00 2001 From: Michael Chen Date: Wed, 4 May 2022 21:48:33 +0200 Subject: [PATCH 4/5] Finished task 2 --- .../phase_02/project_phase02_tasks/.gitignore | 2 + .../phase_02/project_phase02_tasks/Makefile | 6 ++- .../Phase02_Task2_ACTS_System.txt | 27 +++++++++++ .../Solution_Phase02_MichaelChen.tex | 45 ++++++++++++++++--- 4 files changed, 73 insertions(+), 7 deletions(-) create mode 100644 project_task_sheets/phase_02/project_phase02_tasks/Phase02_Task2_ACTS_System.txt diff --git a/project_task_sheets/phase_02/project_phase02_tasks/.gitignore b/project_task_sheets/phase_02/project_phase02_tasks/.gitignore index 44482bd..afdad5a 100644 --- a/project_task_sheets/phase_02/project_phase02_tasks/.gitignore +++ b/project_task_sheets/phase_02/project_phase02_tasks/.gitignore @@ -1,5 +1,7 @@ Solution_Phase*_*.pdf Solution_Phase*_*.zip +*.result.txt +output.txt ## Core latex/pdflatex auxiliary files: *.aux diff --git a/project_task_sheets/phase_02/project_phase02_tasks/Makefile b/project_task_sheets/phase_02/project_phase02_tasks/Makefile index 1020180..dedf8dc 100644 --- a/project_task_sheets/phase_02/project_phase02_tasks/Makefile +++ b/project_task_sheets/phase_02/project_phase02_tasks/Makefile @@ -4,8 +4,9 @@ name = MichaelChen solutionname = Solution_Phase$(phase)_$(name) target = $(solutionname)_V$(version).zip -package = $(solutionname).pdf +package = $(solutionname).pdf Phase02_Task2_ACTS_System.txt Phase02_Task2_ACTS_System.result.txt latexmkflags = +actspath = "C:\\Program Files (x86)\\ACTS\\acts_3.2.jar" .PHONY : all dev @@ -19,3 +20,6 @@ $(target) : $(package) %.pdf : %.tex latexmk -jobname="$*" $(latexmkflags) -pdf $< + +%_System.result.txt : %_System.txt + java -Xmx8192M -jar $(actspath) $< $@ diff --git a/project_task_sheets/phase_02/project_phase02_tasks/Phase02_Task2_ACTS_System.txt b/project_task_sheets/phase_02/project_phase02_tasks/Phase02_Task2_ACTS_System.txt new file mode 100644 index 0000000..1aa2f3f --- /dev/null +++ b/project_task_sheets/phase_02/project_phase02_tasks/Phase02_Task2_ACTS_System.txt @@ -0,0 +1,27 @@ +[System] +Name: IsDivisible + +[Parameter] +A_VAL (enum) : [NORMAL], MINIMUM, MAXIMUM +B_VAL (enum) : [NORMAL], MINIMUM, MAXIMUM +A_SIGNED (enum) : POSITIVE, NEGATIVE, ZERO +B_SIGNED (enum) : POSITIVE, NEGATIVE, ZERO +DIVISABLE (bool) : TRUE, FALSE +a (int) : 0, 1, -1, 4, 5, 20, 21, 21474836, -21474836 +b (int) : 1, -1, 4, 5, 20, 21, 21474836, -21474836 ; 0 + +[Constraint] +A_VAL = "MINIMUM" => a = -21474836 +A_VAL = "MAXIMUM" => a = 21474836 +B_VAL = "MINIMUM" => b = -21474836 +B_VAL = "MAXIMUM" => b = 21474836 + +A_SIGNED = "POSITIVE" => a > 0 +A_SIGNED = "NEGATIVE" => a < 0 +A_SIGNED = "ZERO" => a = 0 +B_SIGNED = "POSITIVE" => b > 0 +B_SIGNED = "NEGATIVE" => b < 0 +B_SIGNED = "ZERO" => b = 0 + +(DIVISABLE = true) => a % b = 0 +(DIVISABLE = false) => a % b != 0 diff --git a/project_task_sheets/phase_02/project_phase02_tasks/Solution_Phase02_MichaelChen.tex b/project_task_sheets/phase_02/project_phase02_tasks/Solution_Phase02_MichaelChen.tex index 83a9fc0..41bb71e 100644 --- a/project_task_sheets/phase_02/project_phase02_tasks/Solution_Phase02_MichaelChen.tex +++ b/project_task_sheets/phase_02/project_phase02_tasks/Solution_Phase02_MichaelChen.tex @@ -5,6 +5,9 @@ \usepackage{listings} \usepackage{enumitem} \usepackage{subcaption} +\usepackage{amsmath} +\usepackage{float} +\usepackage{hyperref} \usepackage{pgf} \usepackage{tikz} @@ -135,32 +138,62 @@ \item The distinction between valid and invalid divisions / modulo operations is a possible functionality-based partition for the input parameters \textit{a} and \textit{b}. Come up with another functionality-based characteristic and the corresponding partition. \end{enumerate} \begin{answer} - [TODO: Add answer here] + See table~\ref{tab:characteristics}. + \begin{table} + \centering + \begin{tabular}{llll} + \hline + Characteristic & Eq-Class 1 & Eq-Class 2 & Eq-Class 3 \\ + \hline + $q_1 = \text{"\texttt{int} values"}$ & $\{a,b=\texttt{int.Max}\}$ & $\{a,b=\texttt{int.Min}\}$ & remaining \\ + $q_2 = \text{"signedness"}$ & $\{a,b>0\}$ & $\{a,b<0\}$ & $\{a,b=0\}$ \\ + $q_3 = \text{"valid \texttt{mod}"}$ & $\{b\neq{}0\}$ & $\{b=0\}$ \\ + $q_4 = \text{"divisor"}$ & $\{(a \mod b) = 0\}$ & $\{(a \mod b) \neq 0\}$ \\ + \hline + \end{tabular} + \caption{Equivalence classes for different characteristics} + \label{tab:characteristics} + \end{table} \end{answer} \item Can you identify any non-valid combinations of blocks from your characteristics? Develop the required constraints that prevent these combinations. \begin{answer} - [TODO: Add answer here] + A simple invalid block combination is the valid modulo operation in combination with the signedness of $b$. We can mitigate that by disallowing $b$ to be zero. Also, when $a$ or $b$ is fixed at the maximum or minimum integer value we cannot combine this with all $q_4$ blocks. \end{answer} \item Derive one representative value for each of the blocks of the exemplary and your own characteristics. Which approach did you choose to select the values? \begin{answer} - [TODO: Add answer here] + See table~\ref{tab:testvalues}. + \begin{table} + \centering + \begin{tabular}{llll} + \hline + Characteristic & Val-Class 1 & Val-Class 2 & Val-Class 3 \\ + \hline + $q_1 = \text{"\texttt{int} values"}$ & $(\texttt{int.Max},b)$ & $(\texttt{int.Min},b)$ & $(1,b)$ \\ + $q_2 = \text{"signedness"}$ & $(1,b)$ & $(-1,b)$ & $(0,b)$ \\ + $q_3 = \text{"valid \texttt{mod}"}$ & $(5,1)$ & $(5,0)$ \\ + $q_4 = \text{"divisor"}$ & $(20,5)$ & $(21,5)$ \\ + \hline + \end{tabular} + \caption{Examplary test values for different characteristics} + \label{tab:testvalues} + \end{table} \end{answer} \item Read the \texttt{acts\_user\_guide} to get a basic understanding of how to create a system for ACTS and how to generate test vector sets of this system. \begin{answer} - [TODO: Add answer here] + See \texttt{Phase02\_Task2\_ACTS\_System.txt} file. \end{answer} \item Create a system named \textit{Phase02\_Task2\_ACTS\_System.txt} based on your characteristics and their representative block values. You can use the \texttt{Enum} type with meaningful names for any characteristics not representable as \texttt{Boolean}, \texttt{Number} or \texttt{Range}. Use ACTS in command line mode to generate the set of test vectors without constraints. \begin{answer} - [TODO: Add answer here] + ACTS generated $81$ tests covering $411$ tuples in $0.6$ seconds. \end{answer} \item In the \texttt{Constraint} section of your system file, add the constraints you identified for valid combinations of blocks, and generate a new set of test vectors. Compare the number of test vectors of the unconstrained and constrained system. Check if the new set of test vectors still contains non-valid combinations, and adapt your constraints if necessary. \begin{answer} - [TODO: Add answer here] + Now ACTS generated $83$ tests covering $312$ tuples in $12.9$ seconds and due to the constraints more than $50$ tuples were forbidden. \end{answer} \end{enumerate} From fa3c062d2decd4b67b8d6461a70451450d0cd3ef Mon Sep 17 00:00:00 2001 From: Michael Chen Date: Wed, 4 May 2022 23:56:21 +0200 Subject: [PATCH 5/5] Phase 02 Submission V1 --- .../JSONScannerTest.java | 131 ++++++++++++++++++ .../phase_02/project_phase02_tasks/Makefile | 2 +- .../Solution_Phase02_MichaelChen.tex | 49 +++++-- 3 files changed, 170 insertions(+), 12 deletions(-) create mode 100644 project_task_sheets/phase_02/project_phase02_tasks/JSONScannerTest.java diff --git a/project_task_sheets/phase_02/project_phase02_tasks/JSONScannerTest.java b/project_task_sheets/phase_02/project_phase02_tasks/JSONScannerTest.java new file mode 100644 index 0000000..872e982 --- /dev/null +++ b/project_task_sheets/phase_02/project_phase02_tasks/JSONScannerTest.java @@ -0,0 +1,131 @@ +package com.alibaba.fastjson.parser; + +import com.alibaba.fastjson.JSONException; +import org.junit.Assert; +import org.junit.Test; + + +public class JSONScannerTest { + @Test + public void inputTokenTest_Comma() throws Throwable { + JSONScanner scanner = new JSONScanner(","); + scanner.nextToken(); + Assert.assertEquals(JSONToken.COMMA, scanner.token()); + } + + @Test + public void inputTokenTest_String() throws Throwable { + JSONScanner scanner = new JSONScanner("\"text\""); + scanner.nextToken(); + Assert.assertEquals(JSONToken.LITERAL_STRING, scanner.token()); + Assert.assertEquals("text", scanner.stringVal()); + } + + @Test + public void inputTokenTest_Integer() throws Throwable { + JSONScanner scanner = new JSONScanner("-352"); + scanner.nextToken(); + Assert.assertEquals(JSONToken.LITERAL_INT, scanner.token()); + Assert.assertEquals(-352, scanner.intValue()); + } + + @Test + public void inputTokenTest_True() throws Throwable { + JSONScanner scanner = new JSONScanner("true"); + scanner.nextToken(); + Assert.assertEquals(JSONToken.TRUE, scanner.token()); + } + + @Test + public void inputTokenTest_False() throws Throwable { + JSONScanner scanner = new JSONScanner("false"); + scanner.nextToken(); + Assert.assertEquals(JSONToken.FALSE, scanner.token()); + } + + @Test + public void inputTokenTest_Float() throws Throwable { + JSONScanner scanner = new JSONScanner("2.5e2"); + scanner.nextToken(); + Assert.assertEquals(JSONToken.LITERAL_FLOAT, scanner.token()); + } + + @Test + public void inputTokenTest_Null() throws Throwable { + JSONScanner scanner = new JSONScanner("null"); + scanner.nextToken(); + Assert.assertEquals(JSONToken.NULL, scanner.token()); + } + + @Test + public void scannerSequenceTest() throws Throwable { + JSONScanner scanner = new JSONScanner("5,:"); + scanner.nextToken(); + Assert.assertEquals(JSONToken.LITERAL_INT, scanner.token()); + Assert.assertEquals(5, scanner.intValue()); + + scanner.nextToken(); + Assert.assertEquals(JSONToken.COMMA, scanner.token()); + + scanner.nextToken(); + Assert.assertEquals(JSONToken.COLON, scanner.token()); + } + + @Test + public void scannerPositionTest() throws Throwable { + JSONScanner scanner = new JSONScanner("5,:"); + scanner.nextToken(); + Assert.assertEquals(0, scanner.pos()); + + scanner.nextToken(); + Assert.assertEquals(1, scanner.pos()); + + scanner.nextToken(); + Assert.assertEquals(2, scanner.pos()); + } + + @Test + public void scannerEofTest() throws Throwable { + JSONScanner scanner = new JSONScanner("5,:"); + scanner.nextToken(); + scanner.nextToken(); + scanner.nextToken(); // colon + // scanner should now enter EOF + scanner.nextToken(); + + Assert.assertTrue(scanner.isEOF()); + Assert.assertEquals(JSONToken.EOF, scanner.token()); + } + + @Test(expected=JSONException.class) + public void scannerInputFormatTest_Invalid() throws Throwable { + JSONScanner scanner = new JSONScanner("53fds"); // invalid literal value + scanner.nextToken(); // consumes numeric token + scanner.nextToken(); // should raise invalid literal + } + + @Test() + public void complexExampleTest() throws Throwable { + JSONScanner scanner = new JSONScanner("{\"Name\":\"Michael\",\"Last\":\"Chen\"}"); + scanner.nextToken(); + Assert.assertEquals(JSONToken.LBRACE, scanner.token()); + scanner.nextToken(); + Assert.assertEquals(JSONToken.LITERAL_STRING, scanner.token()); + scanner.nextToken(); + Assert.assertEquals(JSONToken.COLON, scanner.token()); + scanner.nextToken(); + Assert.assertEquals(JSONToken.LITERAL_STRING, scanner.token()); + scanner.nextToken(); + Assert.assertEquals(JSONToken.COMMA, scanner.token()); + scanner.nextToken(); + Assert.assertEquals(JSONToken.LITERAL_STRING, scanner.token()); + scanner.nextToken(); + Assert.assertEquals(JSONToken.COLON, scanner.token()); + scanner.nextToken(); + Assert.assertEquals(JSONToken.LITERAL_STRING, scanner.token()); + scanner.nextToken(); + Assert.assertEquals(JSONToken.RBRACE, scanner.token()); + scanner.nextToken(); + Assert.assertEquals(JSONToken.EOF, scanner.token()); + } +} diff --git a/project_task_sheets/phase_02/project_phase02_tasks/Makefile b/project_task_sheets/phase_02/project_phase02_tasks/Makefile index dedf8dc..8f2f694 100644 --- a/project_task_sheets/phase_02/project_phase02_tasks/Makefile +++ b/project_task_sheets/phase_02/project_phase02_tasks/Makefile @@ -4,7 +4,7 @@ name = MichaelChen solutionname = Solution_Phase$(phase)_$(name) target = $(solutionname)_V$(version).zip -package = $(solutionname).pdf Phase02_Task2_ACTS_System.txt Phase02_Task2_ACTS_System.result.txt +package = $(solutionname).pdf Phase02_Task2_ACTS_System.txt Phase02_Task2_ACTS_System.result.txt JSONScannerTest.java latexmkflags = actspath = "C:\\Program Files (x86)\\ACTS\\acts_3.2.jar" diff --git a/project_task_sheets/phase_02/project_phase02_tasks/Solution_Phase02_MichaelChen.tex b/project_task_sheets/phase_02/project_phase02_tasks/Solution_Phase02_MichaelChen.tex index 41bb71e..7b14286 100644 --- a/project_task_sheets/phase_02/project_phase02_tasks/Solution_Phase02_MichaelChen.tex +++ b/project_task_sheets/phase_02/project_phase02_tasks/Solution_Phase02_MichaelChen.tex @@ -7,6 +7,7 @@ \usepackage{subcaption} \usepackage{amsmath} \usepackage{float} +\usepackage{fancyvrb} % for "\Verb" macro \usepackage{hyperref} \usepackage{pgf} @@ -206,12 +207,12 @@ \begin{enumerate}[topsep=0pt, leftmargin=*] \item Explain why the selected method is suitable for the input domain model approach (1-2 sentences) \begin{answer} - [TODO: Add answer here] + I chose the \texttt{JSONScanner.token()} function as a test subject. This method is particularly interesting because it is does not have any direct function parameters but rather solely depends on the state of an object as an input parameter. This does not make the method particularly suitable for the IDM approach, but it is still important to test this method extensively because the entire project is based on this. \end{answer} \item Identify the input domain of your method (2-3 sentences) \begin{answer} - [TODO: Add answer here] + The \texttt{JSONScanner} is quite a complex object and not all of the fields are of interest for this specific method so I will only name input parameters that are relevant for this test subject. Most significantly the text field of the scanner is of importance because it provides the scanner with the raw character data it has to tokenize (called $t$). Next the current token position and the token end position are important to keep track of the current state of the lexer. Finally the input text length is of importance as a boundary to the position parameters. This also influences the EOF state of the object, which signals if the input buffer is exhausted. \end{answer} \item Similar to task 2, gather the results of the following sub-tasks as shown in Table~\ref{table:example}: @@ -220,31 +221,57 @@ \item Derive sets of equivalence classes from these characteristics (Note: At least one of your partitions must consist of a number of blocks $\geq 3$. Also make sure that you have enough characteristics and corresponding blocks to derive $12$ distinct tests from them later on.) \end{enumerate} \begin{answer} - [TODO: Add answer here] + See table~\ref{tab:scannercharacteristics}. Note: the predicates valid and invalid on $t$ correspond to the input containing a well-formed sequence of tokens or not, respectively. + \begin{table} + \centering + \begin{tabular}{llll} + \hline + Characteristic & Eq-Class 1 & Eq-Class 2 & Eq-Class 3 \\ + \hline + $q_1 = \text{"input token"}$ & others & \multicolumn{2}{c}{$\forall T : \{ t = "T" \}$} \\ + $q_2 = \text{"position"}$ & $\{0<\text{pos}<\text{len}-1\}$ & $\{\text{pos}=0\}$ & $\{\text{pos}=\text{len}-1\}$ \\ + $q_3 = \text{"EOF state"}$ & $\{\text{eof} = \texttt{true}\}$ & $\{\text{eof} = \texttt{false}\}$ \\ + $q_4 = \text{"input format"}$ & $\{t\text{ is valid}\}$ & $\{t\text{ is invalid}\}$ \\ + \hline + \end{tabular} + \caption{Characteristics for the \texttt{JSONScanner.token()} function} + \label{tab:scannercharacteristics} + \end{table} \end{answer} \item Can you identify any non-valid combinations of blocks from your characteristics? (1-2 sentences) \begin{answer} - [TODO: Add answer here] + Because the EOF flag and the position are tightly coupled. If a token at the current position consumes the rest of the input buffer the object will signal an EOF soon. Another invalid combination is between characteristics $q_1$ and $q_4$, because trivially every input token as a string is also a well-formed trivial sequence of tokens, this the second class of $q_4$ is not achievable with any of the token strings. \end{answer} \item Derive (at least) one representative value for each equivalence class. Which strategy did you use for the value selection? \begin{answer} - [TODO: Add answer here] + See table~\ref{tab:scannervalues}. + \begin{table} + \centering + \begin{tabular}{llll} + \hline + Characteristic & Val-Class 1 & Val-Class 2 & Val-Class 3 \\ + \hline + $q_1 = \text{"input token"}$ & \texttt{"5,:"} & \multicolumn{2}{c}{\texttt{""text""}, \texttt{"5"}, \texttt{":"}, $\dots$} \\ + $q_2 = \text{"position"}$ & $1$ & $0$ & $\text{len}-1$ \\ + $q_3 = \text{"EOF state"}$ & \texttt{true} & \texttt{false} \\ + $q_4 = \text{"input format"}$ & \multicolumn{2}{c}{\Verb+"\{"Name":"Michael","Last":"Chen"\}"+} & \texttt{"53fds"} \\ + \hline + \end{tabular} + \caption{Characteristics for the \texttt{JSONScanner.token()} function} + \label{tab:scannervalues} + \end{table} \end{answer} \item Combine the selected values from the partitions of each input argument to complete test vectors. You can decide whether you want to approach this sub-task manually or using \textit{ACTS} (therefore, only the resulting vectors should be documented). \begin{answer} - [TODO: Add answer here] + See test suite in file \texttt{JSONScannerTest.java}. \end{answer} \item Create JUnit tests for your method, which trigger test runs with the selected test vectors, and assert each individual output. For the submission, merge all these tests into one \texttt{*.java} file. \begin{answer} - [TODO: Add answer here] - - \begin{lstlisting}[language=Java,belowskip=-0.8\baselineskip] -/* Add code here */ - \end{lstlisting} + See test suite in file \texttt{JSONScannerTest.java}. \end{answer} \end{enumerate}