Quick Commit Statistics
Greg Young a How to get productive on your first day előadásában bemutatott pár olyan eszközt, amivel gyorsan rá lehet mutatni, hol is van a probléma a kódban. mint független konzulens, aki csak rövid ideig dolgozik egy-egy projekten szükségszerűen nagyon hatékonyan rá kell tapintania a gyenge pontokra, hogy a legnagyobb hatással legyen. (Érdemes megnézni, hiszen nagyon jó eszközöket mutat be)
De nem csak technikai, de menedzsment oldalról is érdekesek az egyszerű és mégis hatásos statisztikáknak. De ne felejtsük el:
Minden metrika, kimutatás és statisztika alkalmatlan, hogy abszolút mértékben minősítse a projektet vagy az embereket, de segít rámutatni a gyenge pontokra.
Ebből az elgondolásból egy fél ebédidőben összedobtam egy gyors kis kimutatást:
Fogd a legutolsó 1000 svn commit-tot és ha abban volt Java file, akkor nézd meg, hogy milyen arányban volt olyan file commit is, amit tartalmazott Test-et.
Fapadosan egyszerű és elképesztően könnyű átrázni. De főleg ennek ismeretében lehetnek rémületesek az eredmények. Például az mostani projektemen a következő eredményeket adja (persze nem említve, kik az érintettek):
- otakacs: 55.63% (158 / 284)
- xxxxxxxxxxx: 45.6% (57 / 125)
- ccccccccccc: 26.47% (9 / 34)
- vvvvvvvvvvv: 7.4% (2 / 27)
- bbbbbbbbbbb: 2.32% (3 / 129)
- nnnnnnnnnnn: 0.0% (0 / 10)
És ez valami döbbenetes volt. Részben azért, mert saját magamról sokkal magasabba értéket vártam volna el (55.63% - a részletese vizsgálat alapján kiderült, hogy az utóbbi időben sok PDF generáló munkát csináltam, amit még nem tudok, hogyan lehetne automatizálni, de akkor is…)
Másik ledöbbenés, hogy a csapat többi része milyen nagyvonalúan ignorálja az automatizált teszteket. Amint alaposabban utánajártam azok a kis test módosítások is inkább abból fakadtak, hogy ha egy módosítás miatt nem fordult a teszt, akkor minimális szinten adaptálták a kódot. De a nem írtak új teszteket a módosításokhoz.
Magyarán a csapat nagy része, még csak nem is gondolkozik automatizált tesztekben.
Tudnál ezzel az adattal mit kezdeni a saját projektedben? Akkor íme (Groovy, svn log xml format input):
1def log = new XmlParser().parseText(new File(/last1000log.xml/).getText()) 2def logentries = log.logentry 3println logentries.size() 4 5def allJavaCommits = [:] 6def javaCommitsWithTest = [:] 7def allCommit = [:] 8 9for(logentry in logentries){ 10 String author = logentry.author.text() 11 allCommit[author] = allCommit.get(author,0)+1 12 def paths = logentry.paths.path*.text() 13 if(ends(paths,"java")){ 14 allJavaCommits[author] = allJavaCommits.get(author,0)+1 15 } 16 if(ends(paths,"java") && cont(paths,"Test")){ 17 javaCommitsWithTest[author] = javaCommitsWithTest.get(author,0)+1 18 } 19} 20 21def ends(List<String> paths, String ending){ 22 for(p in paths){ 23 if(p.endsWith(ending)){ 24 return true 25 } 26 } 27 return false 28} 29 30def cont(List<String> paths, String ending){ 31 for(p in paths){ 32 if(p.contains(ending)){ 33 return true 34 } 35 } 36 return false 37} 38 39println allCommit 40println allJavaCommits 41println javaCommitsWithTest 42 43allJavaCommits.each {developer,java -> 44 def test = javaCommitsWithTest.get(developer,0) 45 double percent = (test/java)*100 46 println "${developer}: ${percent.trunc(2)}% (${test} / ${java})" 47}