언제나 잊어버리는..


~]#  ifup eth0

~]#  vi /etc/sysconfig/network-scripts/ifcfg-eth0

ONBOOT=no -> yes

Struts2 + Spring + iBatis 환경에서 MVC 테스트 방법을 찾아봤다.

POJO(s/getter) 방식과 Request s/getAttribute 방식 두가지로 결과값을 받아 데이터를 검증해보자.


[GoodsActionCase.java]

import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.notNullValue;
import static org.junit.Assert.assertThat;

import java.util.HashMap;
import java.util.Map;

import org.apache.struts2.ServletActionContext;
import org.junit.Test;
import org.springframework.mock.web.MockHttpServletRequest;

import com.opensymphony.xwork2.ActionProxy;;

public class GoodsActionCase extends StrutsTestCaseSupport {

	@Test
	public void 상품상세() throws Exception {
		Map sessionMap = new HashMap();

		// /view/goodsDetail.action
		ActionProxy proxy = StrutsTestCaseSupport.getInstance().createActionProxy ("detail", "/goods", sessionMap);
		MockHttpServletRequest request = new MockHttpServletRequest();
		request.setParameter("코드", "123456");
		ServletActionContext.setRequest(request);


		GoodsAction goodsAction = (GoodsAction) proxy.getAction();
		goodsAction.detail();

		GoodsInfoBean memberFieldData 	= goodsAction.getDataBean();
		GoodsInfoBean setAttributeData 	= (GoodsInfoBean) ServletActionContext.getRequest().getAttribute("goodsInfo");

		assertThat("널이 아니겠지?", memberFieldData, is(notNullValue()));
		assertThat("널이 아니겠지?", setAttributeData, is(notNullValue()));
		assertThat("앞뒤가 같겠지?", memberFieldData.getGoodsNm(), equalTo(setAttributeData.getGoodsNm()));
	}
}

[환경]

Struts2 2.0.x

Spring 2.5.x

StrutsTestCaseSupport.java - http://fassisrosa.blogspot.kr/2007/09/unit-testing-struts-20-part-3.html


[TestSchedule.java]


import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;

@Service
public class TestSchedule {

	@Scheduled(cron = "*/5 * * * * *")	// second, minute, hour, day, month, weekday
	public void test() throws InterruptedException{
		System.out.println("-- test");
	}

	@Scheduled(fixedDelay=1000)			// 이전에 실행된 Task의 종료 시간부터
	public void test2() throws InterruptedException{
		Thread.sleep(5000);
		System.out.println("-- test2");
	}

	@Scheduled(fixedRate=1000)			// 이전에 실행된 Task의 시작 시간부터
	public void test3() throws InterruptedException{
		Thread.sleep(5000);
		System.out.println("-- test3");
	}
}

[applicationContext.xml]





	
	
	

[web.xml]





	Board

	
	
		contextConfigLocation
		classpath:config/applicationContext*.xml
	
	
	
		org.springframework.web.context.ContextLoaderListener
	



[build.gradle]


apply plugin: 'java'
apply plugin: 'eclipse'

sourceCompatibility = 1.7
version = '1.0'
jar {
    manifest {
        attributes 'Implementation-Title': 'Issue', 'Implementation-Version': version
    }
}

repositories {
    mavenCentral()
}

// 의존성 설정에 사용할 프로퍼티
springVersion = '3.2.0.RELEASE'
slf4jVersion = '1.7.5'
logbackVersion = '1.0.13'

// 메이븐 Central 저장소 사용
repositories {
    mavenCentral()
}

List loggers = [
    "ch.qos.logback:logback-classic:1.0.13",
    "org.slf4j:jcl-over-slf4j:1.7.5",
]

// 의존성 설정
dependencies {
    compile "org.springframework:spring-webmvc:$springVersion"

    compile "commons-lang:commons-lang:2.6"
    compile "commons-httpclient:commons-httpclient:3.1"

	compile "net.sf.json-lib:json-lib:2.2.1:jdk15"
    compile "org.jsoup:jsoup:1.7.3"
    compile "com.taskadapter:redmine-java-api:1.23"

    compile loggers

    testCompile "org.springframework:spring-test:$springVersion"
    testCompile 'junit:junit:4.8.2'
    testCompile 'org.mockito:mockito-core:1.9.0'
}

