레이블이 UNIT TEST인 게시물을 표시합니다. 모든 게시물 표시
레이블이 UNIT TEST인 게시물을 표시합니다. 모든 게시물 표시

2015년 4월 7일 화요일

Unit Test Junit, TDD, and CI(수업 노트06 TDD 1일차)

아 다행이도 오늘은 복습 환경 구축이 위주임
 예제는 사용자 정보(이름만)를 관리하는(일종의 주소록) 예제로 진행 예정

요구사항(1)
   사용자 등록 가능
   사용자 조회 가능

 메이븐 프로젝트 생성 -> kr.kosta ,UserMgnt 로 생성

 
생성하니 테스트와 실 사용 소스가 분리되는 틀이 만들어져 있음

test/java 밑에 패키지를 만들고 그 밑에 클래스 하나를 만듬
클래스에안에  @test 메소드를 만들고
pom 파일에 junit 을 가져오도록 디펜던시를 걸어준다.

---------------------------------------
  <dependencies>
  <dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.8</version>
  </dependency>
  </dependencies>
</project>
---------------------------------------이렇게

  -> 그러면 @test 를 끌어오면서  import만하면 사용이 가능해짐
그리고 다음과 같이 적어준다. 유저 를 만들고, 해당 유저의 아이디를 가져오도록 지시함

일단 팩키지 구성은 아래와 같고 이중 3개 팩키지, 4개 파일을 추가했다.

src/main/java
kr.kosta.user.domain
     -User
kr.kosta.user.service
     -UserService
     -UserServiceImpl

src/test/java
kr.kosta.user.service
     -UserServiceTest


이중 테스트에 추가한 유저 서비스 테스트

실제 구현부의 유저 서비스 클래스

유저 객체를 생성위한 유저 클래스 
 

유저 서비스에 실 숫자 입력을 위한 가상 입력 클래스
 
이렇게 완성되었으나 실제 구현은 요구사항에 따른 메소드 선언 -> 메소드 선언에 따른 인터페이스 구현
  ->  인터페이스에 들어갈 내용(객체 생성위한 클래스 생성) -> 테스트 구현구 구체화 후 실제 입력값을
         받기위한 클래스 선언 -> 실제 값 입력이 되도록 리턴값 설정
    순으로 에러 제거를 위한 구현간 구체화가 이루어졌다.
        

요구사항(2)
   전체 등록된 사용자 수 조회
   전체 등록된 사용자 목록 조회
   사용자 등록 및 조회 기능을 추가(요구사항(1)의 기능 두가지를 합친 기능)
   ......

 요구사항(2)의 1번을 구현

public void allUserCountTest(){
UserService userService = new UserServiceImpl();
int allUserCount = userService.allUserCount();
assertSame(0,allUserCount);
}
이러면 두가지 에러가 나는데 인터페이스에 allUserCount를 선언해주고, UserServiceImpl 에
  빈 메소드를 추가해주면
   아직 입력하지 않았을때 기대되는 값 0을 얻을 수 있게된다. - 테스트 pass

요구사항(2)의 2번도 마찬가지로 이클립스 컨트롤 + 1 신공으로 완성 가능

하지만 내용이 없는 상태
---->>> 7일차 진행예정

Unit Test Junit, TDD, and CI(수업 노트04 SVC, String3 )

메이븐 프로젝트 만들래?

  필요한 내용
    폴더명
    프로젝트명
    버전
    빌드 방식(jar?, war? ear?,pom? 등등)

메이븐의 생명주기

생명주기 : process-resources  ->  compile  ->  process-test-resources  -> test-compile  -> test   -> 
                 package  ->  install  -> deploy

명령어 : reources:resource  -> compiler:compile  ->  resources:testResources -> compiler:testCompile 
                 -> surefire : test  -> jar:jar  -> install:install -> deploy:deploy

상황 : 프로젝트 관리는 메이븐 쓰고, 툴은 이클립스 쓰고, 소스 형상관리는 svn 써서 웹프로젝트를 하려
           고 한다. 프로젝트는 spring3 MVC 로 할꺼니깐 프로토타입으로 할꺼고
           웹서버는 나중에 톰캣쓸껀데 지금은 jetty로 구성하자 
           만들어놔라 알긋지?

