System testing & Static Analysis 2nd Report Team #1 200711460 이상열 200711470 정재호 201111344 김재엽 201211350 박주광
Contests 1. System Testing 2. Static Analysis I. Eclipse TPTP II. Sonar A. Introduction B. Sonar Report C. Analysis D. Result
1. System Testing System Testing Result #1 Test Case No. 203 현재보여지는화면만잘라내어저장하는현상으로보여진다. 아래앞서 < 원본그림 > 은 9999x9999 규격으로저장한 파일이며오른쪽 < 저장 1> 과 < 저장 2> 는프로그램을사용 < 원본그림 > 을불러서프로그램창의크기를다르게 하여저장기능을수행한것이다. System Testing Result #2 Test Case No. 301, 302, 303
특정작업 ( 연필, 지우개, 페인트 ) 을수행하면화면이아래로내려가는현상 System Testing Result #3 Test Case No. 304 텍스트입력시왼쪽위편에텍스트색상과같은색상의점발생
2. Static Analysis Eclipse TPTP Analysis #1 ( 도형그리기 ) 실제코드와문서상 method 의이름이맞지않음
문서상의 method 기능과실제간차이발생 Analysis #2 ( 연필그리기 )
마우스 press 와 dragged 부분만정의되어있고 release 부분은정의되어있지않음 Analysis #3 ( 게임시작하기 )
ShowSketch 이후에 getsketch 가시작되지만문서상에는이와같이표현되어있지않음 Analysis #4 ( 채점하기 ) 문서상에 TextFileI/O 가빠져있음
LoadText 시에도 loop 가돌게되어있는데표현이안됨. 밑의기능은 loop 가돈다는것을명시했는데, 이러한 표기법에서통일성이요구됨 SaveText 역시 LoadText 와통일하게표기법의통일성이요구됨
2. Static Analysis SONAR 1. Introduction I. Purpose Introduction을통해 Sonar 에서제공하는 Report의기본용어들을설명하고, Sonar Report를통해분석대상을설정한다. 그리고 Analysis 에서는 Sonar Report에서설정한대상을분석하고, 해당문제를해결할방안을제시한다. II. How to access sonar i. http://server.brainguys.net:9000/ 다음주소로접속. ii. Projects 에서해당프로젝트 (team1) 를클릭하여분석결과화면 (Dashboard) 으로이동한다. iii. 다음화면과같이분설결과화면 (Dashboard) 을확인할수있음. III. Metric Definition( 용어설명 ) i. Lines of code 해당프로젝트의총라인수를의미하며, sonar에서사용하는모든단위의기본이된다. 예를들어뒤에나올 Duplications( 중복 code) 에서중복된라인수와그라인수가전체프로젝트에서차지하는비율을나타낸다. Statements는예를들어 if, while, for문과같이 JAVA language specification상에서 statements 로정의된구문의개수를의미한다.
ii. iii. iv. Class 클래스의개수를의미한다. Sonar에서는 function을 Method와 Accessor로구분하는데 Accessor는해당클래스에접근할수있는함수들 (ex: setter, getter) 를의미하고 Method는그외의함수들을의미한다. Comments 주석의비율및라인수를나타낸다. Documented API는라이브러리상에선언된주석을의미하며, Undocumented API는개발자가임의로삽입한주석을의미한다. Duplication 중복된소스코드에대해라인수와블록수, 그리고해당중복이일어나파일개수를나타내어준다. 변수에대해서는변수의 Type만구분하고변수의값이같은것은체크하지않는다. v. Complexity If, for, while, case, catch, throw, return, &&,,? 등과같은 Keyword가나타나면 count를올려서 complexity를측정한다. 우측의막대그래프는복잡도에따른 Method또는 file, Class의분포도를보여준다. vi. vii. Violation 주로 code quality와관련된내용들로서 5단계의 severity( 심각도 ) 로나누어보여준다. Code standard와관련된규칙들로가독성과유지보수에도움이될수있기때문에, 해당규칙에대해고려해볼수있다. Coverage Unit test를통한 coverage를나타내며, Jacoco나 Clover와같은 coverage툴을이용하여측정한다. 앞에서이야기한것처럼 Sonar는기본단위가라인수이므로주석이나빈공간도 coverage 비율에포함한다. 그래서실제 coverage보다조금낮게나오기도하므로주의해서보아야한다. 2. Sonar Report I. Purpose Sonar Report를통해 Analysis대상을미리제시하여본문서를읽는사람이통일된주제에초점을맞추고, Analysis에대한근거를미리제시한다. II. Duplication i. 총 3 부분에서 Duplication 이발생하였으며, 해당 Duplication 이발생한지점을 screen shot 과번호를붙 여제시하였다. ii. Number: D001 File: Interface.java Class: interface Method: public void DrawShapeReleased(MouseEvent arg0)
다음두 Duplication 는해당 Method 에서발생하여서하나의 Duplication 으로묶었다. iii. Number: D002 File: Interface.java Class: interface Method: public void Fill_Color(MouseEvent arg0), public void Load() 다음두 Method File_color 와 Load 에서 Duplicaion 이발생하였다. iv. Number: D003 File: Interface.java Class: interface Method: public void ShowSketchWin(),public void ShowScoreWin()
다음두 Method ShowSketchWin 과 ShowScoreWin 에서 Duplication 이발생하였다. III. Coverage 위의 Coverage는 Unit test에대한 Coverage를나타낸다. Coverage의경우다음과같이 Unit test가진행된부분과진행되지않은부분을녹색라인과빨간색라인으로구분하여보여주는것을확인할수있다. IV. Violation i. Violation은 Code Standard에맞추고자하는데그목적이있으며, 해당 violation이발생한지점의개수와 rule name, 번호를붙여제시하였다. ii. Dashboard 아래의 Hotspots 을클릭후 violated rules 의 more button 을누르면 violation 에대한정보를 한눈에볼수있다.
iii. 해당 violation 을클릭하면 violation 이발생한지점을확인할수있다. iv. 이뒤로부터 Severity에따라 Violation을구분하여 violation rule에대한설명과번호를붙였다. v. Severity: Major (V001 ~ V027) Violation 발생개수 : 250 1. Number: V001 Name: Method Name Number of violation: 41 Description: ^[a-z][a-za-z0-9]*$ Method의이름을다음정규식에따라작성할것을요구하는 rule 이다. 시작은 [a-z] 의소문자로시작하여그뒤로 [a-za-z0-9] 영어숫자를쓸것을권유한다. 2. Number: V002 Name: Local Variable Name Number of violation: 35
Description: ^[a-z][a-za-z0-9]*$ 지역변수의이름을이름을다음정규식에따라작성할것을요구하는 rule이다. 시작은 [a-z] 의소문자로시작하여그뒤로 [a-za-z0-9] 영어숫자를쓸것을권유한다. 3. Number: V003 Name: Loose coupling Number of violation: 31 Description: 해당프로젝트에서사용하는 ArrayList 와같은 implementation type이아닌 interface를사용할것을권유한다. 4. Number: V004 Name: If Else Stmts Must Use Braces Number of violation: 27 Description: if else 구문을중괄호 ( {,}) 와함께사용할것을권장한다. 5. Number: V005 Name: String Literal Equality Number of violation: 24 Description: 문자열비교는 == 이아니라 equals() 를이용할것을권장한다.( 문자열비교함수사용을권장한다는의미로해석됩니다.) 6. Number: V006 Name: Visibility Modifier Number of violation: 13 Description: Protected로선언된변수들을 Private으로선언하고 accessor(setter, getter) 등으로접근할수있도록만들것을권장한다. 7. Number: V007 Name: If Stmts Must Use Braces Number of violation: 9 Description: if 구문을중괄호 ( {,}) 와함께사용할것을권장한다. 8. Number: V008 Name: Avoid Print Stack Trace Number of violation: 9 Description: printstacktrace() 대신에 logger call을사용할것을권장한다.(java 에서제공하는 class 중 Logger라는클래스에대한것으로보입니다. 메시지가발생시간을관리하는클래스로보이니다.) 9. Number: V009 Name: Member name Number of violation: 9 Description: ^[a-z][a-za-z0-9]*$ 멤버변수의이름을이름을다음정규식에따라작성할것을요구하는 rule이다. 시작은 [a-z] 의소문자로시작하여그뒤로 [a-za-z0-9] 영어숫자를쓸것을권유한
다. 10. Number: V010 Name: Integer Instantiation Number of violation: 7 Description: instantiating Integer objects 대신에 Integer.valueOf() 사용할것을권장한다. 11. Number: V011 Name: Hidden Field Number of violation: 6 Description: 해당변수나클래스가 filed를감추어서발생한다. ( 정확하게무엇을의미하는지는모르겠으나간략하게조사해본결과, Hidden filed는보안상취약점이될수있다고합니다. 그래서이러한부분을줄일것을권유하는것같습니다.) 12. Number: V012 Name: Anon Inner Length Number of violation: 5 Description: Inner class의길이가최대길이로설정된 20보다길다. (class 내부에선언된다른 class 의정의가길어서발생하는거같습니다. Complexity에는방영되지않으나 class의규모가필요이상으로커지는것을막기위해, inner class의길이를줄이것을권유하는것같습니다.) 13. Number: V013 Name: Parameter Name Number of violation: 5 Description: ^[a-z][a-za-z0-9]*$ Parameter의이름을이름을다음정규식에따라작성할것을요구하는 rule이다. 시작은 [a-z] 의소문자로시작하여그뒤로 [a-za-z0-9] 영어숫자를쓸것을권유한다. 14. Number: V014 Name: Avoid Duplicate Literals Number of violation: 5 Description: 특정문자열 (ex: 게임시작, 지우개 ) 등이여러번나타난다. 15. Number: V015 Name: Local Final Variable Name Number of violation: 3 Description: ^[a-z][a-za-z0-9]*$ final로선언된지역변수들의이름을이름을다음정규식에따라작성할것을요구하는 rule이다. 시작은 [a-z] 의소문자로시작하여그뒤로 [a-za-z0-9] 영어숫자를쓸것을권유한다. 16. Number: V016 Name: Cyclomatic Complexity Number of violation: 3
Description: 해당 Method들의 Cyclomatic Complexity이 20이상으로나타나므로이를줄여야한다. ( Cyclomatic Complexity은위에서서술한것처럼 compelxity를측정하는한지표이다.) 17. Number: V017 Name: For Loops Must Use Braces Number of violation: 3 Description: for 루프문의중괄호 ({,}) 와함께사용할것을권장한다. 18. Number: V018 Name: Simplify Boolean Expression Number of violation: 3 Description: 좀더간단히표현할수있는항목들을보여준다. 19. Number: V019 Name: Ncss Method Count Number of violation: 2 Description: Ncss가최대길이 (50) 을넘어갔을때발생한다. ( NCSS는 Not Commented Source Statements 로일정길이이상 (50) 주석이달리지않은 Method에대해서만발생합니다.) 20. Number: V020 Name: Unused local variable Number of violation: 2 Description: 사용되지않는지역변수들을보여준다. 21. Number: V021 Name: Use Index Of Char Number of violation: 2 Description: String.indexOf(char) 가 String.indexOF(String) 보다빠르므로이를사용할것을권장한다. 22. Number: V022 Name: Avoid commented-out lines of code Number of violation: 1 Description: // 다음과함께사용된주석의사용을제지할것을요구한다. 23. Number: V023 Name: Constructor Calls Overridable Method Number of violation: 1 Description: Overridable Method인함수 SelectFileColor 가 Object 생성중에호출되는것을지적하는부분이다. 24. Number: V024 Name: Parameter Assignment Number of violation: 1
Description: Parameter로선언된변수에다시값을넣지않는것을권유한다. 25. Number: V025 Name: Unnecessary Local Before Return Number of violation: 1 Description: return이되는 local변수를굳이 return하지않고내부에서저장할것을권유한다. 26. Number: V026 Name: Ncss Type Count Number of violation: 1 Description: NCSS가최대길이를넘어간경우발생한다.( 위에서나왔던것과마찬가지로 NCSS가일정길이 ( 이경우에는 Method가아니라 file을체크하므로 200) 이상넘게되면발생합니다.) 27. Number: V027 Name: Unused Private Field Number of violation: 1 Description: 사용하지않는 private 선언부를지울것을권장한다. vi. Severity: Minor (V028~V030) Violation 발생개수 : 220 1. Number: V028 Name: Magic Number Number of violation: 161 Description: 개발자가임의로설정한수치를의미한다. 2. Number: V029 Name: Trailing Comment Number of violation: 38 Description: 코드가끝나는줄에 // 주석 다음과같이주석이들어가는것을찾아낸다. 3. Number: V030 Name: Singular Field Number of violation: 21 Description: 지역변수로선언될수있는 private 멤버들을찾아낸다. vii. Severity: Info (V031) Violation 발생개수 : 2 1. Number: V031 Name: Unused Imports Number of violation: 2 Description: 참조하지않는라이브러리들을찾아낸다.
3. Analysis I. Purpose Sonar Report에서제시한 Analysis 대상을분석하여건의사항과그근거를제시하여, 프로젝트의완성도를높인다. II. Duplication i. D001 이 Duplication의경우주로도형과관련된 class의변수를설정하거나출력하는부분으로보인다. 따라서각도형클래스내부에해당속성들의설정해주는 Method를만들어주거나, 또는 interface 클래스에해당도형의속성을설정해주는 Method를만들어주는방법들이있을것이다. 다만, Method를만들어줌으로써가독성이떨어지거나복잡도가올라갈수있으므로, 개발자에재량에따라적절한방법을취할것을권유한다. ii. iii. D002 D001의 Duplication과마찬가지로비슷한동작을하는부분이잡혀있다. 위와같은방법으로해결할수있다. D003 D001의 Duplication과마찬가지로비슷한동작을하는부분이잡혀있다. 위와같은방법으로해결할수있다. III. Coverage i. Coverage가 1.8% 밖에안되어 coverage가상당히낮아보이지만, 실질적으로 accessor(setter, getter) 는굳이 Unit test를거치지않아도괜찮으며, 주석이나변수선언부또한 coverage비율에포함되므로 coverage가낮게나오는것은큰문제가아니라고볼수있다. 다만, PaintGame.java의 public void CalculateScore(BufferedImage d_img, String filename) 의경우 System testing에서도정확한수치를확인할방법이없었으므로 unit test를한번거쳐보는것이좋을것같다. IV. Violation i. Violation의경우프로젝트가실행되는 logic을고려하지않고, 단순히 code standard를지키기위해제시된다. 따라서, 실제로프로그램이어떻게돌아가는지에따라 violation rule어기게되더라도큰문제는되지않는다고볼수있다. 다만, 유지, 보수및 source code공유를고려한다면, V001이나 V004와같은부분들도고려해보아야한다. 밑에나열하는 violation은다음과같은취지에서선정해본것들이다. ii. V006, V011, V023: 다음 violation들은보안과관계된부분이므로수정해볼수있다. iii. V012, V018, V021: 다음 violation 들을지킴으로써프로그램의효율성을올릴수있으므로수정해볼수 있다.
4. Result I. Sonar를통해서얻은결과들은 System testing처럼오류를잡아내어수정할것을요구하지않는다. 위의분석결과와같이효율성이나보안등과같이프로그램의 quality를높이는데사용할수있는결과들을제공한다. 따라서, 해당결과들을무조건수용하지않고재량에맞게선택적으로수용해야한다. II. Duplication 의경우위에서말한것처럼 duplication 을줄임으로써발생하는 Trade-off 를고려하여 code 수 정을해야한다. III. Coverage의경우도실제수치보다 Unit test가거쳐가야할만한부분을찾아내 Unit test를거치는것이바람직하다. IV. Violation의경우, Source code의가독성과유지및보수에관련된부분들이많으므로, 되도록이면지킬수있도록하는것이바람직하다.