== **Спецификација за тестирање на SelfEvaluation модулот – дел од Integrated Student Information System** ---- Според официјалната документација на OpenXava, платформата која се користи за градење на овој модул, тестирањето на кодот кој е генериран од страна на OpenXava се тестира со JUnit (во позадина OpenXava всушност користи HtmlUnit). Со тоа што прави екстензија на JUnit и користи HtmlUnit, се овозможува автоматизирано тестирање на функционалноста на модулот со тоа што се симулира активностите што би ги правел корисник со помош на веб пребарувач. При пишувањето на кодот за тестирање ја употребувам ModuleTestBase класата која ги автоматизира акциите кои се преземаат врз пребарувач на SelfEvaluation модулот. Со оглед на тоа што е напишана од тимот кој ја создал и одржува OpenXava платформата, неслучајно при изработка на автоматизираното тестирање искористена е и земени се за репер примерите од делот за автоматизирано тестирање од официјалната документација која може да се најде на линкот: http://www.openxava.org/OpenXavaDoc/docs/testing_en.html#Lesson%203:%20Automated%20testing-Testing%20collections. Со оглед на тоа што работната околина во која е изработен SelfEvaluation модулот е Eclipse Oxygen 4.7.2, со цел да се воведе континуирано тестирање, односно извршување на тест класите при секое зачувување (и билдање кое следува автоматски), се користи InfiniTest плагинот за Eclipse. InfiniTest ги детектира промените во кодот и при зачувување (со автоматско билдање) ги извршува соодветните (“засегнатите”) тестови и во конзола ги изпишува соодветните резултати, додека на долната лента се прикажува боја, црвена или зелена, зависно од резултатите на тестовите. InfiniTest плагинот може да се најде на следниот линк: http://infinitest.github.io. Опфатот на тест случаите и тест активностите во рамки на автоматизираниот дел за тестирање, кои се опишани детално во оваа спецификација, се функционалностите кои се наложени и детализирано објаснети во корисничките сценарија – “Создавање на обична анкета” и “Активирање на анкета” и нивните соодветни UML дијаграми, во прилог на овој документ. ---- == ''Опис на тестови за создавање на обична анкета'' ---- Сите тестови кои служат за проверка на соодветната работа на функционалноста за создавање на обична анкета се наоѓаат во класата AnketaTest. Тестовите се дефинирани така што се прави проверка на нормалното извршување на овој дел од модулот кога се креира валидна анкета и кога се креира невалидна анкета (соодветно за секоја невалидност). Со цел подобра структурираност на кодот, се користат помошни методи кои исто така се дефинирани во оваа класа и во прилог се објаснети заедно со тестовите. - Конструктор super(nameTest, "SelfEvaluation", "Anketa") се наведува името на OpenXava проектот и името на соодветната класа (module – според OpenXava терминологија). - Помошни методи **save()** – Овој метод е од тип void и ја симулира корисничката акција преку пребарувач кога анкетарот ќе кликне Save. Тоа се прави со методот execute("MyTypical.save") и потоа се проверува дали има грешки при зачувувањето со методот assertNoErrors(). **addBasicProperties()** – Овој метод ги користи готовите методи setValue("naziv", "JUnit Test Anketa") – додава назив на анкетата, setValue("opis", "Anketa za testiranje so JUnit") – додава опис на анкетата. Методот setValue() e метод кој додава вредности во полиња исто како анкетарот што би ги внел преку пребарувач. Тест податоците во случајов за назив е "JUnit Test Anketa" и за опис "Anketa za testiranje so JUnit". Овие вредности ги додавам во полињата преку повикување на методот addBasicProperties() со цел доколку треба да се променат во иднина, тоа да се направи само на едно место. **choosePerson()** – Овој метод додава personId на анкетар на соодветната анкета. Повеќе од јасно е дека ова треба да се прави “во позадина” така што би се нашол анкетарот кој се автентифицирал и би се зело неговото personId без да се избира сам од листата, меѓутоа бидејќи автентикацијата не е предмет на разработка, се додава рачно. Полето за избирање на анкетар е опаѓачка листа, од која се бира соодветното презиме, а тоа во тестот се прави со методот setValue("person.personId", "2"). Облигаторно е да се има запис во базата на податоци која се користи лице во табелата Person со personId 2, соодветното презиме во записот во база е “Dzalev”. Може и да се промени personId, зависно од потребите. Активноста е иста како анкетарот преку пребарувач да ја кликнал опаѓачката листа и да го избрал лицето со презиме “Dzalev” кое во позадина има personId 2. **chooseSubject()** - Овој метод додава subjectId на соодветната анкета. Полето за избирање на предмет е опаѓачка листа, од која се бира соодветниот назив на предмет, а тоа во тестот се прави со методот setValue("subject.subjectId", "9"). Облигаторно е да се има запис во базата на податоци која се користи во табелата Subject со subjectId 9, соодветниот назив во записот во база е “Razvojni procesi na IS”. Може и да се промени subjectId, зависно од потребите. Активноста е иста како анкетарот преку пребарувач да ја кликнал опаѓачката листа и да го избрал предметот со назив “Razvojni procesi na IS”, кој во позадина има subjectId 9. **addPregledRezultati()** – Овој метод додава луѓе кои би имале привилегии за преглед на резултатите на анкетата која се создава. Методот execute("Sections.change", "activeSection=1") кој се повикува во овој метод е пандан на клик на анкетарот на табот за додавање на привилегии за преглед. Методот execute("Collection.new", "viewObject=xava_view_section1_pregledRezultati"), кој се повикува потоа, е еднаков на клик на анкетарот на копчето “New” во просторот од екранот што е под соодветниот таб и отвара дијалог прозорец каде има едно опаѓачко мени за избор на лице и копчиња за зачувување, зачувување и продолжување, затворање. Методот setValue("person.personId", "5"), е еднаков на акција на корисникот кога клика на опаѓачката листа и го избира лицето со презиме “Zen”, a во позадина има personId 5. execute("Collection.save") методот, кој се повикува следно, е пандан на клик на копчето “Save” од дијалог прозорецот. **addPrasanjeiOdgovori()** – Овој метод додава валидно прашање. Валидно прашање е секое прашање што има барем два понудени одговори. Методот execute("Collection.new", "viewObject=xava_view_section0_prasanja"), кој се повикува прв во рамки на методот addPrasanjeiOdgovori(), е пандан на клик на анкетарот на копчето “New” во рамки на табот за додавање прашања за анкетата што ја создава. Со клик на тоа копче се отвара дијалог прозорец каде има поле за додавање на прашањето и избор за додавање на одговори за тоа прашање. Со методот setValue("prasanje", "Test prasanje"), кој се повикува следно, се додава текстот “Test prasanje” во тоа поле и е пандан на корисникот да го пишувал во полето преку тастатура во пребарувач. Методот execute("Collection.new", "viewObject=xava_view_odgovori"), кој се повикува следно, е пандан на клик на копчето “New” за додавање на одговори за тоа прашање во рамки на веќе споменатиот дијалог прозорец и се отвара нов дијалог прозорец кој содржи поле за внес на текстот од одговорот и копчиња за зачувување, зачувување и останување, затворање. Потоа, се повикува методот setValue("odgovor", "Test odgovor 1") кој го внесува текстот "Test odgovor 1" и е пандан на корисничко внесување на истиот текст во полето. execute("Collection.saveAndStay"), е следниот метод кој се повикува и ја извршува акцијата на кликање на копчето за зачувување и останување што значи останува истиот дијалог прозорец за внесување на нов одговор за соодветното прашање. setValue("odgovor", "Test odgovor 2") го додава новиот одговор со текст "Test odgovor 2". execute("Collection.save"), методот кој се повикува следно е пандан на клик на копчето “Save” од истиот дијалог прозорец, со што се затвора тој дијалог прозорец и потоа се повикува методот execute("Collection.hideDetail"), кој го затвора првичниот дијалог прозорец за додавање на прашање и екранот се враќа во првобитната состојба. - Тестови **testBasicCreate()** – execute("CRUD.new"), пандан на клик на копчето за создавање на нова анкета од страна на анкетарот. choosePerson() – се избира анкетар, addBasicProperties() се додаваат назив и опис на анкетата, chooseSubject(), се избира предмет за кој важи анкетата која се создава. save(), веќе објаснета, пандан на клик на копчето “Save”, анкетата се зачувава, во овој метод има и метод кој се повикува и тој метод е assertNoErrors(), што значи дека оваа акција треба да заврши без грешки. Успешното поминување на овој тест значи да се создаде анкета со предмет, анкетар, назив и опис, да се зачува во база и притоа да нема никакви грешки. **testBasicCreateValidation()** – Се тестира валидацијата која подразбира да се внесени назив, опис, и да е избран предмет. Се испробувааат повеќе варијанти кои користат веќе објаснети методи и затоа нема да навлегувам во многу детали околу нив. Првата варијанта е анкетарот да го избере копчето за создавање на нова анкета, и да го избере копчето за зачувување се очекува да се појават две грешки при успешното работење на софтверот, а тие се дефинираат со методите assertError("Vnesete naziv i opis") и assertError("Value for Subject in Anketa is required"). Грешките се за празни полиња за назив и опис и неизбирање на предмет, соодветно. Доколку се појават овие две грешки до овој чекор тестот е успешен. Втората варијанта подразбира избирање на копчето за нова анкета, избирање на предмет со методот chooseSubject(), избирање на копчето за зачувување по што треба да следува грешка, а тоа се проверува со повикување на методот assertError("Vnesete naziv i opis"). Доколку се појави оваа грешка (и претходната) до овој чекор тестот е успешен. Во наредната варијанта се внесува негов идентификатор од база (choosePerson()), се избира копчето за зачувување и очекуваните грешки се за непостоење на назив и опис и неизбран предмет, а се проверуваат со assertError("Vnesete naziv i opis") и assertError("Value for Subject in Anketa is required"). До овој чекор тестот е успешен доколку се појават овие две грешки (и претходните). Наредната варијанта предвидува избор на personId, и избор на предмет по што се избира копчето за зачувување и се очекува една грешка да се појави и таа грешка е "Vnesete naziv i opis". Тестот е успешен до овој чекор доколку се појави оваа грешка (и претходните). Последната варијанта опфаќа внесување негов personId, внес на назив и опис на анкетата, клик на копчето за зачувување и се очекува грешката "Value for Subject in Anketa is required", бидејќи не е избран предмет. Тестот е успешен доколку се појави оваа грешка и сите грешки од претходните варијанти. **testCreateWithPregledRezultatiOnly()** – Овој метод го тестира создавањето на валидна анкета, за која се внесени лица со привилегии за преглед, не се внесени прашања и одговори. Валидна анкета има назив, опис, предмет. Во рамки на овој метод се се извршува акцијата за клик на копчето “New”, се избира анкетар, се внесува назив и опис, се избира предмет. Сите овие акции се извршуваат со веќе опишани методи во оваа спецификација, потоа се повикува методот addPregledRezultati() кој е веќе опишан во спецификацијава во делот “Помошни методи”. На крај се повикува методот assertNoErrors(), што значи овој тест е успешен доколку не се јави грешка за време на извршувањето на акциите кои се дефинирани во него. **testCreateWithPrasanjeiOdgovoriOnly()** – Овој метод создава валидна анкета која нема лица со привилегии за преглед на резултатите, но има едно прашање со два одговори, кое е валидно. Валидната анкета подразбира внесени назив, опис, предмет. Во методот се повикуваат веќе опишани методи, односно, се врши најава, се клика на копчето “New”, се избира, анкетар, се внесуваат опис, назив, предмет, се внесува прашање со два одговори, со повик на addPrasanjeiOdgovori(). На крај се повикува методот assertNoErrors(), што подразбира да се изврши овој тест без никаква грешка во апликацијата. Тестот е успешен доколку се извршат сите дефинирани акции без да се појави грешка во текот на извршувањето во апликацијата. **testCreateWithPrasanjeiOdgovoriOnlyValidation()** – Овој метод тестира дали правилно работи валидацијата на анкетата при создавање на анкета за која не се поставени лица со привилегии за преглед, но има едно валидно прашање кое содржи два понудени одговори. За тестирање на валидацијата од сите можни аспекти се извршуваат три варијанти и успешноста на тестот зависи од тоа дали ќе се појават соодветните грешки при валидација за секоја варијанта. Најпрво се извршува методот execute("CRUD.new"), односно, клик на копчето “New” за создавање нова анкета, по што се извршуваат методите choosePerson(), addBasicProperties(), со што се додава анкетар и се додаваат назив и опис. Потоа со execute("Collection.new", "viewObject=xava_view_section0_prasanja"), се симулира акција на клик на копчето “New” од табот за внес на прашања. Со setValue("prasanje", "Test prasanje") се внесува текст на прашањето “Test prasanje”. execute("Collection.new", "viewObject=xava_view_odgovori") со овој метод, кој се повикува следно, се симулира акција на клик на копчето “New” за додавање на нов одговор од дијалог прозорецот за внес на прашања. setValue("odgovor", "Test odgovor 1"), се симулира внес на текст “Test odgovor 1”. execute("Collection.saveAndStay"), потоа се симулира клик на копчето за зачувување и останување. Нормалната функционалност после клик на ова копче налага за нотификација за грешка во корисничкиот интерфејс, и затоа со методот assertError("Value for Subject in Anketa is required") налагаме дека тестот до овој чекор е успешен доколку се појави грешката "Value for Subject in Anketa is required". Доколку не се појави оваа грешка и се појави било што друго тестот е неуспешен. Со повикување на методот execute("Collection.hideDetail"), се симулира затворање на дијалог прозорецот за внес на одговор. И со уште еден повик на execute("Collection.hideDetail"), кој следува, се симулира затворање на дијалог прозорецот за внес на прашања. Бидејќи наредните варијанти се многу слични на првата во овој метод, нема да навлегувам во многу детали и опис на методите, разликите се во внесот на податоците во создавањето на анкетата. Втората варијанта опфаќа симулирање на копчето за создавање на нова анкета, се внесува анкетар и предмет, се симулира клик на копчето за внес на ново прашање, во полето за внес на прашање се симулира внес на “Test prasanje”, потоа се симулира клик на копчето за внес на нов одговор, се внесува одговорот "Test odgovor 1", се симулира клик на копчето за зачувување и останување. Со методот assertError("Vnesete naziv i opis") се очекува да се појави грешката "Vnesete naziv i opis" и доколку не се појави оваа и само оваа грешка, и секако не помине првата варијанта тестот ќе биде неуспешен. Се повикува методот за затворање на дијалог прозорец два пати. Третата варијанта ги опфаќа симулација на клик на копчето за внесување на нова анкета, се внесува само анкетар, се симулира клик на копчето за внес на ново прашање, се симулира внес на текстот “Test prasanje”, се симулира клик на копчето за внес на нов одговор, се внесува одговорот "Test odgovor 1", и се симулира клик на копчето за зачувување и останување, по што со методите assertError("Vnesete naziv i opis") и assertError("Value for Subject in Anketa is required"), се очекува да се појават грешките "Vnesete naziv i opis", “Value for Subject in Anketa is required", доколку се појават овие две грешки после оваа акција и само овие две грешки и минатите две варијанти поминале тестот се прогласува за успешен. Се повикува методот за затворање на дојалог прозорец два пати. **testCreateWithPregledRezultatiOnlyValidation()** – Овој метод ја тестира валидацијата на анкетата која се создава кога дополнително се внесуваат лица со привилегии за преглед на резултати, а не прашања и одговори. Има три можни варијанти и сите три користат методи кои се веќе објаснети. Се симулира клик на копчето за создавање на нова анкета, се симулира одбирање на анкетар од опаѓачката листа, се симулира внес на назив и опис на анкетата, и внес на лица со привилегии за преглед на резултати со повик на методот addPregledRezultati(). Очекуваната грешка што треба да се појави после извршувањето на овие акции е "Value for Subject in Anketa is required". Доколку оваа грешка не се појави тестот не е успешен. Се повикува метод за затворање на дијалог прозорец. Во втората варијанта повторно се симулира клик на копчето за создавање нова анкета, се симулира внес на анкетар, предмет и лица со привилегии за преглед на резултати, очекуваната грешка е "Vnesete naziv i opis". Доколку се појави оваа и само оваа грешка после акцијата од втората варијанта оваа варијанта поминува. Во третата варијанта се симулира клик на копчето за создавање на нова анкета, внес на анкетар, лица со привилегии за преглед на резултати. Се очекуваат грешките "Vnesete naziv i opis" и "Value for Subject in Anketa is required". Доколку после акциите од третата варијанта се појават овие и само овие две грешки и претходните две варијанти поминале успешно тестот е успешен. **testFullCreate()** – Овој метод тестира создавање на “целосна”, валидна анкета. Се симулира клик на копчето за создавање на нова анкета, внес на анкетар, назив опис, предмет, прашање со два одговори, лице со привилегии за преглед на крај од методот се очекува да не се појави никаква грешка со методот assertNoErrors(). Овој тест е успешен доколку се извршат сите акции коректно, односно после (или во текот на) нивното извршување не се појави никаква грешка. ---- == ''Опис на тестови за активирање на анкета'' ---- - Конструктор super(nameTest, "SelfEvaluation", "AnketaActivations") - се наведува името на OpenXava проектот и името на соодветната класа (module – според OpenXava терминологија). - Помошни методи **chooseValidAnketa()** – Овој метод содржи метод setValue("anketa.id", "115") кој од опаѓачко мени симулира избор на анкетата со id 115. Потребно е во база да се има запис на анкета со id 115. Овде може да се стави id на било кој запис од анкета во база, бидејќи во база се запишуваат само валидни анкети, односно анкети со назив, опис и избран предмет. **chooseAnketaWithoutQuestions()** - Овој метод содржи метод setValue("anketa.id", "116") кој од опаѓачко мени симулира избор на анкетата со id 116. Потребно е во база да се има запис на анкета со id 116. Анкетата со ова id нема никаков внес на прашања, може да се стави било кое id, но мора анкетата со тоа id, да нема никаков запис на прашања во база. **chooseAnketaWithNonValidAnswers()** - Овој метод содржи метод setValue("anketa.id", "117") кој од опаѓачко мени симулира избор на анкетата со id 116. Потребно е во база да се има запис на анкета со id 117. Конкретната анкета со ова id има три записи на прашања во база од кои едно има само еден понуден одговор, односно не е валидно, додека другите две имаат по два понудени одговори. Може да се стави id на било која друга анкета која има едно невалидно прашање (може и повеќе но во тој случај ќе мора да се изврши промена на параметарот на assertError("Sekoe prasanje mora da ima minimum po 2 ponudeni odgovori, 1 prasanja ne zadovoluvaat uslov") методот каде “1” ќе се промени во бројот на прашања кои се внесени и имаат помалку од два понудени одговори во база). **chooseDates(Date af, Date at)** – Овој метод како параметри прима два датуми, и повикува два методи кои симулираат избор на датуми од календар. Датумите што се симулира дека се избираат од календарите се датумите што се внесуваат како параметри. - Тестови **testValidAnketaValidDates()** – Овој метод служи за проверка на активирање на анкета со валидни датуми. “Датумот од” е датумот што следува два дена од моменталниот датум на повикување на кодот. Додека “датумот до” е датумот што следува десет дена од моменталниот датум на повикување на кодот. Деновите се арбитрарни и можат да бидат било кои број на денови се додека бројот на денови од моменталниот датум за “датум од” е помал од тие денови по кој што ќе следува “датумот до” и “датум од” е после моменталниот. Се повикува методот chooseDates(Date af, Date at), со соодветните датуми како параметри. Се повикува методот chooseValidAnketa(), со методот execute(""MyTypical.save"") се симулира клик на копчето за зачувување и со методот assertNoErrors() се очекува да не се појави никаква грешка. Овој тест е успешен доколку не се појави грешка. **testValidAnketaNonValidDates()** – Со овој метод се тестира активирање на валидна анкета која нема валидни датуми. Постојат повеќе варијанти на невалидни датуми и сите се тестираат со овој тест. Процедурата за тестирање за активација на анкета со невалидни датуми за секоја варијанта на невалидни датуми е идентична и затоа ќе ја опишам само еднаш. Најпрво се симулира клик на копчето за ново активирање на анкета, се повикуваат методите chooseDates() и chooseValidAnketa(). Се симулира клик на копчето за зачувување и се очекува една иста грешка кај секоја од варијантите со методот assertError("Activefrom teba da e pred activeto i posle denesniot datum!"), грешката е ("Activefrom teba da e pred activeto i posle denesniot datum!". За датумот да е валиден треба “датум од” да е помал од “датумот до” и “датум од” да е после моменталниот. Варијантите се следни: датумот од да е моменталниот датум, а датумот до да е датум што е десет дена од моменталниот, датум од да е десет дена пред моменталниот и датум до да е десет дена после моменталниот, датум од да е десет дена пред моменталниот и датум до да е пет дена пред моменталниот, датум од и датум до да се моменталниот датум, датум од да е десет дена после моменталниот датум и датум до да е пет дена после моменталниот датум, датум од да е десет дена пред моменталниот датум и датум до да е моменталниот датум. После извршувањето на секоја од варијантите треба да се појави грешката "Activefrom teba da e pred activeto i posle denesniot datum!" со цел тестот да е успешен. **testAnketaWithoutQuestionsValidDates()** – Со овој метод се тестира активирање на анкета која е валидна, но без прашања и има валидни датуми. На почеток се симулира клик на копчето за ново активирање на анкета, датумот од се поставува на пет дена после денешниот датум, а датумот до се поставува на десет дена после денешниот датум и се симулира нивното избирање со повик на методот chooseDates(active_from, active_to), и потоа се повикува методот chooseAnketaWithoutQuestions(), по што се симулира клик на копчето за зачувување. Тестот е успешен доколку се појави една грешка а таа е "Vnesete barem edno prasanje" и се проверува со методот assertError("Vnesete barem edno prasanje"). **testAnketaWithoutQuestionsNonValidDates()** – Овој тест проверува активирање на анкета без внесени прашања и невалидни датуми. На почеток се симулира клик на копчето за ново активирање на анкета, датумот од се поставува на десет дена после денешниот датум, а датумот до се поставува на пет дена после денешниот датум и се симулира нивното избирање со повик на методот chooseDates(active_from, active_to), и потоа се повикува методот chooseAnketaWithoutQuestions(), по што се симулира клик на копчето за зачувување. Тестот е успешен доколку се појават две грешки, а тие е "Vnesete barem edno prasanje" и се проверува со методот assertError("Vnesete barem edno prasanje") и "Activefrom teba da e pred activeto i posle denesniot datum!" која се проверува со методот assertError("Activefrom teba da e pred activeto i posle denesniot datum!"). **testAnketaWithoutValidAnswersValidDates()** – Со овој метод се проверува активирање на анкета која има прашање со невалидни одговори, односно има помалку од два понудени одговори и има валидни датуми. На почеток се симулира клик на копчето за ново активирање на анкета, датумот од се поставува на пет дена после денешниот датум, а датумот до се поставува на десет дена после денешниот датум и се симулира нивното избирање со повик на методот chooseDates(active_from, active_to), и потоа се повикува методот chooseAnketaWithNonValidAnswers(), по што се симулира клик на копчето за зачувување. Тестот е успешен доколку се појави една грешка, а таа е "Sekoe prasanje mora da ima minimum po 2 ponudeni odgovori, 1 prasanja ne zadovoluvaat uslov" и се проверува со методот assertError("Sekoe prasanje mora da ima minimum po 2 ponudeni odgovori, 1 prasanja ne zadovoluvaat uslov"). **testAnketaWithoutValidAnswersNonValidDates()** - Со овој метод се проверува активирање на анкета која има прашање со невалидни одговори, односно има помалку од два понудени одговори и има невалидни датуми. На почеток се симулира клик на копчето за ново активирање на анкета, датумот од се поставува на десет дена после денешниот датум, а датумот до се поставува на пет дена после денешниот датум и се симулира нивното избирање со повик на методот chooseDates(active_from, active_to), и потоа се повикува методот chooseAnketaWithNonValidAnswers(), по што се симулира клик на копчето за зачувување. Тестот е успешен доколку се појават две грешки, а тие се "Sekoe prasanje mora da ima minimum po 2 ponudeni odgovori, 1 prasanja ne zadovoluvaat uslov" и се проверува со методот assertError("Sekoe prasanje mora da ima minimum po 2 ponudeni odgovori, 1 prasanja ne zadovoluvaat uslov") и "Activefrom teba da e pred activeto i posle denesniot datum!" која се проверува со методот assertError("Activefrom teba da e pred activeto i posle denesniot datum!").