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):

É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}
Nov 03, 2013
comments powered by Disqus

Links

Cool

RSS