Ik ben steeds meer fan van Unit-tests (ik doe alleen meestal niet aan testen maken voor code schrijven). Nu loop ik tegen het volgende aan: met Unit-tests test je alleen de werking voor je API/public-methoden.
Nu wil ik soms ook mijn eigen algoritmes in kleinere stapjes testen en zoek ik naar de beste methode hiervoor.
Neem bijvoorbeeld (berekent een absoluut verschil in kortste afstand vanaf de oorsprong waarbij je alleen links/rechts en beneden/boven mag gaan)
Ik wil hierin elk 'blokje' tussen regels commentaar testen.
De oplossingen die ik bedacht heb (en eventueel waarom ik die niet wil):
1 De code opsplitsen in losse functies en die public maken zodat je ze kan testen.
Mijn bezwaren:
- ik wil niet dat mijn onderdelen los gebruikt kunnen worden door anderen
- mijn algoritme is mentaal moeilijker te volgen
2 Via Aspect Oriented Programming (AOP) de data bewerken voor (zo wordt soms ook Fault-injection gedaan) en bekijken na een blokje code.
Via Aspect Oriented Programming lijkt mij wel een goed idee; zeker als ik dit stop in een Unit-test. Ik kan alleen amper wat over vinden over testen via AOP en ook de frameworks voor AOP zelf zijn schaars (zeker voor C#).
De vraag is dan ook: hoe testen jullie de interne werking van eigen algoritmes? (en als je het via AOP doet: met welk framework en waarom die?)
Nu wil ik soms ook mijn eigen algoritmes in kleinere stapjes testen en zoek ik naar de beste methode hiervoor.
Neem bijvoorbeeld (berekent een absoluut verschil in kortste afstand vanaf de oorsprong waarbij je alleen links/rechts en beneden/boven mag gaan)
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
| Tuple<int, int> item1 = new Tuple<int, int>(2, 5); Tuple<int, int> item2 = new Tuple<int, int>(7, 4); int res = MyAlgorithm(item1, item2); public int MyAlgorithm(Tuple<int, int> item1, Tuple<int, int> item2) { // define constants int[] min = { -5, -10 }; int[] max = { 20, 10 }; // input checks Debug.Assert(min[0] <= item1.Item1 && item1.Item1 <= max[0]); Debug.Assert(min[0] <= item2.Item1 && item2.Item1 <= max[0]); Debug.Assert(min[1] <= item1.Item2 && item1.Item2 <= max[1]); Debug.Assert(min[1] <= item2.Item2 && item2.Item2 <= max[1]); // create field int[,] field = new int[max[0] - min[0] + 1, max[1] - min[1] + 1]; // init for (int i = 0; i < field.GetLength(0); i++) { for (int j = 0; j < field.GetLength(1); j++) { if (i > 0 && j == 0) field[i, j] = field[i - 1, j] + 1; else if (j > 0) field[i, j] = field[i, j - 1] + 1; } } // processing int val1 = field[item1.Item1, item1.Item2]; int val2 = field[item2.Item1, item2.Item2]; int res = Math.Abs(val1 - val2); // return return res; } |
Ik wil hierin elk 'blokje' tussen regels commentaar testen.
De oplossingen die ik bedacht heb (en eventueel waarom ik die niet wil):
1 De code opsplitsen in losse functies en die public maken zodat je ze kan testen.
Mijn bezwaren:
- ik wil niet dat mijn onderdelen los gebruikt kunnen worden door anderen
- mijn algoritme is mentaal moeilijker te volgen
2 Via Aspect Oriented Programming (AOP) de data bewerken voor (zo wordt soms ook Fault-injection gedaan) en bekijken na een blokje code.
Via Aspect Oriented Programming lijkt mij wel een goed idee; zeker als ik dit stop in een Unit-test. Ik kan alleen amper wat over vinden over testen via AOP en ook de frameworks voor AOP zelf zijn schaars (zeker voor C#).
De vraag is dan ook: hoe testen jullie de interne werking van eigen algoritmes? (en als je het via AOP doet: met welk framework en waarom die?)
offtopic:
Om het topic ontopic te houden:
De gegeven code is een voorbeeld speciaal voor dit topic. Ik weet dat het met andere algoritmes beter kan. Wijs mij daarom niet op andere algoritmes. Het gaat om het testen van dit of soortgelijke algoritmes (op bepaalde manier opsplitsen oid is wel ontopic)
Ik weet dat sommige mensen het testen van implementatie afkeuren. Overtuig mij niet dat ik dat niet moet doen. Soms kom je situaties tegen zoals in dit voorbeeld waarin je het juist wel wil doen.
Om het topic ontopic te houden:
De gegeven code is een voorbeeld speciaal voor dit topic. Ik weet dat het met andere algoritmes beter kan. Wijs mij daarom niet op andere algoritmes. Het gaat om het testen van dit of soortgelijke algoritmes (op bepaalde manier opsplitsen oid is wel ontopic)
Ik weet dat sommige mensen het testen van implementatie afkeuren. Overtuig mij niet dat ik dat niet moet doen. Soms kom je situaties tegen zoals in dit voorbeeld waarin je het juist wel wil doen.