Software Verification #1 Junit, Eclipse 및빌드환경 Software Verification Team 4 강 정 모 송 상 연 신 승 화 1
Software Verification #1 Junit, Eclipse 및빌드환경 CONTENTS 01 Overall Structure 02 IDE - IntelliJ 03 Build Environment - Gradle 04 Unit Test JUnit 5 05 CI - Jenkins 06 CI Git & GitHub + Jenkins 07 Summary 2
01 Overall Structure IDE (IntelliJ) server code Push webhook CI Server (Jenkins) build BUILD (Gradle) hosting build test BUILD (Gradle) Unit Test (JUnit) 3
02 IDE IntelliJ (IntelliJ vs Eclipse) IntelliJ VS Eclipse 구문분석을통한코드자동완성기능 일반적인자동완성 장점 Eclipse 와비교해상대적으로가벼움 안정적 Project 단위관리 IntelliJ 보다무겁다 Workspace 단위관리 단점 단점 유료 (Ultimate 버전 ) 무료 장점 4
02 IDE IntelliJ (why IntelliJ?) 상당한 IDE의안정성 다양한프로그래밍언어를지원하는많은플러그인제공 디자인 & 개발이쉽게진행가능 프로그램이가벼움 디버깅을위한설정이간단함 코드의자동완성기능이뛰어남 ( 지능적임 ) 5
02 IDE IntelliJ (JDK - Installation) JDK 설치방법 6
02 IDE IntelliJ (JDK - Installation) ORACLE 접속 JDK 다운로드 DOWNLOAD Accept License Agreement 선택 7
02 IDE IntelliJ (JDK - Installation) ORACLE 접속 JDK 다운로드 DOWNLOAD Accept License Agreement 선택 운영체제에맞게설치패키지클릭 Gradle & JUnit 5 를위해서는 JDK 8 버전이상사용해야함 (8 버전사용 ) 8
02 IDE IntelliJ (JDK - Installation) ORACLE 접속 JDK 다운로드 DOWNLOAD Accept License Agreement 선택 운영체제에맞게설치패키지클릭 다운로드된설치패키지클릭 9
02 IDE IntelliJ (JDK - Installation) 상자클릭 10
02 IDE IntelliJ (JDK - Installation) 상자클릭 계속클릭 설치클릭 11
02 IDE IntelliJ (JDK - Installation) 상자클릭 계속클릭 설치클릭 설치완료 12
02 IDE IntelliJ (IntelliJ - Installation) IntelliJ 설치방법 13
02 IDE IntelliJ (IntelliJ - Installation) Download 클릭 14
02 IDE IntelliJ (IntelliJ - Installation) Download 클릭 운영체제선택 & Download 클릭 15
02 IDE IntelliJ (IntelliJ - Installation) Download 클릭 운영체제선택 & Download 클릭 설치파일클릭 아이콘 Applications 로옮김 16
02 IDE IntelliJ (IntelliJ - Installation) OK 클릭 17
02 IDE IntelliJ (IntelliJ - Installation) OK 클릭 UI theme Keymaps Launcher Script, Default & Featured plugins Keymaps UI theme Launcher Script, Default plugins, Featured plugins ( 나중에도설정가능하므로 Next) 18
02 IDE IntelliJ (IntelliJ - Installation) OK 클릭 UI theme Keymaps Launcher Script, Default & Featured plugins 학생계정으로로그인 19
02 IDE IntelliJ (IntelliJ - Installation) OK 클릭 UI theme Keymaps Launcher Script, Default & Featured plugins 학생계정으로로그인 설치완료 20
03 Build Environment Gradle 1) Groovy 언어기반의빌드스크립트를 사용하는오픈소스빌드자동화도구 2) Ant 의 task 구조와 Maven 의 repository 사용가능. Ant 와 Maven 의이점을합침. 3) 빌드성능향상을위해다양한기능제공 4) Plugin 을통한확장성좋음. PMD, Sonar 등의 static analysis tool 을 plugin 의형태로적용할수있음. 21
03 Build Environment Gradle (Maven vs Gradle) Pom.xml 을이용한정형화된빌드시스템 동적인요소인빌드를 정적인 xml 로정의하기어려움. JVM 에서돌아가는 groovy 언어기반 빌드의동적인요소를 프로그래밍언어처럼표현가능. 여러 dependency 를추가할경우 code 가길어지고가독성이떨어짐. xml 에비해 code 가간결함. project 간에종속성이생기면 이를표현해주기가복잡함. project 간에종속성이생기면 상속을통해해결가능. 22
03 Build Environment Gradle (Maven vs Gradle) Build cache, Gradle daemon 같은 기술을사용하여 maven 에비해 Build performance 를개선시킴. 하나의 program을개발하기위해다수의인원이여러번수행하는총 build 횟수를생각하면 performance의개선은상당한이익이됨. 23
03 Build Environment Gradle (Installation) IntelliJ IDE 에서는 Gradle Project 를 바로생성할수있음. 하지만필요에따라다른 version 의 Gradle 을사용할수있음. https://gradle.org/releases/ JDK 7 이상을사용하는대부분의 OS 에 설치가능하며 Groovy Library 를포함하여배포. Groovy Library 를따로설치할필요없음. 24
03 Build Environment Gradle (Installation) 다운로드받은 Gradle file은원하는경로에저장후압축을해제한다. 이후모든경로에서바로접근해사용이가능하도록환경변수등록을해준다. 25
03 Build Environment Gradle (Installation) 26
03 Build Environment Gradle (Installation) 27
03 Build Environment Gradle (Installation) 변수이름및변수값을설정해준다. 변수값에는 Gradle zip 파일을받아압축을해제한경로를설정해준다. 28
03 Build Environment Gradle (Installation) 이후 Path 변수에도경로를추가해준다. 29
03 Build Environment Gradle (Installation) 환경변수설정이끝났으면, Win + R 을눌러실행창을띄우고 cmd를입력해커맨드창을띄운다. gradle version 커맨드를입력해자신이다운로드받은 Gradle의 version이정상적으로나오는지확인한다. 30
03 Build Environment Gradle (Installation) IntelliJ IDE를실행시켜좌측상단메뉴바에서 File Setting 창을띄우고검색창에 Gradle을검색한다. User local Gradle distribution 옵션에체크후 Gradle home 경로를설정해주고 Gradle JVM Version을확인하고 apply를누른다. 31
03 Build Environment Gradle (Gradle project) 32
03 Build Environment Gradle (Gradle project) GroupId : 내 project를모든 project 중에서고유하게식별하게해주는 Id. package 명명규칙을따르며최소한내가 control 할수있는 domain 이름을가져야함. ex) kr.ac.konkuk.dslab, org.apache.maven ArtifactId : 버전정보를생략한 jar 파일의이름을적는다. 단, 소문자로만작성하며특수문자는사용하지않는다. Version : 숫자와. 으로이루어진일반적인 version 형태를사용한다. 33
03 Build Environment Gradle (Gradle project) Use auto-import - 의존성 library 를 자동으로추가해줌. default / local - IntelliJ IDE 내부의 Gradle을사용할것인지, 직접다운받은 version의 Gradle을사용할것인지선택가능. 34
03 Build Environment Gradle (Gradle project) 이후넘어가는창에서좌측하단의 Finish를누르면옆과같은 Gradle project가생성됨. 참고 ) 만약 default Gradle 이아니라 Local Gradle 로선택했을경우 gradle 폴더가없음. 35
03 Build Environment Gradle (Gradle project) Default 가아닐때 gradle 폴더가없음. Default 일때 gradle 폴더가있음. 36
03 Build Environment Gradle (Gradle project) Gradle wrapper? Gradle wrapper는 project를 build할때 gradle/wrapper 디렉토리를생성하고해당디렉토리에 jar을복사함. 이상태로 VCS(Version Control System) 에올리면다른사람들은 java나 Gradle을추가로설치할필요가없어지며, 빌드를하는유저들이모두동일한버전의 Gradle을사용하는것을보장받게됨. 사용권장. 37
03 Build Environment Gradle (Gradle project) src 폴더내에 source code를저장하는 main 폴더와해당 source code에대한 test source code를저장하는 test 폴더로나누어져있다. 38
03 Build Environment Gradle (Gradle project) Build test 및 JUnit test 를위한 test code 작성 39
03 Build Environment Gradle (Gradle project) Test를원하는 class에커서를두고 Alt + Enter Create Test 클릭. 이때 testing 을위한 JUnit 5 library가없음을알수있다. 40
03 Build Environment Gradle (Gradle project) Fix 를통해 download 받을수도있지만 Gradle 을통해 build 하면서의존성 library 에추가해사용가능하다. 41
03 Build Environment Gradle (Gradle project) [Repositories] Gradle JVM version 과다르면 Build 시 error 발생. 의존성라이브러리가 저장되어있는 저장소를말함. ex) https://mvnrepository.com/ [dependencies] 해당 project 를 build 할때필요한 (dependent한) 외부라이브러리들을서술함. 42
03 Build Environment Gradle (Gradle project) EPL : Eclipse Public License 특허관련소송중심의용어를제거하여 CPL을대체한오픈소스소프트웨어라이센스. CPL : Common Public License 43
03 Build Environment Gradle (Gradle project) 아래의 terminal 창에서 gradle 명령어로 build 를함. External Libraries 에 JUnit 5 libraries 가추가됨. 44
03 Build Environment Gradle (Gradle project) 이전과같이 Create test 창을띄웠을때 JUnit 5를다운로드받을필요없이, 바로사용할수있게된것을볼수있다. 45
04 Unit Test JUnit 5 (What is JUnit 5?) 소개자바언어 (Java) 의단위테스트를위한프레임워크 기능 - Assertion 으로테스트케이스의수행결과를판별하여 passed or failed 로표시 - Annotation(@) 지원 효과 - System.out.print 로번거롭게디버깅하지않아도된다. - 프로그램테스트시걸리는시간을관리할수있다. 46
04 Unit Test JUnit 5 (What is JUnit 5?) JUnit 5 의경우, 다양한 module 로구성되어있음. 1) Junit Jupiter api test code 작성 module 2) Junit Jupiter engine test code 실행 module 3) Junit platform engine Junit platform launcher test engine을통해 test를발견, 실행및결과보고 module 47
04 Unit Test JUnit 5 (Assertions) 더많은 Assert 클래스의 method 들참고 : http://junit.sourceforge.net/javadoc/org/junit/assert.html 48
04 Unit Test JUnit 5 (Annotation 1) 해당테스트가시작전에딱한번씩만수행되도록지정 해당테스트가진행이시작되기전에작업할내용을호출 해당 Method 는 Test 대상임을의미 해당테스트가진행이끝난후에작업할내용을호출 해당테스트가끝나고딱한번씩만수행되도록지정 49
04 Unit Test JUnit 5 (Annotation 2) @DisplayName : 테스트클래스나메서드의표시이름지정 ex) @DisplayName( Calculator Addition ) 50
04 Unit Test JUnit 5 (Annotation 3) @Disabled: 테스트를수행하지않고건너뜀 ex) 51
04 Unit Test JUnit 5 (Test Environment 1) 1) IntelliJ 에서테스트환경을구축할 Project 오른쪽클릭 New Directory 로테스트소스폴더를만든다. 52
04 Unit Test JUnit 5 (Test Environment 2) 2) Project Structure Modules Sources 에서 1) 에서만든테스트소스폴더를 Test Sources Root 로지정한다. 제대로되었으면다음과같이초록색폴더로설정된다. 53
04 Unit Test JUnit 5 (Test Code Creation 1) 3) 테스트를실행할 Class Name에커서를올린후 Alt + Enter를누르면그림과같이메뉴가등장하는데, 거기서 Create Test를누른다. 54
04 Unit Test JUnit 5 (Test Code Creation 2) 4) JUnit 5 라이브러리를다운받는다. 55
04 Unit Test JUnit 5 (Test Code Creation 2) 4) JUnit 5 라이브러리를다운받는다. 56
04 Unit Test JUnit 5 (Test Code Creation 3) 5) 테스트를실행할메소드를선택하고 OK 버튼을누른다. 57
04 Unit Test JUnit 5 (Test Code Creation 3) 58
04 Unit Test JUnit 5 (Test Code Writing) 6) Assert 구문을이용하여 테스트메소드를작성한다. -> 해당예제에서는 assertequals(expected, actual) 로테스트대상메소드의실행결과 (actual) 가예상값 (expected) 과같은지확인 59
04 Unit Test JUnit 5 (Test Code Execution) 7) 테스트소스를실행한다. 8) 테스트결과를확인한다. 60
04 Unit Test JUnit 5 (Checking the Test result 1) 61
04 Unit Test JUnit 5 (Checking the Test result 2) 62
04 Unit Test JUnit 5 (Checking the Test result 3) 63
04 Unit Test JUnit 5 (Checking the Test result 4) 64
05 CI (Continuous integration) - Jenkins 1) CI(Continuous Integration, 지속적통합 ) 를 지원해주는도구 2) Nightly-build Auto-testing build (When webhooks are occurred ) 3) Plugin을활용하여다른 tool과호환성높음 project 관리 : Redmine 형상관리 : GitHub test 결과통보 : slack static analysis : PMD, FindBugs, SonarQube CTIP 환경구축에용이함. 65
05 CI (Continuous integration) Jenkins(Installation) Jenkins 다운로드 link https://jenkins.io/ 66
05 CI (Continuous integration) Jenkins(Installation) 설치방법은 2가지가존재함. 1) War 확장자파일로받아서 tomcat server 위에서구동시키는방법 2) Window에설치파일형식으로받아서 service 형태로내장된 server를가지고구동시키는방법여기서는 2) 방법으로실행할것. 67
05 CI (Continuous integration) Jenkins(Installation) 다운로드받은후압축을해제하면 msi 확장자파일이등장함. 실행하여설치창으로진입. 이후계속 next를눌러서진행함. 68
05 CI (Continuous integration) Jenkins(Installation) 설치가완료된이후 잠시기다리면 localhost:8080 Internet 창이뜨면서 password 가들어있는 file 의경로. 해당파일을메모장과같은 text 편집프로그램으로 열어준후해당값을복사후붙여넣기하면된다. Jenkins 준비중상태가된다. 모든준비가완료되면 Getting Started 창으로진입한다. Password 를입력하고 continue. 69
05 CI (Continuous integration) Jenkins(Installation) Suggested plugins 들을설치한다. 70
05 CI (Continuous integration) Jenkins(Installation) 추후연동하게될 Git 과 Gradle plugin 이설치되는것을 확인할수있다. 71
05 CI (Continuous integration) Jenkins(Installation) 설치완료후관리자계정을 등록하고 Jenkins URL 을설정하면 Jenkins 를사용할준비를마친다. 72
05 CI (Continuous integration) Jenkins(Installation) 73
05 CI (Continuous integration) Jenkins 그러나.. 1. Localhost 이므로 git과연동시킬때 webhook 발생이까다로움. 2. 나는바로접속할수있으나외부에서접속이까다로움. 다수와협업하며 CI를요구하는 project 상황에적합한가? 3. 내컴퓨터를일종의 server 로사용하는것 내컴퓨터가동작하지않을때는? 4. 설정변경시 service 로동작되므로제어판 관리도구 서비스에서계속중지 재실행을해야함. ngrok 을이용하여외부접속이가능하게만들수있지만근본적인해결책은 되지않는다고판단함. AWS EC2 로 Jenkins server 를구축함. 74
06 CI (Continuous integration) Git & GitHub - 분산버전관리시스템 ( 형상관리 ) workspace 실제 source code를저장하는폴더 local repository commit 내역을저장하고있는 workspace 하위.git 폴더 remote repository 네트워크상에존재하는 repository - SHA-1 Hash 를사용하여 data 를 Hash object 의형태로만들어관리함 - Local 에서도편하게작업이가능함. 75
06 CI (Continuous integration) Git & GitHub - Git 을지원해주는 web hosting service. - Git 을통해다른사람들과협업할때 필요한 remote repository 를제공및 유지, 관리해줌. - GUI 를통해시각적으로접근가능 - 형상관리및빌드자동화를위해 다양한 tool 과연동가능 ex) Jenkins, Travis CI 76
06 CI (Continuous integration) Git & GitHub https://git-scm.com/ Git download URL. 설치파일을받고 next 를계속눌러진행한다. 설치가완료되면 window 에서리눅스처럼 각종 git 명령어를사용할수있는 Git bash 를실행할수있다. 77
06 CI (Continuous integration) Git & GitHub https://git-scm.com/ Git download URL. 설치파일을받고 next 를계속눌러진행한다. Git 을설치한후에는원격저장소를만들기위해 GitHub 에가입한다. 가입하고나서 project(repository) 를생성한다. https://github.com/ 78
06 CI (Continuous integration) Git & GitHub 저장소이름과, 이저장소가무엇을위한것인지 Description 등을서술하고, private/public 옵션을선택한다. Create repository로원격저장소를생성한다. 79
06 CI (Continuous integration) Git & GitHub Git bash로도 commit, push 등의작업을진행할수있으나 GitHub Desktop 을통해더편하게진행할수있음. https://desktop.github.com/ 설치파일을다운로드후설치시 GitHub Desktop 이실행됨. File option 으로들어가서 GitHub id 로 Sign in 을진행한다. 80
06 CI (Continuous integration) Git & GitHub File new repository 으로들어간다. 생성하고싶은 Local repository 이름과 Description, Local repository 경로를설정한다. 이후해당경로에 Local repository 가 생성된것을확인할수있다. 81
06 CI (Continuous integration) Git & GitHub 해당 Local repository를 GitHub의 Remote repository로등록하기위해 Publish repository를누른다. 참고 ) Keep this code private 체크시 Private repository로생성된다. 82
06 CI (Continuous integration) Git & GitHub 이번에는 Remote repository 를 Local repository 로 만들어서작업하기위해 File Clone repository 로 들어간다. Local 로내려받을 remote repository 를선택후 Path 를설정하고 clone 을누른다. 83
06 CI (Continuous integration) GitHub + Jenkins 구축된 Jenkins 서버와 git의 Repository를연동시키기전에 ssh-keygen 프로그램으로 RSA 암호기반의 Public key와 Private key를만든다. 이후연동시킬 git Repository의 Setting tab으로들어가 Deploy keys Add new 에 Public key를등록한다. 84
06 CI (Continuous integration) GitHub + Jenkins 등록후 Webhook tab 으로가서 Add webhook 을선택한다. 85
06 CI (Continuous integration) GitHub + Jenkins Jenkins server URL 뒤에 /github-webhook/ 을붙여 Payload URL 을기입하고, Content type 을설정한후 Just the push event, Active 옵션에체크후 Add webhook을한다. 86
06 CI (Continuous integration) GitHub + Jenkins Push 가올때마다 build 를할수있도록 Github integration plugin 을설치한다. 87
06 CI (Continuous integration) GitHub + Jenkins 설치가능탭으로간후좌측상단 filter에 GitHub integration을검색한다. 해당 plugin 설치후 Jenkins 재시작옵션에체크하여 Jenkins를다시시작한다. 88
06 CI (Continuous integration) GitHub + Jenkins Freestyle project 로 Project 를하나생성한다. 89
06 CI (Continuous integration) GitHub + Jenkins 생성된 project 의구성 - 소스코드관리로들어가 Git 을선택하고 repository URL 을기입한다. 이후 Add credentials 을해준다. 90
06 CI (Continuous integration) GitHub + Jenkins Username 에 GitHub 계정이름을기입하고, Private key 에아까생성한 Private key 값전체를넣어준다. 이후 Add 를눌러등록하고선택한다. 91
06 CI (Continuous integration) GitHub + Jenkins 빌드유발에서 GitHub hook trigger for GITScm polling 옵션을체크하고 apply save 한다. 없으면 GitHub integration plugin 설치를확인한다. 추가로, private key와 repository 주소를옳게기입했음에도불구하고소스코드관리탭에서 Error가발생하면해당서버에 Git이설치되어있는지확인한다. 92
06 CI (Continuous integration) GitHub + Jenkins GitHub desktop 을통해연동한 remote repository의일부 source code를 Local repository에서수정후 commit push 한다. 93
06 CI (Continuous integration) GitHub + Jenkins Commit 시 error 가발생하면 Git 설치후최초사용자등록을 안해주었기때문에발생한것이므로 Git bash 실행후 git config --global user.email git 가입시작성한 email git config --global user.name git username 을입력한다. 이후 commit push 하여 Remote repository 에 Local repository 의 변경사항을반영시킨다. 94
06 CI (Continuous integration) GitHub + Jenkins 95
07 Summary IntelliJ Gradle + JUnit 5 Git & GitHub Jenkins 96
07 Summary IntelliJ Gradle + JUnit 5 Git & GitHub Jenkins - IntelliJ IDE 에서다수가 Unit 단위개발시작. - Unit 단위개발 Gradle 을통한 build + JUnit 5 을통한 Unit Test 실시 - 문제발견 Debugging & 이상없으면 Git 을통한형상관리. 97
07 Summary IntelliJ Gradle + JUnit 5 Git & GitHub Jenkins - Repository를통한형상관리 - Unit 들이모이게됨 결과적으로 Integration 필요. - 모아서한번에 Integration 하면여러가지문제가발생. Continuous Integration을통해미연에방지해야함. 98
07 Summary - Continuous Integration 환경을제공 - Unit들을 Integration 한후 build 실행 - 추가적인 test 및 analysis 실행 - 계속 Integration 하면서문제점들을제때에해결 결과적으로 Software Quality 향상 IntelliJ Gradle + JUnit 5 Git & GitHub Jenkins 99
감사합니다 THANK YOU Software Verification Team 4 강 정 모 송 상 연 신 승 화 100