feat: add tests images

This commit is contained in:
Kristofers Solo 2025-01-02 22:36:44 +02:00
parent 2721ef6034
commit c4bbd7c88c
7 changed files with 266 additions and 84 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

27
attachments.typ Normal file
View File

@ -0,0 +1,27 @@
#import "@preview/i-figured:0.2.4"
#heading("Pielikumi", numbering: none)
#set figure(numbering: "1")
#set figure(kind: "attachment", supplement: "pielikums")
#figure(
caption: [Pilns "hexlab" bibliotēkas testu rezultāts],
image("assets/images/tests/hexlab-full.png", height: 90%),
) <tests-hexlab-full>
#figure(
caption: [Tarpaulin rīka rezultāts "hexlab" bibliotēkai],
image("assets/images/tests/tarpaulin/hexlab.png"),
) <tarpaulin-hexlab>
#figure(
caption: [Tokei rīka rezultāts "Maze Ascension" spēlei],
image("assets/images/tokei/maze-ascension.png"),
) <tokei-maze-ascension>
#figure(
caption: [Tokei rīka rezultāts "hexlab" bibliotēkai],
image("assets/images/tokei/hexlab.png"),
) <tokei-hexlab>

View File

@ -1,6 +1,6 @@
#import "@preview/i-figured:0.2.4" #import "@preview/i-figured:0.2.4"
#import "@preview/tablex:0.0.9": tablex #import "@preview/tablex:0.0.9": tablex
#import "@preview/pintorita:0.1.3" #import "@preview/headcount:0.1.0": *
#let indent = 1cm #let indent = 1cm
@ -45,6 +45,16 @@
show math.equation: set text(weight: 400) show math.equation: set text(weight: 400)
// replace `.` with `,`
show math.equation: it => {
show regex("\d+\.\d+"): num => {
show ".": math.class("normal", ",")
num
}
it
}
// Formatting for regular text // Formatting for regular text
set par( set par(
justify: true, justify: true,
@ -167,10 +177,12 @@
/* --- Figure/Table config start --- */ /* --- Figure/Table config start --- */
show heading: i-figured.reset-counters show heading: i-figured.reset-counters
show figure: i-figured.show-figure.with(numbering: "1.1.") show figure: i-figured.show-figure.with(numbering: "1.1.")
set figure(numbering: dependent-numbering("1.1"))
set figure(placement: none) set figure(placement: none)
show figure.where(kind: "i-figured-table"): set block(breakable: true) show figure.where(kind: "i-figured-table"): set block(breakable: true)
show figure.where(kind: "i-figured-table"): set figure.caption(position: top) show figure.where(kind: "i-figured-table"): set figure.caption(position: top)
show figure.where(kind: "attachment"): set figure.caption(position: top)
show figure: set par(justify: false) // disable justify for figures (tables) show figure: set par(justify: false) // disable justify for figures (tables)
show figure.where(kind: table): set par(leading: 1em) show figure.where(kind: table): set par(leading: 1em)
@ -196,6 +208,12 @@
), ),
) )
} }
if it.kind == "i-figured-\"attachment\"" {
return align(
end,
it.counter.display() + ". pielikums. " + text(it.body),
)
}
it it
} }
@ -227,8 +245,10 @@
let supplement_map = ( let supplement_map = (
i-figured-table: "tab.", i-figured-table: "tab.",
i-figured-image: "att.", i-figured-image: "att.",
attachment: "pielikums",
) )
// Get the supplement value properly // Get the supplement value properly
let supplement = if type(it.supplement) != function { let supplement = if type(it.supplement) != function {
it.supplement it.supplement
@ -239,15 +259,23 @@
"" ""
} }
} }
let number = if kind == "attachment" {
numbering(
el.numbering,
..counter(figure.where(kind: kind)).at(el.location()),
) + "." // Only add dot for attachments
} else {
numbering(
el.numbering,
..counter(figure.where(kind: kind)).at(el.location()),
) // No extra dot for tables and images
}
// Create counter based on the kind // Create counter based on the kind
return link( return link(
el.location(), el.location(),
numbering( number + if supplement != "" {
el.numbering,
..counter(figure.where(kind: kind)).at(
el.location(),
),
) + if supplement != "" {
" " + supplement " " + supplement
} else { } else {
"" ""

186
main.typ
View File

@ -1801,10 +1801,152 @@ Integrācijas testēšana ir veikta manuāli, mijiedarboties ar spēles saskarni
Katrs testa scenārijs ir dokumentēta strukturētas tabulas formātā, ievērojot Katrs testa scenārijs ir dokumentēta strukturētas tabulas formātā, ievērojot
būtisku informāciju, piemēram, test nosaukumu, unikālo identifikatoru, aprakstu, būtisku informāciju, piemēram, test nosaukumu, unikālo identifikatoru, aprakstu,
izpildes soļus, gaidāmo rezultātu un faktisko rezultātu (veiksmīga testa izpildes soļus, gaidāmo rezultātu un faktisko rezultātu (veiksmīga testa
gadījumā apzīmēts ar "Ok", bet neveiksmīgu -- ar "Err"). gadījumā apzīmēts ar "Ok", bet neveiksmīgu -- "Err").
Izvēlētie testu gadījumi ir detalizēti aprakstīti #todo("attiecīgā tabula") tabulā. Izvēlētie testu gadījumi ir detalizētāk aprakstīti @tbl:manual-tests[tabulā].
#todo("add tests table")
#figure(
caption: "Manuālā testēšana",
kind: table,
tablex(
columns: (3.5em, 6em, auto, auto, 5.5em),
[*Testa ID*],
[*Testa nosaukums*],
[*Soļi*],
[*Sagaidāmais rezultāts*],
[*Faktiskais rezultāts*],
"MT01",
"Spēles palaišana",
[
+ Palaist spēli
+ Gaidīt ielādi
],
[Parādās galvenā izvēlne ar "Play" pogu.],
"Ok",
"MT02",
"Labirinta ģenerēšana",
[
+ Palaist spēli
+ Nospiest "Play" pogu
+ Gaidīt ielādi
],
[Tiek uzģenerēts sešstūrains labirints ar sienām.],
"Ok",
"MT03",
"Stāvu pāreja (uz augšu)",
[
+ Nokļūt līdz beigu šūnai
+ Novērot animāciju
],
[
+ Plūstoša pāreja starp stāviem uz augšu
+ Jauna stāva ģenerēšana
],
"Ok",
"MT04",
"Stāvu pāreja (uz leju)",
[
+ Nokļūt līdz sākuma šūnai
+ Novērot animāciju
],
[
+ Plūstoša pāreja starp stāviem uz leju
+ Jauns stāvs netiek ģenerēts
],
"Ok",
"MT05",
"Papildspēju aktivizēšana",
[
+ Aktivizēt papildspēju
+ Gaidīt atjaunošanās laiku
],
[
+ Papildspēja aktivizējas
+ Sākas atjaunošanās laiks
],
"Err",
"MT06",
"Izstrādes rīku atvēršana",
[
+ Palaist spēli izstrādes režīmā
+ Nospiest "Play" pogu
],
[Parādās "egui" panelis ar labirinta konfigurācijas opcijām],
"Ok",
"MT07",
[Labirinta parametru maiņa],
[
+ Atvērt "egui" paneli
+ Mainīt labirinta izmēru un citus parametrus
],
[Tiek ģenerēts jauns labirints ar mainītajiem parametriem],
"Ok",
"MT08",
[Spēlētāja kustība],
[
+ Izmantot WASD vadību
+ Mēģināt šķērsot sienas
],
[
+ Plūstoša kustība brīvajā telpā
+ Sadursmes ar sienām strādā
],
"Ok",
"MT09",
[Windows palaišana],
[
+ Kompilēt spēli Windows platformai
+ Palaist .exe failu
+ Veikt pamata funkcionalitātes testu
],
[Spēle darbojas Windows vidē bez kļūdām],
"Ok",
"MT10",
[Linux palaišana],
[
+ Kompilēt spēli Linux platformai
+ Palaist bināro failu
+ Veikt pamata funkcionalitātes testu
],
[Spēle darbojas Linux vidē bez kļūdām],
"Ok",
"MT11",
[macOS palaišana],
[
+ Kompilēt spēli macOS platformai
+ Palaist .dmg pakotni
+ Veikt pamata funkcionalitātes testu
],
[Spēle darbojas macOS vidē bez kļūdām],
"Err",
"MT12",
[WASM palaišana],
[
+ Kompilēt spēli WASM mērķim
+ Atvērt pārlūkā
+ Veikt pamata funkcionalitātes testu
],
[
+ Spēle ielādējas pārlūkā
+ Darbojas visas pamatfunkcijas
],
"Ok",
),
) <manual-tests>
#indent-par[
Divi testi no manuālās testēšanas plāna netika izpildīti.
Papildspēju tests (MT05) netika izpildīts, jo šī funkcionalitāte netika
implementēta projekta pirmajā versijā, atstājot to kā potenciālu nākotnes
papildinājumu.
Savukārt macOS platformas tests (MT11) netika izpildīts
tehnisku ierobežojumu dēļ -- projekta izstrādātājam nav pieejama Apple
aparatūra.
]
Tādējādi no divpadsmit definētajiem testiem desmit tika veiksmīgi izpildīti,
viens netika implementēts (papildspējas), un viens tika daļēji izpildīts (macOS
kompilēšana bez funkcionālās testēšanas).
=== Automatizēti testi === Automatizēti testi
@ -1814,19 +1956,25 @@ Testēšanas stratēģijā ir ieviesti vairāki pārbaudes līmeņi: dokumentāc
no drošina piemēra koda pareizību, moduļu testi pārbauda iekšējo no drošina piemēra koda pareizību, moduļu testi pārbauda iekšējo
funkcionalitāti, savukārt testu mapē esošie vienībtesti un integrācijas testi funkcionalitāti, savukārt testu mapē esošie vienībtesti un integrācijas testi
pārbauda sarežģītākus gadījumus. pārbauda sarežģītākus gadījumus.
Izmantojot "cargo-tarpaulin", testu pārklājums ir $81,69%$ (116 no 142 Automatizēto testu izpildes rezultātu kopsavilkums ir redzams
iekļautajām rindiņām), tomēr šis rādītājs pilnībā neatspoguļo faktisko @fig:tests-hexlab[attēlā], savukārt detalizēts testu izpildes pārskats ir
pārklājumu, jo rīkam ir ierobežojumi attiecībā uz "inline"#footnote[https://doc.rust-lang.org/nightly/reference/attributes/codegen.html?highlight=inline] pieejams @tests-hexlab-full[pielikumā].
Izmantojot "cargo-tarpaulin", testu pārklājums ir $81.69%$ (116 no 142
iekļautajām rindiņām) (sk. @tarpaulin-hexlab[pielikumu]), tomēr šis rādītājs
pilnībā neatspoguļo faktisko pārklājumu, jo rīkam ir ierobežojumi attiecībā uz
"inline"#footnote[https://doc.rust-lang.org/nightly/reference/attributes/codegen.html?highlight=inline]
funkcijām un citi tehniski ierobežojumi @cargo-tarpaulin. funkcijām un citi tehniski ierobežojumi @cargo-tarpaulin.
#figure(
caption: [Daļējs "hexlab" bibliotēkas testu rezultāts],
image("assets/images/tests/hexlab-minimized.png"),
)<tests-hexlab>
#todo("double check which tests are actually imlemented")
Arī spēles kods saglabā stabilu testēšanas stratēģiju. Arī spēles kods saglabā stabilu testēšanas stratēģiju.
Dokumentācijas testi tiek rakstīti tieši koda dokumentācijā, kalpojot diviem Dokumentācijas testi tiek rakstīti tieši koda dokumentācijā, kalpojot diviem
mērķiem -- tie pārbauda koda pareizību un vienlaikus sniedz skaidrus lietošanas mērķiem -- tie pārbauda koda pareizību un vienlaikus sniedz skaidrus lietošanas
piemērus turpmākai uzturēšanai. piemērus turpmākai uzturēšanai.
Šie testi ir īpaši vērtīgi, jo tie nodrošina, ka dokumentācija tiek sinhronizēta
ar faktisko koda uzvedību.
Moduļu testi ir stratēģiski izvietoti līdzās implementācijas kodam tajā pašā Moduļu testi ir stratēģiski izvietoti līdzās implementācijas kodam tajā pašā
failā, nodrošinot, ka katras komponentes funkcionalitāte tiek pārbaudīta failā, nodrošinot, ka katras komponentes funkcionalitāte tiek pārbaudīta
izolēti. izolēti.
@ -1901,12 +2049,11 @@ balstās uz $550$ verificētu programmatūras projektu datubāzi @QSM.
Izmantojot "tokei" rīku @tokei, tika veikta detalizēta projekta koda analīze, Izmantojot "tokei" rīku @tokei, tika veikta detalizēta projekta koda analīze,
kas parādija, ka "Maze Ascension" projekts satur $1927$ koda rindiņas, bet kas parādija, ka "Maze Ascension" projekts satur $1927$ koda rindiņas, bet
saistītā "hexlab" bibliotēka -- $979$ rindiņas, kopā veidojot $2906$ loģiskās koda saistītā "hexlab" bibliotēka -- $979$ rindiņas, kopā veidojot $2906$ loģiskās koda
rindiņas, neiekļaujot tukšās rindiņas un komentārus (sk. @fig:tokei-maze-ascension[] rindiņas, neiekļaujot tukšās rindiņas un komentārus (sk. @tokei-maze-ascension[]
un @fig:tokei-hexlab[pielukumus]). un @tokei-hexlab[pielikumus]).
Saskaņā ar QSM etalontabulu "Business Systems Implementation Unit (New and Saskaņā ar QSM etalontabulu "Business Systems Implementation Unit (New and
Modified IU) Benchmarks", pirmās kvartiles projekti ($25%$ mazākie no $550$ Modified IU) Benchmarks", pirmās kvartiles projekti ($25%$ mazākie no $550$
biznesa sistēmu projektiem) vidēji ilgst $3,2$ mēnešus, ar vidēji $1,57$ biznesa sistēmu projektiem) vidēji ilgst $3.2$ mēnešus, ar vidēji $1.57$
izstrādātājiem un mediāno projekta apjomu -- $1889$ koda rindiņas. izstrādātājiem un mediāno projekta apjomu -- $1889$ koda rindiņas.
Ņemot vērā, ka projekta autors ir students ar ierobežotu pieredzi, tiek Ņemot vērā, ka projekta autors ir students ar ierobežotu pieredzi, tiek
izmantota pirmās kvartiles $50%$ diapazona augšējā robeža -- $466$ rindiņas izmantota pirmās kvartiles $50%$ diapazona augšējā robeža -- $466$ rindiņas
@ -1970,19 +2117,8 @@ Projekta turpmākās attīstības iespējas ietver:
"bibliography.yml", "bibliography.yml",
) )
#heading("Pielikumi", numbering: none) #include "attachments.typ"
#figure(
caption: [Tokei rīka rezultāts "Maze Ascension" spēlei],
image("assets/images/tokei/maze-ascension.png"),
) <tokei-maze-ascension>
#figure(
caption: [Tokei rīka rezultāts "hexlab" bibliotēkai],
image("assets/images/tokei/hexlab.png"),
) <tokei-hexlab>
// #include "code.typ" // #include "code.typ"
#include "doc.typ" #include "doc.typ"
#pagebreak() #pagebreak()