이미 한건 아래 두가지
- 메이븐 설치
- 이클립스 설치 자바 환경 구성 m2eclipse 메이븐 클라이언트 프로그램 셋팅 완료

나머지는 이제 하면 됨

우선 메이븐 설치된걸로 도구 바꾸기

windows - preferences - maven - installations
에서 add 버튼 누르고 메이븐 설치된 위치를 선택해주면 바뀜

설치된 폴더 밑 conf 로 가면 셋팅.xml 파일 을 편집기로 열기
--------------------------------------------------------
  <!-- localRepository
   | The path to the local repository maven will use to store artifacts.
   |
   | Default: ~/.m2/repository
  <localRepository>/path/to/local/repo</localRepository>
  -->
---------------기본 폴더 위치를 알려줌-----------------

지정된 폴더에 라이브러리를 가져옴

새 프로젝트 만들기 - 메이븐 프로젝트 - 
org.apache.maven.archetype , maven-archetype-webapp 선택

그룹 아이디는 net.kosta.mysample
아티펙트 아이디 mysample-web
버전은 1.0.0-SNAPSHOT
패키지는 net.kosta.mysample

로 프로젝트 생성
 

이제 pom.xml로 가서 spring3 추가해야됨
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>3.1.3.RELEASE</version>
</dependency>
 이렇게 추가하면 해당 내용이 jar로 내 프로젝트 안에 자동으로 들어감(전 강의내용)

그리고 플러그인 한개 추가
<plugins>
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>maven-jetty-plugin</artifactId>
<version>6.1.11</version>
<dependencies>
</dependencies>
<configuration>
<contextPath>
<connectors>
<connector implementation="org.mrtbay.jetty.nio.SecectChannelConnector">
<port>8080</port>
<maxIdleTime>60000</maxIdleTime>
</connector>
</connectors>
</contextPath>
</configuration>
</plugin>
</plugins>

 그리고 실행 하는데 실행시
  Run-as - Run configration
   - Goals 부분에 jetty:run 을 입력

 


 실행 완료 되었으면 웹을 띄우고 
localhost:8080 입력하면 화면에 helloWorld 가 뜰 것임


 그 뒤로는 맨붕와서 일단 패스
 이 이후에 메이븐, 넥서스 내용이 보충될 예정입니다. (언젠가는)

Unit Test Junit, TDD, and CI(수업 노트03 Maven화면 띄우기)

1. 프로젝트를 구성하는 요소를 알아보고(진짜 살짝 간베기 정도의 정도)
2. 메이븐을 설치후 콘솔 명령을 통해서 프로젝트를 하나 만들어보고
3. 이클립스에서 클라이언트에서 메이븐을 컨트롤 할수 있는 프로그램인
     m2eclipse 을 설치후 간단하게 환경 구성을 함 해보겠습니다. 

개발환경 구성요소 (SCM 툴(Git, CC), 빌드 툴, 테스트 및 이슈 트래킹 툴
                            , 릴리즈 프로세스, 유지보수 프로세스)

SCM () : 소스 버전 관리 목적 - CVS, Subversion, Git, Perforce, BitKeeker, ClearCare
                                            Visual SourceSafe 등등
빌드 툴 : 제품 생성, 프로젝트 관리 - Maven, Ant, Make, NAnt, Rake
테스트 자동화 툴 : JUnit 등등
이슈 트래킹 : 이슈 정보 보고서 생성, 이슈 관리 : Spreadsheets, Bugzilla, GNATS,
                                            ForBugz, JIRA, TestTrack

 maven.apache.org 로 가서 maven 다운로드 및 설치
    그리고 압축 풀린 장소를 path 잡으면 콘솔 명령 가능

    자신의 계정밑에 .m2 라는 폴더가 생김 <-- 여기가 메이븐이 관리하는 폴더가 되며 차후에
          폴더를 여러개 설정해서 관리하기도 가능함

   1. 콘솔상에서 프로젝트 만들어보기
     만들고자 하는 폴더 안에서 콘솔 명령 입력
------------------------------------------------------------------------------------ 
     mvn archetype:create -DgroupId=edu.kosta -DartifactId=sample4 -DpackageId=edu.kosta.sample4 -DversionId=1.0.0.SNAPSHOT