// commons-logging, log4j, jul 의존성 제거
configurations {
    all.collect { configuration ->
        configuration.exclude group: 'commons-logging', module: 'commons-logging'
        configuration.exclude group: 'log4j', module: 'log4j'
    }
}

uploadArchives {
    repositories {
       flatDir {
           dirs 'repos'
       }
    }
}


jUnit으로 HTTP기반 테스트 케이스를 작성 후 성공여부를 모니터링 하고 싶었다...



#!/bin/sh

LOG_FILE=../shell/TestCase2.log
LOG_FILE_FINISH=../shell/log/TestCase2.log

if [ -f $LOG_FILE ]; then
        echo "TestCase 현재 실행중임!"
        exit 1;
fi

java -classpath ...... org.junit.runner.JUnitCore com.test.TestCase2 > $LOG_FILE

/bin/rm -f $LOG_FILE_FINISH


FAILE_CNT_CNT=0
LOG_FILES=`cat $LOG_FILE`

for log_file in $LOG_FILES
do      
        tempS=`echo $log_file | grep "FAILURES!!!"`

        if [ "$tempS" != "" ]; then
                FAILE_CNT=1
                /bin/cp $LOG_FILE $LOG_FILE_FINISH$(date +%Y%m%d%H%M%S)   
                /bin/cp $LOG_FILE $LOG_FILE_FINISH
                break
        fi
done

if [ $FAILE_CNT = 0 ]; then
        /bin/rm -f $LOG_FILE_FINISH
fi

/bin/rm -f $LOG_FILE

# LOG_FILE_FINISH 경로에 파일이 존재 한다면 실패했다고 보면 됨...
  1. OpenSSL 설치되어 있다고 가정!!
  2. 키 생성
    • # openssl genrsa 1024 > key.pem
      • 여러가지 키생성 방법이 있으나 패스워드가 필요 없는 케이스
  3. 서명 생성
    • # openssl req -new -key key.pem > csr.pem
      • 다른 값들은 아무치나.. 아래것만 잘!!
        • Common Name (eg, your name or your server's hostname) []: 접속 도메인 주소(a.abc.com)
  4. 인증서 생성
    • # openssl req -key key.pem -x509 -nodes -sha1 -days 365 -in csr.pem -out crt.pem
  5. 키 저장소 생성
    • openssl pkcs12 -export -in crt.pem -inkey key.pem -out .keystore -name tomcat
      • WAS 에서 사용할 비밀번호 설정
  6. Tomcat server.xml 설정
    
    
  7. Tomcat 기동
  8. 환경
    • CentOs 6.4
    • Tomcat 5.5.36

[참고] http://dimdim.tistory.com/entry/openssl%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-Tomcat-HTTPS-%EC%84%A4%EC%A0%95-PKCS12-%ED%8F%AC%EB%A7%B7

[jUnit or Hamcrest 셈플]

import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.empty;
import static org.hamcrest.Matchers.emptyArray;
import static org.hamcrest.Matchers.endsWith;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.equalToIgnoringCase;
import static org.hamcrest.Matchers.equalToIgnoringWhiteSpace;
import static org.hamcrest.Matchers.greaterThan;
import static org.hamcrest.Matchers.greaterThanOrEqualTo;
import static org.hamcrest.Matchers.hasEntry;
import static org.hamcrest.Matchers.hasProperty;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.lessThan;
import static org.hamcrest.Matchers.lessThanOrEqualTo;
import static org.hamcrest.Matchers.not;
import static org.hamcrest.Matchers.notNullValue;
import static org.hamcrest.Matchers.startsWith;
import static org.junit.Assert.assertThat;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.hamcrest.Matchers;
import org.junit.Test;


public class 테스트케이스 {
	@Test
	public void 셈플() throws Exception{
		assertThat("0이 아니겠지?", 1, not(0));
		assertThat("앞에값이 크겠지?", 2000, greaterThan(1000));
		assertThat("앞에값이 크거나 같겠지?", 1000, greaterThanOrEqualTo(1000));
		assertThat("앞에값이 작겠지?", 2000, lessThan(5000));
		assertThat("앞에값이 작거나 같겠지?", 1000, lessThanOrEqualTo(1000));
		assertThat("앞뒤가 같겠지?", "하이", equalTo("하이"));
		assertThat("앞뒤가 대소문자 구분없이 같겠지?", "aabbcc", equalToIgnoringCase("AaBbCc"));
		assertThat("앞뒤 공백은 좀 바주고 같겠지?", "하이 ", equalToIgnoringWhiteSpace(" 하이"));
		assertThat("널이 아니겠지?", new String("널 아니다"), is(notNullValue()));
		assertThat("리스트가 비어있겠지?", new ArrayList<Object>(), empty());
		assertThat("배열이 비어있겠지?", new String[0], emptyArray());
		assertThat("문자열에 포함되어 있지?", "abc", containsString("b"));
		assertThat("시작하는 단어가 맞지?", "abc", startsWith("a"));
		assertThat("끝나는 단어가 맞지?", "abc", endsWith("c"));


		List<Map<String, String>> mapList = new ArrayList<Map<String, String>>();
		Map<String, String> map = new HashMap<String, String>();
		map.put("name", "ddakkerTest");
		map.put("age", "100");
		mapList.add(map);
		map = new HashMap<String, String>();
		map.put("name", "ddakker");
		map.put("age", "0");
		mapList.add(map);
		assertThat("배열중에서 특정 키의 값이 존재 하지?", mapList, Matchers.<Map<String, String>>hasItem(hasEntry("name", "ddakker")));
		assertThat("해쉬맵에서 해당 필드의 값이 동일하지?", map, hasEntry("name", "ddakker"));

		List<User> userList = new ArrayList<User>();
		User user = new User("ddakkerTest", 100);
		userList.add(user);
		user = new User("ddakker", 0);
		userList.add(user);
		assertThat("배열중에서 특정 필드의 값이 존재 하지?", userList, Matchers.<User>hasItem(hasProperty("name", is("ddakker"))));
		assertThat("빈에서 해당 필드의 값이 동일하지?", user,hasProperty("name", is("ddakker")));
	}
}
  • hamcrest-all-1.3.jar
  • junit-4.4.jar
    ex) Spring 2.5 에서는 junit-4.4 버전을 사용해야 문제가 없다고 함!!