View File

@ -142,54 +142,6 @@
) )
} }
#let entity-table(
caption: "",
id: (),
..items,
) = {
if id == () {
id = (
"id",
"serial8",
"primary key, not null",
"Unikālais identifikators",
)
}
return figure(
caption: caption,
kind: table,
tablex(
columns: (4cm, 3cm, auto, auto),
repeat-header: true,
/* Header */
[*Lauks*],
[*Datu tips*],
[*Lauka atribūti*],
[*Apraksts*],
..entity-table-row(..id), // id row
..for i in range(items.pos().len(), step: 4) {
entity-table-row(..items.pos().slice(i, i + 4))
},
),
)
}
#let hyperlink-source(
author,
title,
link_str,
date,
) = {
if link_str == "" {
[#author #title Aplūkots #date.display("[day].[month].[year]")]
} else {
[#author #title Pieejams: #link(link_str) aplūkots #date.display("[day].[month].[year]")]
}
}
#let codeblock(filename, lang) = { #let codeblock(filename, lang) = {
raw( raw(
read(filename), read(filename),
@ -198,10 +150,6 @@
) )
} }
#let red(body) = {
text(body, fill: rgb(255, 0, 0))
}
#let components-table( #let components-table(
caption: str, caption: str,
..body, ..body,
@ -252,3 +200,46 @@
), ),
) )
} }
#let test-table(
caption: "",
..items,
) = {
if caption == "" {
caption = items.pos().first()
}
return longtable(
titles: (
"Testa gadījuma nosaukums",
"Testa identifikators",
"Apraksts",
"Soļi",
"Sagaidāmais rezultāts",
"Faktiskais rezultāts",
),
caption: caption,
..items,
)
}
#let entity-table-row(
..items,
) = {
(
items.pos().at(0),
upper(
raw(
items.pos().at(1),
block: false,
),
),
upper(
raw(
items.pos().at(2),
block: false,
),
),
items.pos().at(3),
)
}