------------------------------------------------------------------------------------
 archetype - 프로젝트를 생성해주는 플러그인 (꼬리?)
groupID - 패키지명 id 를 부여함
artifactID - 패키지 안에서 의 id
packageID - 최상위 버전 id
versionID - 버전 선언 SNAPSHOT 이 들어가면 jar 버전임을 확인함 
                   보통 스냅샷을 보고 최신인지 구버전인지 판단함

  ☆ but 아직 eclipse 에서 인식할수 있는 상태의 work 가 아니다.
         (임포트 할라고 해도 아예 뜨질 않는다.)
   1.2 위에 소스에서 생성한 sample4 폴더로 들어간다.
   1.3 폴더 안에서 다음과 같이 작성한다.
------------------------------------------------------------------------------------
 mvn eclipse:eclipse
------------------------------------------------------------------------------------

------------------------------------------------------------------------------------
 mvn clean
------------------------------------------------------------------------------------
프로젝트 지워버린다.

------------------------------------------------------------------------------------
 mvn install
------------------------------------------------------------------------------------
프로젝트를 다시 생성한다.

/target 으로 가보면 아까 생성할때 넣었던 4.1.0 SNAPSHOT 파일이 생성되 있는걸 볼 수 있다. 


이후에 이클립스 에서 import 시도하면 일단 프로젝트명칭은  뜬다.
 근데 아직 실행이 안된다.
 

이유는 메이븐을 인식할수 있는 이클립스의 플러그인이 설치되어야 함
이클립스 마켓으로 가서 m2eclipse 으로 검색, 모양 틀린(가로선 여러개 그어진 아이콘 모양)
   플러그인 받는다.
  (이 프로그램이 클라이언트에서 maven을 컨트롤 할 수 있는 도구임)
깔고 다시 실행하면 느낌표가 사라지게됨

- 만들어 임포트 했던 프로젝트 smple4 의 오른쪽 마우스키를 눌러
    confgure - maven project 실행 하면 에러가 나든 안나든 메이븐 프로젝트로 전환된다.

- 이제 정상으로 돌아온 프로젝트의 pom.xml 파일을 살펴본다.
    기억이 안나서 일단 생략 나중에 봅시다.

- 거기 xml 파일 보면 
    <dependencies> 밑에 아래 내용을 적으면
     만약에 해당 plug-in or library가 있을경우 그걸 어딘가에 있을 lib 서버에서 해당 라이브러리를
      입력 후 저장과 동시에 가져온다.

  <dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-web</artifactId>
  <version>3.1.3.RELEASE</version>
  <scope>test</scope>
  </dependency>

☆☆ xml 파일에 위 내용만 추가했는데 지가 라이브러리에 해당 내용을 추가하는건 좀 대박인듯 ☆☆


 다른 방법으로 이제 이클립스에서 메이븐 프로젝트 생성가능하다.
   - 프로젝트 생성 - other - 메이븐 프로젝트를 선택후
    -next - select archtecture 에서 기본 아키텍쳐인
     maven- archtecture-quickstart 를 선택하고 아까 콘솔에서 입력했던대로
      3가지 입력하고 생성하면 끝

 <project> //모든 메이븐의 최 상위 요소
<modelVersion>4.0.0</modelVersion>//POM이 사용 중인 객체 모델에 대한 버전으로 필수 요소
<groupId>com.mycompany.app</groupId>//프로젝트내 식별하고자 하는 아이디 같은거
<artifactId>my-app</artifactId>//프로젝트 결과물에 포함되는 문자열
<packaging>jar</packaging>//패키지 유형
<version>1.0-SNAPSHOT</version>//프로젝트 결과물 버전 지정
<dependencies>
</dependencies>
</project>

Unit Test Junit, TDD, and CI(수업 노트02 JUnit기초)

구성 설명
1. 이론 수업
2. 테스트 케이스 모델 2개 (4칙연산, int 값에 -+ 하는 계산 로직 일명 통장)
3. 각각 테스트 구현방법(Junit3, Junit4) 4는 두가지 다 3은 1가지만 예제 올림
4. 버전별로 테스트를 묶어서 구현하는 방법
 순서로 진행됩니다.