[build.gradle]

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'findbugs'
apply plugin: 'pmd'

repositories {
    mavenCentral()
}

sourceCompatibility = 1.7
version = '1.0'
jar {
    manifest {
        attributes 'Implementation-Title': 'StudyPd3Sample', 'Implementation-Version': version
    }
}
group = 'pe.kr.ddakker'


findbugs {
	toolVersion = "2.0.1"
	sourceSets = [sourceSets.main]
	ignoreFailures = true
	reportsDir = file("$project.buildDir/findbugsReports")
	effort = "default"
	reportLevel = "medium"
	includeFilter = file("$rootProject.projectDir/config/findbugs/includeFilter.xml")
	excludeFilter = file("$rootProject.projectDir/config/findbugs/excludeFilter.xml")
}

tasks.withType(FindBugs) {
    reports {
        xml.enabled = true
        html.enabled = false
    }
}



pmd {
	ignoreFailures = true
	toolVersion = "2.0.1"
	ruleSetFiles = files("$rootProject.projectDir/config/pmd/myRuleSet.xml")
}


dependencies {
    compile group: 'commons-collections', name: 'commons-collections', version: '3.2'
    //compile "com.google.code.findbugs:annotations:2.0.1"
    //findbugs "com.google.code.findbugs:findbugs-ant:2.0.1"
    pmd group:'pmd', name:'pmd', version:'4.2.5'
    testCompile group: 'junit', name: 'junit', version: '4.11'
}


test {
    systemProperties 'property': 'value'
}

uploadArchives {
    repositories {
       flatDir {
           dirs 'repos'
       }
    }
}

