Skip to content

Commit 1723719

Browse files
author
rtschu
committed
added README section on testing
1 parent edb906b commit 1723719

File tree

1 file changed

+178
-0
lines changed

1 file changed

+178
-0
lines changed

README.md

+178
Original file line numberDiff line numberDiff line change
@@ -64,3 +64,181 @@ Nach Klick auf obigen Button wird eine Übersicht über Befragungen angezeigt, d
6464

6565
In diesem Fall sind keine Befragungen vorbereitet. Falls Befragungen vorhanden sind, wird zusätzlich ein Button angezeigt, der zur Übertragung der Teilnehmerliste dient:
6666
![Screenshot: Mit Evaluationen](https://cloud.githubusercontent.com/assets/432117/21343860/1d4ce964-c699-11e6-8cd9-2b20f3155153.png)
67+
68+
## Tests
69+
70+
Die Funktionsweise des Blocks wird durch Behattests sichergestellt.
71+
72+
##### Tests durchführen:
73+
Um die Test durchzuführen führen sie:
74+
`php moodle/admin/tool/behat/cli/run.php --tags="@block_evasys_sync"` aus. <br>
75+
Mehr Infos dazu in der [Dokumentation](https://docs.moodle.org/dev/Running_acceptance_test)
76+
77+
##### Neue Tests schreiben:
78+
- Diese Plugin verfügt über einen Behattest Generator, zu finden in `evasys_sync/tests/behat/generator` <br>
79+
- Der Generator ist zweigeteilt. Um bestehende Schritte zu ändern reicht es die entsprechende Schrittdefiniton in `steps.py` zu finden und zu ändern.
80+
- Um neue Schritte zu definieren, muss ein entsprechender Schritt in `steps.py` angelegt werden, und die entsprechenden parameter in `generator.py` als key im `OPTIONS dict` angelegt werden. zudem muss in den verwendeten methoden der Parameter hinzugefügt werden. <br>
81+
Logischerweise muss der neue Schritt auch in `behat_block_evasys_sync` definiert werden sofern es kein Standardschritt ist.
82+
83+
######Generator
84+
Der generelle Aufbau des Generators ist wie folgt:
85+
<br>`steps.py`:
86+
- direkte Texterzeugende Methoden sollten hier definiert werden.
87+
- Für einfache Schritte die nur von einem Parameter abhängen können `dicts` benutzt werden.
88+
- Bennenungskonventionen:
89+
* `dicts`: <i>type</i>_<i>chechname_with_underscores</i>
90+
* `functions`: <i>type</i>_<i>chechnamewithoutunderscores</i>
91+
- _type_ richtet sich nach der Funktion des zurückgegebenen Texts im Context des Behat tests:
92+
* `description`: Der zurückgegebene Text ist für die Scenariobeschreibung.
93+
* `step`: Der zurückgegebene Text legt die Umgebung des Tests fest.
94+
* `check`: Der zurückgegebene Text ist eine Überprüfung der erzeugten Seite.
95+
96+
<br>`generator.py`:
97+
- 4 hauptmethoden die für die übergebenen Parameter entsprechende Texte zurückgeben:
98+
* `get_checks` Gibt alle Checks aus
99+
* `get_scenario` Gibt alle Umgebungsfestlegenden Texte zurück
100+
* `get_combi_description` Gibt die Beschreibung eines Szenarios auch für eine mehrfachbelegung von parametern zurück
101+
* `get_postcondensing_checks` Gibt die Checks die beim verkleinern der Szenarien nicht berücksichtigt werden sollen Zurück.
102+
103+
Der generator erzeutgt zunächst aus allen in `OPTIONS` festgelegten Parametern das Karthesische Produkt. <br>
104+
Danach werden für jede Option die Checks berechnet.
105+
Alle Optionen mit gleichem Check werden darauf überprüft ob sie durch das abändern eines
106+
Parameters mit einer der anderen Optionen übereinstimmen. Wenn Ja wird angenommen, dass der Parameter nicht relevant für den Ausgang ist und die 2 Tests zusammengefasst.
107+
108+
######Mockingklassen:
109+
Die Rückgaben des Evasys und LSF system werden für die Tests gemockt.<br>
110+
Dies geschiet in den Dateien `lsf_api_mock_testable.php` sowie in der unterklasse `evasys_api_testable` in `evasys_api.php`
111+
<br>
112+
Die relationen sehen dabei wie folgt aus:<br>
113+
`lsfid` &rarr; `(veranstnr, semestertext)` = `evasyskennung` <br>
114+
Die daten werden als JSON array im `summary` Feld der `course` Tabelle gespeichert. Dabei haben die Daten folgende Form: <br>
115+
`stdClass()->evacourses => array()`
116+
<details name="evavardump">
117+
<summary>Single Evacourse vardump</summary>
118+
119+
object(stdClass)[281]
120+
public 'valid' => boolean true
121+
public 'veranstnr' => int 0
122+
public 'semestertxt' => string 'WS 2017/18' (length=10)
123+
public 'studentcount' => int 100
124+
public 'title' => string 'DynamicSurvey0' (length=14)
125+
public 'surveys' =>
126+
array (size=1)
127+
0 =>
128+
object(stdClass)[282]
129+
public 'num' => int 0
130+
public 'formid' => int 1
131+
public 'is_open' => string 't' (length=1)
132+
public 'form_count' => int 20
133+
public 'pswd_count' => int 200
134+
</details>
135+
136+
Das `stdClass->evacourses` Array sollte dabei für eine lsfid die entsprechende Datenstruktur [siehe vardump](#evavardump) zurückliefern.
137+
<br>
138+
Die gemockte lsfapi gibt lediglich `semestertext` und `veranstnr` zurück da die restlichen Werte nicht behötigt werden <br>
139+
Auch die gemockte evasysapi gibt lediglich benutzte Werte zurück und füllt den Rest mit dummys. Sollte ein neuer Wert benötigt werden, so muss dieser hier eingefügt werden. <br>
140+
Hier sind dafür Vardumps bereitgestellt, (evasys Struktur ändert sich je nachdem ob der Kurs eine oder mehrere Umfragen besitzt!!!):
141+
<details>
142+
<summary>Evasys Kurs Vardump</summary>
143+
144+
object(stdClass)[402]
145+
public 'm_nCourseId' => int 166410
146+
public 'm_sProgramOfStudy' => string '' (length=0)
147+
public 'm_sCourseTitle' => string 'AutoMultiSurvey' (length=15)
148+
public 'm_sRoom' => string '' (length=0)
149+
public 'm_nCourseType' => int 1
150+
public 'm_sPubCourseId' => string '1002 WS 2018/19' (length=15)
151+
public 'm_sExternalId' => string '' (length=0)
152+
public 'm_nCountStud' => int 2
153+
public 'm_sCustomFieldsJSON' => string '{}' (length=2)
154+
public 'm_nUserId' => int 73350
155+
public 'm_nFbid' => int 338
156+
public 'm_nPeriodId' => int 40
157+
public 'm_aoParticipants' =>
158+
object(stdClass)[404]
159+
public 'm_aoSecondaryInstructors' =>
160+
object(stdClass)[401]
161+
public 'm_oSurveyHolder' =>
162+
object(stdClass)[411]
163+
public 'm_aSurveys' =>
164+
object(stdClass)[412]
165+
public 'Surveys' =>
166+
167+
</details>
168+
<details>
169+
<summary>Vardump von einem Kurs mit nur eimer Umfrage</summary>
170+
171+
public 'm_aSurveys' =>
172+
object(stdClass)[412]
173+
public 'Surveys' =>
174+
object(stdClass)[413]
175+
public 'm_nSurveyId' => int 330416933
176+
public 'm_nState' => int 0
177+
public 'm_sTitle' => string 'AutoMultiSurvey' (length=15)
178+
public 'm_cType' => string 'o' (length=1)
179+
public 'm_nFrmid' => int 832
180+
public 'm_nStuid' => int 34763
181+
public 'm_nVerid' => int 166410
182+
public 'm_nOpenState' => int 1
183+
public 'm_nFormCount' => int 0
184+
public 'm_nPswdCount' => int 2
185+
public 'm_sLastDataCollectionDate' => string '' (length=0)
186+
public 'm_nPageLinkOffset' => int 0
187+
public 'm_sMaskTan' => string '' (length=0)
188+
public 'm_nMaskState' => int 0
189+
public 'm_oPeriod' =>
190+
object(stdClass)[414]
191+
public 'm_nPeriodId' => int 40
192+
public 'm_sTitel' => string 'WS 2018/19' (length=10)
193+
public 'm_sStartDate' => string '2018-10-01' (length=10)
194+
public 'm_sEndDate' => string '2019-03-31' (length=10)
195+
</details>
196+
197+
<details>
198+
<summary>Vardump von einem Kurs mit mehreren Umfragen</summary>
199+
200+
public 'm_aSurveys' =>
201+
object(stdClass)[412]
202+
public 'Surveys' =>
203+
array (size=2)
204+
0 =>
205+
object(stdClass)[409]
206+
public 'm_nSurveyId' => int 330416933
207+
public 'm_nState' => int 0
208+
public 'm_sTitle' => string 'AutoMultiSurvey' (length=15)
209+
public 'm_cType' => string 'o' (length=1)
210+
public 'm_nFrmid' => int 832
211+
public 'm_nStuid' => int 34763
212+
public 'm_nVerid' => int 166410
213+
public 'm_nOpenState' => int 1
214+
public 'm_nFormCount' => int 0
215+
public 'm_nPswdCount' => int 2
216+
public 'm_sLastDataCollectionDate' => string '' (length=0)
217+
public 'm_nPageLinkOffset' => int 0
218+
public 'm_sMaskTan' => string '' (length=0)
219+
public 'm_nMaskState' => int 0
220+
public 'm_oPeriod' =>
221+
object(stdClass)[410]
222+
...
223+
1 =>
224+
object(stdClass)[411]
225+
public 'm_nSurveyId' => int 2114887341
226+
public 'm_nState' => int 0
227+
public 'm_sTitle' => string 'AutoMultiSurvey' (length=15)
228+
public 'm_cType' => string 'o' (length=1)
229+
public 'm_nFrmid' => int 784
230+
public 'm_nStuid' => int 34763
231+
public 'm_nVerid' => int 166410
232+
public 'm_nOpenState' => int 1
233+
public 'm_nFormCount' => int 0
234+
public 'm_nPswdCount' => int 2
235+
public 'm_sLastDataCollectionDate' => string '' (length=0)
236+
public 'm_nPageLinkOffset' => int 0
237+
public 'm_sMaskTan' => string '' (length=0)
238+
public 'm_nMaskState' => int 0
239+
public 'm_oPeriod' =>
240+
object(stdClass)[410]
241+
</details>
242+
243+
Letztlich ist noch zu bemerken, dass für über die `idnumber` verknüpfte Kurse immer ein Sommersemester als `semestertext` gewählt werden sollte,
244+
entsprechend für über die Mappingfunktion verknüpfte Kurse ein Wintersemester, um gleiche Evasyskennungen zu vermeiden.

0 commit comments

Comments
 (0)