....단위 테스트 프레임워크 (Junit)
1997년 Erich Gamma , Kent Beck 둘이서 개발함
   컨퍼런스를 가는중에 Smalltalk 라는 프로그램 테스트를 위한 SUnit 을 가지고 
      자바 기반인 JUnit 로 컨버팅(다른 언어를 자바형태로 컨버팅 함)

   공개 소스 소프트웨어, 이후 Java 개발에서 단위 테스트 de facto 표준 프레임워크로 발전함

xUnit : 모든 언어를 위한 프레임워크

   JUnit 의 기능
      결과를 판별해주는 단정문(boolean)
      여러 테스트에서 공통으로 사용할수 있는 테스트 픽스처
      테스트 러너(작업도구)

Junit 4 (Java1.5ver)과 같이 발전함 1.5 버전 기준으로 하위는 3를 사용, 위에는 4버전을 사용

★Junit3 작성 규칙(4는 해당사항 없음)
 -TestCase를 상속받아야 쓸수 있음
 -테스트 메소드 이름은 반드시 Test로 시작해야 함

  setUp(); //테스트 시작전
  tearDown(); //테스트 종료 전
    --> 테스트 픽스처 메소드

테스트 스위트 (한방에 테스트 돌리고 싶을때 사용)
   Method 명은 반드시 public static Test suite() 여야 가능함
   테스트 추가시 suite.addTestSuite(테스트 클래스.class) 형태를 가져야 함