tasks.withType(Compile) {
    options.encoding = 'UTF-8'
}
/*
javadoc {
    options.addStringOption("locale","ko_KR");
    options.addStringOption("encoding","UTF-8");
    options.addStringOption("charset","UTF-8");
    options.addStringOption("docencoding","UTF-8");
}
*/


[/config/pmd/myRuleSet.xml]




    
    	
    
    
    
    
        
    
    
        
        
        
        
        
        
    


[/config/findbugs/includeFilter.xml]



	
		
	
	
		
	
	
		
	
	
		
	
	
		
	
	
		
	
	
		
	


[/config/findbugs/excludeFilter.xml]



	
		
	


Oracle에서 JDK를 다운로드 받으려면 라인센스 동의를 클릭하고 이루어진다.


그런데 Linux Console에서 받으려면 해당 이벤트를 발생시킬수 없으므로 어떻게 받아야 하나.. 미러 싸이트를 찾았는데 이런기능이 있군요.. ㅎㅎ


wget --no-cookies --no-check-certificate  --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com" "http://download.oracle.com/otn-pub/java/jdk/7u51-b13/jdk-7u51-linux-i586.tar.gz"


wget --no-cookies --no-check-certificate  --header "Cookie: oraclelicense=accept-securebackup-cookie; s_cc=true; s_nr=1401757717323; gpw_e24=no%20value; s_sq=%5B%5BB%5D%5D" "http://download.oracle.com/otn-pub/java/jdk/7u60-b19/jdk-7u60-linux-i586.tar.gz"


Cookie: 부분을 브라우저에서 다운받을때 생성되는 정보를 입력한다.

특정 테이블의 정보를 특정 데이터로 업데이트 해달라는 요청이 가끔 들어온다.

물론 그 데이터는 엑셀로 올것이고, 현재 DB데이터와 1:1 맵핑되는 상황이 아닐것이죠.

그래서 1번의 방법과 같이  임시 테이블에 넣은다음에 쿼리를 돌리겠죠.


하지만 1번과 같이 하게되면 set 절이 반복적으로 Random 액세스를 해서 부담이 발생한다는군요.

뭐 지금까지 요청받은 부분에서 부담요소가 있었던것은 아니지만 , 동료분이 2번과 같은 Oracle 문법을 사용하길래 메모해본다.


우선적으로 위와 같은 성능을 해결하기위해서 "Updatable Join View" 방식을 사용한다고 합니다.

그런데 이 방법은 제약조건이 존재하는데 꼭 UK 또는 PK 설정이 되어 있어야 한다고합니다.

하지만 그렇지 않은 경우도 있을 수 있죠.

그래서 사용하는것이 BYPASS_UJVC 힌트절이라고 합니다.


머 자세한건 잘 모릅니다.

동료분이 사용하길래 메모해둠!!!


-- 1번
update test_a1 a 
set b = (
    select b
    from test_b1
    where a = a.a
)
where exists (select 1 from test_b1 where a = a.a);

-- 2번
update /*+ BYPASS_UJVC */
(
    select a.b a_b, b.b b_b
    from test_a1 a, test_b1 b
    where a.a = b.a
)
set a_b = b_b;

/*  
drop table test_a1;
drop table test_b1;
create table test_a1
(
    a number,
    b varchar2(10)
);
create table test_b1
(
    a number,
    b varchar2(10)
);
insert into test_a1 values(1, 'a1');
insert into test_a1 values(2, 'a2');
insert into test_b1 values(2, 'a2222');
*/


전에 잠깐 눈으로만 알고 있었는데, 한번 셈플링 해보았다.

자세한것은 모르지만 Selenium 과 WebDriver 의 장점을 살려서 Selenium 2 로 탄생했단다.


우선 편리한 레코딩을 위해서 Firefox와 Firefox Plugin으로 Selenium IDE를 설치한다.

http://docs.seleniumhq.org/download/


아래 IDE로 자동 레코딩된 소스를 조금 수정해서 돌려보았다.


Firefox 이외의 브라우저에서는 alert 클릭이 부분이 정상적으로 되지 않았다...


추 후에 연구해봐야 할듯...(단순하게 WebDriver만 바꾸는게 아닌건가...)


