ãã¹ãããã¹ãããæ¹æ³-ãã¥ã¼ãã¼ã·ã§ã³ãã¹ã- #gadvent
ã¯ããã«
ããã¯G* Advent Calendarã®12æ¥ç®ã®è¨äºã§ããä»æ¥ã¯ãã¥ã¼ãã¼ã·ã§ã³ãã¹ãã«ã¤ãã¦æ¸ãã¾ããææ¥ã¯id:nobusue ããã§ãã
æ¦è¦
PITã¨ãããã¼ã«ã®ç´¹ä»ã§ãããJavaãããã¯ãã³ã¼ããæ©æ¢°çã«å¤æ´ãã¦ãããã¹ããå®è¡ããã¨ãã«ããã¹ãã¯ãããæ¤ç¥ã§ããã®ãï¼ãã¨ãããã¨ã調ã¹ã¦ããããã¼ã«ã§ãSpockã®ãã¹ããGradleããã®å®è¡ã«å¯¾å¿ãã¦ãã¾ãã
ãã¥ã¼ãã¼ã·ã§ã³ãã¹ã
ãã¥ã¼ãã¼ã·ã§ã³ãã¹ãã¨ã¯ãã£ããã¨è¨ãã°ããããã¯ãã³ã¼ããå¤æ´ãããªãããã®æ¯ãèããå¤ããã¯ãããã¹ãã¯ãã®å¤æ´ãããæ¯ãèããç¶²ç¾ ã§ãã¦ãããã調ã¹ããã¨ãããã¹ãã§ãã
対象è¦æ¨¡ãå°ãããã°æåã§æ¯åãã£ã¦ãããããã§ããã©ããã¼ã«åããã¦ããã¨æ¥½ãªãã¨ãã®ä¸ãªãã§ããã¨ãããã¨ã§ãä»åã¯Javaãããã¯ãã³ã¼ãããã¥ã¼ãã¼ãããã©ã¤ãã©ãªã§ããPITã«ã¤ãã¦ç´¹ä»ãã¾ãã Groovyã¢ããã³ããªã®ã¯ããGradleã¨Spockã«å¯¾å¿ãã¦ãããããã¨ããçç±ãããã§ããï¼ç¡çç¢çã ï¼
ã³ã¼ãã«ãã¬ãã¸ãããã¥ã¼ãã¼ã·ã§ã³ãã¹ããä¿¡ããã¹ãçç±
ä¸è¨ã®èª¬æã ãã§ã¯ã³ã¼ãã«ãã¬ãã¸ã§ãä¸ç·ãããªãã®ï¼çµå±ã©ã®ç¨åº¦ãã¹ãããã¦ããããªãã§ããï¼ã¨æãããããããã¾ããããã³ã¼ããã¼ã¹ã«å¯¾ããã«ãã¬ãã¸ã使ãã®ã§ããã°ããã¥ã¼ãã¼ã·ã§ã³ãã¹ãã®ã»ããããã§ããããçç±ã¯ãC1ã«ãã¬ãã¸ã§ã¯å¢çå¤ã¯ãã¹ãã§ããªããåå¤ã¯ã©ã¹å ã®ããããããã¹ãããã¦ããã°ååã ããã ããã¥ã¼ãã¼ã·ã§ã³ãã¹ãã¯éå®çã ãå¢çå¤ããã¹ãã§ãããä¾ãã°>ã>=ã«å¤æ´ãã¦ãã¹ãã失æããããè¦ã¦ããããã ããã¨ããã¨ããã§ãã
PIT
- å ¬å¼ãã¼ã¸ï¼PIT Mutation Testing
- ãªãã¸ããªï¼hcoles/pitest · GitHub
PITã®ãã¡ãã«ã©ã®ãããªãã¥ã¼ãã¼ããããããè¼ã£ã¦ãã¾ããâ Mutation operators
ããã©ã«ãã§ç¡å¹ã«ãªã£ã¦ãããã¥ã¼ãã¼ããããã¾ãã
PITãé¸ãã ã®ã¯ãç¾å¨ãæ´»çºã«éçºãç¶ç¶ããã¦ããããGradle, Spring-Bootã«å¯¾å¿ãã¦ãããã¨ããã®è¾ºã§ãã ä»ã«ããã°ãããç¹ã¯å¤ã ããã®ã§ãããã©ãã ï¼ãã°ãããã ãï¼ã£ã¦èª¬æåºæ¥ãã ãã®ã¹ãã«ãããã¾ããããã¼ããã
ãµã³ãã«ãªãã¸ããª
kyon-mm / pit-example — Bitbucket
使ãæ¹
build.gradleã«æ¬¡ã®ããã«æ¸ã足ãã¾ãããã¨ã¯gradle pitestã¨å®è¡ãããããã¥ã¼ãã¼ã·ã§ã³ãã¹ããå®è¡ããã¦ãHTMLã®ã¬ãã¼ããåºåããã¾ãã
plugins { id "info.solidsoft.pitest" version "1.1.1" } // ä»ã®è¨å®ãããï¼ããã§ã¯å²æï¼ pitest { targetClasses = ['org.kyonmm.*'] // ãã¥ã¼ãã¼ã·ã§ã³å¯¾è±¡ããã±ã¼ã¸ã®æå® pitestVersion = "1.1.2" // pitestã®ãã¼ã¸ã§ã³æå® threads = 4 // å®è¡ã¹ã¬ããæ°æå® outputFormats = ['XML', 'HTML'] // ã¬ãã¼ããã¡ã¤ã«ã®æå® }
ä¾ã¯FizzBuzzããã¹ããã¦ãã¾ããã³ã³ã¹ãã©ã¯ã¿ä»¥å¤ã¯ãã¥ã¼ãã¼ã·ã§ã³ã®ã«ãã¬ãã¸ã100%ã«ãªã£ã¦ãã¾ãã
ã³ã³ã½ã¼ã«
â pit-example gradle pitest Parallel execution is an incubating feature. :compileJava UP-TO-DATE :compileGroovy UP-TO-DATE :processResources UP-TO-DATE :classes UP-TO-DATE :compileTestJava UP-TO-DATE :compileTestGroovy :processTestResources UP-TO-DATE :testClasses :pitest 7:54:58 PIT >> INFO : Verbose logging is disabled. If you encounter an problem please enable it before reporting an issue. 7:54:58 PIT >> INFO : SLAVE : objc[45721]: Class JavaLaunchHelper is implemented in both /Library/Java/JavaVirtualMachines/jdk1.8.0_05.jdk/Contents/Home/jre/bin/java and /Library/Java/JavaVirtualMachines/jdk1.8.0_05.jdk/Contents/Home/jre/lib/libinstrument.dylib. One of the two will be 7:54:58 PIT >> INFO : SLAVE : used. Which one is undefined. 7:54:58 PIT >> INFO : Sending 2 test classes to slave 7:54:58 PIT >> INFO : Sent tests to slave 7:54:59 PIT >> INFO : SLAVE : 7:54:59 PIT >> INFO : Found 2 tests 7:54:59 PIT >> INFO : SLAVE : 7:54:59 PIT >> INFO : Dependency analysis reduced number of potential tests by 0 7:54:59 PIT >> INFO : SLAVE : 7:54:59 PIT >> INFO : 2 tests received /- 7:55:00 PIT >> INFO : Calculated coverage in 1 seconds. 7:55:00 PIT >> INFO : Created 1 mutation test units stderr : objc[45722]: Class JavaLaunchHelper is implemented in both /Library/Java/JavaVirtualMachines/jdk1.8.0_05.jdk/Contents/Home/jre/bin/java and /Library/Java/JavaVirtualMachines/jdk1.8.0_05.jdk/Contents/Home/jre/lib/libinstrument.dylib. One of the two will be stderr : used. Which one is undefined. / 7:55:01 PIT >> INFO : Completed in 3 seconds ================================================================================ - Timings ================================================================================ > scan classpath : < 1 second > coverage and dependency analysis : 1 seconds > build mutation tests : < 1 second > run mutation analysis : 1 seconds -------------------------------------------------------------------------------- > Total : 3 seconds -------------------------------------------------------------------------------- ================================================================================ - Statistics ================================================================================ >> Generated 14 mutations Killed 14 (100%) >> Ran 14 tests (1 tests per mutation) ================================================================================ - Mutators ================================================================================ > org.pitest.mutationtest.engine.gregor.mutators.ConditionalsBoundaryMutator >> Generated 2 Killed 2 (100%) > KILLED 2 SURVIVED 0 TIMED_OUT 0 NON_VIABLE 0 > MEMORY_ERROR 0 NOT_STARTED 0 STARTED 0 RUN_ERROR 0 > NO_COVERAGE 0 -------------------------------------------------------------------------------- > org.pitest.mutationtest.engine.gregor.mutators.ReturnValsMutator >> Generated 4 Killed 4 (100%) > KILLED 4 SURVIVED 0 TIMED_OUT 0 NON_VIABLE 0 > MEMORY_ERROR 0 NOT_STARTED 0 STARTED 0 RUN_ERROR 0 > NO_COVERAGE 0 -------------------------------------------------------------------------------- > org.pitest.mutationtest.engine.gregor.mutators.MathMutator >> Generated 3 Killed 3 (100%) > KILLED 3 SURVIVED 0 TIMED_OUT 0 NON_VIABLE 0 > MEMORY_ERROR 0 NOT_STARTED 0 STARTED 0 RUN_ERROR 0 > NO_COVERAGE 0 -------------------------------------------------------------------------------- > org.pitest.mutationtest.engine.gregor.mutators.NegateConditionalsMutator >> Generated 5 Killed 5 (100%) > KILLED 5 SURVIVED 0 TIMED_OUT 0 NON_VIABLE 0 > MEMORY_ERROR 0 NOT_STARTED 0 STARTED 0 RUN_ERROR 0 > NO_COVERAGE 0 -------------------------------------------------------------------------------- BUILD SUCCESSFUL Total time: 8.111 secs
ã¬ãã¼ãã®HTML
ä¾ãã°ã1<=number<=100ã®å¢çå¤ããã¹ãããã¦ããªãå ´åãã¤ã¾ããä¾å¤ãæãããããã¨ã確èªãããã¹ãã-10ã¨200ã ãã使ã£ã¦ããããä»ã®ãã¹ãã«ããã¦ã2ãã98ãããã®éã§ãããã¹ããæ¸ãã¦ããªãå ´åã¯ãããªã¬ãã¼ãã«ãªãã¾ããã«ãã¬ãã¸ãæ¸ã£ã¦ãã¾ããã
使ãã©ãã
ãã¡ãããããã§å®ç§ã«å¢çå¤ããã¹ããã¦ããã¨ã¯è¨ããªãããã§ãããåç´ã«ã³ã¼ãã«ãã¬ãã¸ã§C1ã¨ãããã¯ä¿¡é ¼ã®ãããæ°åã§ãåãæã使ãã©ããã¯åºæ¬çã«2ã¤ããã¾ãã
- ç¾å¨ã®ãã¹ãããããã¯ãã³ã¼ãã®ä»æ§åã«ã©ã®ç¨åº¦è²¢ç®ãã¦ããããç¥ã
- ãã¹ãã³ã¼ããå¤æ´ããã¨ãã®ç¢ºèª
C1ã«ãã¬ãã¸ãã©ãããã£ã¦è¨ã£ãã¨ãã«è¨ããã®ã¯ãããã£ã½ããã¹ããæ¸ãããã¨ããããããªã®ã§ãå°ãªãã¨ãããå°ãæ©æ¢°çã«ãå¢çå¤åæããã®ããªãï¼ãã¨ãããã¨ãå ¨ä½ãã¬ãã¥ã¼ããªããããã¨ãã®å½ãããã¤ããã®ã«ã便å©ã§ãã
ãã¹ãã³ã¼ããå¤æ´ããã¨ãã«ãã¾ãã¯ãã¥ã¼ãã¼ã·ã§ã³ã«ãã¬ãã¸ã100%ã«ãã¦ããããããä¿ããã¦ããäºã確èªããªããè¡ãã¨ãã¹ãã³ã¼ãã¸ã®ãã°æ··å ¥ãå°ãªããªãã¾ãã
ã¾ã¨ã
ããããªè¨èªã§ã®ãã¥ã¼ãã¼ã·ã§ã³ãã¹ããã¼ã«ããã£ã¨å¢ãããï¼åãï¼ããããã§ããåè¨èªã®ASTãããã®ã好ããªäººã¯ãããã£ããã¼ã«ãå®è£ ããã®ã楽ããã¨æãã¾ããï¼