★Junit4 -- test 안붙여도 실행됨
    또한 유연한 픽스처 제공 및 예외 테스트 가능Test(expected=class name), 테스트 무시 가능
       (@Ignore("message")
    배열 지원,  시간제한 테스트 가능(@Test(timeout=1000)
    시작할때 @RunWith(class name) 으로 시작
    여러개 묶어 할때 @SuiteClasses(Class[]) 로 가능


   ------------------------Unitest ver 3 활용 예제--------------------------------------

기본 클래스 Calculator  ---------------------------------------------------------------
//4칙 연산을 기본적으로 하는 메소드 4개가 결합된 클래스 하나를 만든 상태임

public class Calculator {

public static int add(int num1, int num2){
return num1+num2;
}
public static int subtract(int num1, int num2){
return num1-num2;
}
public static int numtiply(int num1, int num2){
return num1*num2;
}
public static int divide(int num1, int num2){
return num1/num2;
}
}
------------------------------------------------------------------------------------
JUnit ver3 으로 테스트 한 예제   Calculator3Test  ---------------------------------------

public class Calculator3Test extends TestCase {

  @Override
protected void tearDown() throws Exception {
System.out.println("setUp");
//테스트를 타면서 값이 변할수 있는데 teatDawn 메소드를 넣으면 
// 1개 메소드 실행후 초기화된다. 
                // 한개 메소드 실행하고 tearDown 실행하고 다른 메소드 실행하고
                // tearDown 실행하고 ........
}

public void testAdd() {
  // 밑에 세가지 순서를 지켜서 작성하는게 좋다고 권고함
// setup
int num1 = 3;
int num2 = 2;

// execute
int result = Calculator.add(num1, num2);
// verify
assertEquals(5, result);
System.out.println("add");
}

public void testSubtract() {
assertEquals(4, Calculator.subtract(6, 2));//앞 숫자와 뒤 숫자가 같은지 비교하는 구문
assertEquals(3, Calculator.subtract(6, 3));
assertEquals(5, Calculator.subtract(6, 1));
System.out.println("Subtract");
}

public void testMultiply() {
assertEquals(4, Calculator.numtiply(2, 2));
System.out.println("Multiply");
}

public void testDevide() {
assertEquals(6, Calculator.divide(18, 3));
System.out.println("Devide");
}
}

 ------------------------콘솔 결과값 ------------------------------------------------
add
setUp
Multiply
setUp
Devide
setUp
Subtract
setUp
-------------------------------------------------------------------------------------

JUnit ver4 으로 테스트 한 예제   Calculator4Test  ---------------------------------------
public class Calculator4Test {

@BeforeClass
public static void beforClass(){
System.out.println("BeforeClass");
//beforeClass 와 afterClass 두가지는 static 선언해야 에러가 안남 왜? 잘 모르겠음
//test 시작전 처음에 실행됨
}
@Before
public void before(){
System.out.println("before");
// before 메소드는 한가지 테스트 메소드 실행전에 실행됨
}
@Test
public void testAdd() {
// setup
int num1 = 3;
int num2 = 2;

// execute
int result = Calculator.add(num1, num2);
// verify
assertEquals(5, result);
System.out.println("add");
}

@Test
public void testSubtract() {
assertEquals(4, Calculator.subtract(6, 2));
assertEquals(3, Calculator.subtract(6, 3));
assertEquals(5, Calculator.subtract(6, 1));
System.out.println("Subtract");
}

@Test
public void testMultiply() {
assertEquals(4, Calculator.numtiply(2, 2));
System.out.println("Multiply");
}

@Test
public void testDevide() {
assertEquals(6, Calculator.divide(18, 3));
System.out.println("Devide");
}
@After
public void after(){
System.out.println("after");
// test 메소드 실행후에 매번 실행되는 after 메소드
}
@AfterClass
public static void afterClass(){
System.out.println("afterClass");
//모든 실행이 끝나면 마지막에 afterclass 메소드가 실행된다.
//여기도 마찬가지로 static 선언을 해줘야됨
}
}
------------------------------------------------------------------------------------
 ------------------------콘솔 결과값 ------------------------------------------------
BeforeClass
before
Subtract
after
before
add
after
before
Multiply
after
before
Devide
after
afterClass
-------------------------------------------------------------------------------------
 
                    (Junit 상 pass화면)

예제 2) 이제 2번째 예제인 예금 클래스에 대한 testcase를 작성하기를 해본다.
원본예제Account---------------------------------------------------------------------
public class Account {

static int money =0;
public Account(int i) {
this.money=i;
}

public int getBalance() {
return money;
}
public int deposit(int i){
this.money += i;
return money;
}

public int withdraw(int i) {
this.money -= i;
return money;
}
}
-------------------------------------------------------------------------------------
Junit4 테스트 Account4Test------------------------------------------------------------
public class Account4Test {

@BeforeClass
public static void beforClass(){
System.out.println("BeforeClass");
}
@Before
public void before(){
System.out.println("before");
}

@Test
public void TestgetBalance() {
Account account = new Account(10000);
assertEquals(10000, account.getBalance());
System.out.println("pass getBalance"+account.getBalance());
}
@Test
public void Testdeposit(){
Account account = new Account(10000);
int dep = account.deposit(5000);
assertEquals(15000, dep);
System.out.println("pass deposit" + dep);
}

@Test
public void Testwithdraw() {
Account account = new Account(10000);
int with = account.withdraw(2000);
assertEquals(8000,with);
System.out.println("pass withdraw" + with);
}
@After
public void after(){
System.out.println("after");
}
@AfterClass
public static void afterClass(){
System.out.println("afterClass");
}
}
-------------------------------------------------------------------------------------
콘솔 결과----------------------------------------------------------------------------
BeforeClass
before
pass getBalance10000
after
before
pass deposit15000
after
before
pass withdraw8000
after
afterClass
-------------------------------------------------------------------------------------

 3... 이제 전체 테스트를 묶어서 실행해보는 방법 (메이븐을 안쓰면 이런 방법을 쓰더라)

Junit 3 버전일때 사용 방법-------------------------------------------------------------

public class Suite3Test extends TestCase {

public static  Test suite(){
TestSuite suite = new TestSuite();
suite.addTestSuite(Calculator3Test.class);
suite.addTestSuite(SampleJunit3Test.class);
return suite;
}
}
-------------------------------------------------------------------------------------


Junit4 버전일때 사용방법--------------------------------------------------------------

@RunWith(Suite.class)
@SuiteClasses({Calculator4Test.class, SampleJunit4Test.class})
public class Suite4Test {
}


앞서 했던 두가지 테스트 클래스가 다 실행되었음-----------------------------------------

 BeforeClass
before
Multiply
after
before
add
after
before
Subtract
after
before
Devide
after
afterClass
-------------------------------------------------------------------------------------