또한 IDE로 레코딩 할때에 frameset 기반의 홈페이지는 레코딩이 잘 되지 않았고, javascript로 레이어로 펼쳐서 클릭하는 메뉴의 경우에도 Firefox를 제외하고는 정상적으로 되지 않았다.


[LoginTest.java]

import static org.junit.Assert.fail;

import java.io.File;
import java.util.concurrent.TimeUnit;

import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.htmlunit.HtmlUnitDriver;
import org.openqa.selenium.ie.InternetExplorerDriver;
import org.openqa.selenium.remote.DesiredCapabilities;

public class LoginTest {
	private WebDriver driver;
	private String baseUrl;
	private boolean acceptNextAlert = false;
	private StringBuffer verificationErrors = new StringBuffer();
	private int browser = 1;
	
	@Test
	public void loginTest() throws Exception {
		baseUrl = "http://localhost:8080/";
		driver.get(baseUrl + "/login");
		driver.findElement(By.name("j_username")).clear();
		driver.findElement(By.name("j_username")).sendKeys("1");
		driver.findElement(By.name("j_password")).clear();
		driver.findElement(By.name("j_password")).sendKeys("2");
		driver.findElement(By.name("submit")).click();
		driver.findElement(By.cssSelector("button")).click();
		Assert.assertEquals("이구용", closeAlertAndGetItsText());
	}
	
	@Before
	public void setUp() throws Exception {
		DesiredCapabilities caps = null;
		File f = null;
		
		if( browser == 0 ){
			driver = new HtmlUnitDriver(true);
		}else if( browser == 1 ){
			driver = new FirefoxDriver();
		}else if( browser == 2 ){
			f = new File("E:\\webdriver\\IEDriverServer32\\IEDriverServer.exe");
			System.setProperty("webdriver.ie.driver", f.getAbsolutePath());
			
			caps = DesiredCapabilities.internetExplorer();
			caps.setCapability(InternetExplorerDriver.INTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINS, true);
			driver = new InternetExplorerDriver(caps);
		}else if( browser == 3 ){
			f = new File("C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe");
			System.setProperty("webdriver.chrome.driver", f.getAbsolutePath());
			
			driver = new ChromeDriver();
		}
		
		
		driver.manage().timeouts().implicitlyWait(300, TimeUnit.SECONDS);
	}
	
	@After
	public void tearDown() throws Exception {
		System.out.println("@After");
		driver.quit();
		String verificationErrorString = verificationErrors.toString();
		if (!"".equals(verificationErrorString)) {
			fail(verificationErrorString);
		}
	}

	private String closeAlertAndGetItsText() {
		try {
			Alert alert = driver.switchTo().alert();
			String alertText = alert.getText();
			if (acceptNextAlert) {
				alert.accept();
			} else {
				alert.dismiss();
			}
			return alertText;
		} finally {
			acceptNextAlert = true;
		}
	}
}



[build.gradle]

apply plugin: 'java'
apply plugin: 'eclipse'

sourceCompatibility = 1.5
version = '1.0'
jar {
    manifest {
        attributes 'Implementation-Title': 'Gradle Quickstart', 'Implementation-Version': version
    }
}

repositories {
    mavenCentral()
}

dependencies {
    compile group: 'commons-collections', name: 'commons-collections', version: '3.2'
    testCompile group: 'junit', name: 'junit', version: '4.+'
    //testCompile 'org.seleniumhq.selenium:selenium-java:2.28.0'
	//testCompile 'org.seleniumhq.selenium:selenium-firefox-driver:2.39.0'
	//testCompile 'org.seleniumhq.selenium:selenium-server:2.39.0'
	//testCompile 'org.seleniumhq.selenium:selenium-server-standalone:2.39.0'
	testCompile 'org.seleniumhq.selenium:selenium-java:2.39.0'
	testCompile 'org.seleniumhq.selenium:selenium-firefox-driver:2.39.0'
	testCompile 'org.seleniumhq.selenium:selenium-chrome-driver:2.39.0'
	testCompile 'org.seleniumhq.selenium:selenium-IE-driver:2.39.0'
	testCompile 'org.seleniumhq.selenium:selenium-HtmlUnit-driver:2.39.0'
}



+ Recent posts