336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
# 운영체제를 사용한는 명령 : 파일 복사 폴더 생성 등

import os

print (os) # <module 'os' from '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/os.py'>

# getcwd : 현재 파이썬이 작업 중인 디렉토리
print (os.getcwd()) # /Users/hongkun/PycharmProjects/Algorithm/Basic

#chdir : 현재 작업 디렉토리를 변경하는 함수
#os.chdir('/Users/hongkun/PycharmProjects/Algorithm')
#print (os.getcwd()) # /Users/hongkun/PycharmProjects/Algorithm

# listdir : 입력한 경로의 파일과 폴더 목록을 리스트로 반환해 주는 함수
print (os.listdir(os.getcwd())) # ['07_OSModule.py', '02_tuple_dic_set.py', '04_Module.py', '01_List.py', '00_turtle.py', '03_Class.py', '05_Regex.py', '00_String.py', '06_Exception.py']

# mkdir : 폴더 생성
os.makedirs(os.getcwd() + '/temp/temp1/temp2')
for name in os.listdir(os.getcwd()):
print (name)

# remove , unlink : 파일을 삭제
# rmdir, removedirs : 폴더를 삭제하는 함수 (폴더가 반드시 비어있어야 삭제가 된다
os.removedirs(os.getcwd() + '/temp/temp1/temp2')

##################################################################################
print ('#' * 50)
# os.path 모듈 : 파일이나 폴더에 대한 정보를 알아볼 수 있는 모듈
# 파일, 폴더 생성시간, 접근권한 파일존재 유뮤 등

# isdir : 폴더 유무 판단하기
os.makedirs(os.getcwd() + '/temp')
print(os.path.isdir(os.getcwd() + '/temp')) # True
os.rmdir(os.getcwd() + '/temp')
print(os.path.isdir(os.getcwd() + '/temp')) # False

# isfile : 파일 유무 판단하기
print(os.path.isfile(os.getcwd() + '/07_OSModule.py')) # True
os.makedirs(os.getcwd() + '/temp')
print(os.path.isfile(os.getcwd() + '/temp')) # False

# exists : 파일이나 폴더가 존재하는지 판단
print(os.path.exists(os.getcwd() + '/temp')) # True
os.rmdir(os.getcwd() + '/temp')
print(os.path.exists(os.getcwd() + '/temp')) # False

# getsize : 파일의 크기를 반환해 주는 함수
# 폴더는 크기를 반환해주지 못하는데 함수를 실행시켜보면 4096 이라는 값이 나옴
# 왜냐하면 폴더의 기본 크기가 4K 이라서 표시됨
print(os.path.getsize(os.getcwd() + '/07_OSModule.py')) # 2231

# split, splitext : 파일과 폴더의 경로를 구분해 주는 함수
print(os.path.split(os.getcwd() + '/07_OSModule.py')) # ('/Users/hongkun/PycharmProjects/Algorithm/Basic', '07_OSModule.py')
print(os.path.splitext(os.getcwd() + '/07_OSModule.py')) # ('/Users/hongkun/PycharmProjects/Algorithm/Basic/07_OSModule', '.py')

# join : 파일 이름과 폴더 이름을 합쳐주는 함수
join1 = os.path.split(os.getcwd() + '/07_OSModule.py');
print (join1) # ('/Users/hongkun/PycharmProjects/Algorithm/Basic', '07_OSModule.py')
join1 = os.path.join(join1[0], join1[1])
print (join1) # /Users/hongkun/PycharmProjects/Algorithm/Basic/07_OSModule.py

# dirname : 완성경로의 폴더경로만 꺼냄
# basename : 파일이름만 꺼내주는 함수
print (os.path.dirname(join1)) # /Users/hongkun/PycharmProjects/Algorithm/Basic
print (os.path.basename(join1)) # 07_OSModule.py


# 파일 생성 및 수정
##################################################################################
print ('#' * 50)
print ('파일 생성 및 수정')

'''
기호 모드
t 텍스트(기본)
b 바이너리
r 읽기(기본)
w 쓰기
a 이어쓰기
+ 읽기, 쓰기
'''

os.rmdir(os.getcwd() + '/temp2')
os.makedirs(os.getcwd() + '/temp2')
os.chdir(os.getcwd() + '/temp2')

#쓰기 모드
f = open('text.txt', 'w')
print(f.write('write text to file')) # 글자 수 출력 (18)
f.close()

f = open('text.txt', 'a')
print(f.write('write text to file (add)')) # 글자 수 출력 (24)
f.close()

with open('text.txt', 'a') as test:
test.write('write text to file (add2)') # close를 따로 할 필요 없다 자동으로 닫아줌

os.remove('text.txt')

# 읽기모드
with open('text.txt', 'w') as test:
test.write('1. 햄버기\n2. 치즈 돈가스\n3. 쭈꾸미 볶음') # close를 따로 할 필요 없다 자동으로 닫아줌

f = open('text.txt', 'r')
print (f.readline())
print (f.readline())
print (f.readline())
f.close()
f = open('text.txt', 'r')
print (f.readlines())
f.close()



# 파일 포인터 : 파일에서 현재 어디까지 읽었는지 위치 관리
f = open('text.txt', 'r')
print (f.readline())
print(f.tell()) # 13 : 한글은 한글자당 2바이트 마지막 줄바꾸도 2바이트
print (f.readline())
print(f.tell()) # 33
print (f.readline())
print(f.tell()) # 52

# seek : 파일 포인터 이동
f.seek(13)
print (f.readline()) # 치즈 돈가스
f.close()

os.remove('text.txt')

# 바이너리 모드
# /Users/hongkun/PycharmProjects/resource Koala.jpg
k_image = open(os.path.join('Users/hongkun/PycharmProjects/resource', 'Koala.jpg'), 'rb')
k_image_2 = open('Koala_copy.jpg', 'wb')
k_image_2.write(k_image.read())
k_image.close()
k_image_2.cloase()







블로그 이미지

뚱땡이 우주인

,
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

코드 커버리지 (Code Coverage) : 테스트가 전체 소스 코드 주ㅇ에서 얼마나를 커버했는지를 나타내는 것


커버리지 도구는 클래스의 각 실행 라인에 커버리지 도구로 로깅을 하는 로직을 추가하는 것이 기본 원리이다. (Instrument)


1) 정적 Instrument : 애플리케이션 수행 이전 소스 코드나 컴파일이 완려된 클래스파일을 Instrument하여 Instrument Class를 만든 후 그것을 수행

2) 동적 Instrument : 원본 클래스를 가지고 애플리케이션을 수행하면서 런타임 시에 클래스가 로딩되는 순간 클래스에 Instrumentation을 하는 방식


상용 분석 도구

  • Clover
  • Code Pro Analytix


오픈 소스

  • EMMA : 동적 정적 instrumentation 모두 지원, 이클립스 플러그인도 지원
  • Cobertura : 정적 instrumentation만 지원하지만, 사용 방법이 매우 쉬움


블로그 이미지

뚱땡이 우주인

,
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

단위 테스트는 테스트 대상이 되는 코드 기능의 아주 작은 특정 영역을 실행해 보는, 개발자 작성한 코드 조각이다. 대개 단위 테스트는 특정 상황에서 특정 메서드를 시험해 본다.


1) JUnit

자바 애플리케이션의 단위 테스트 자동화 위한 프레임워크.

  1. 테스트를 위한 Test Class를 생성
  2. Test Class는 JUnit.framework.TestCase를 상속받아서 구현,테스트 메서드는 testXXX() 메서드로 구현
  3. testXXX() 메서드에서 테스트는 assertXXX() 메서드를 이용하여 테스트의 성공 여부를 체크


  • protected void setUp() : 테스트 메서드 실행 전
  • protected void tearDown() : 테스트 메서드 실행 후




2) DBUnit

데이터베이스 단위 테스트를 지원하는 프레임워크

  1. 테스트 데이터베이스 초기화
  2. 데이터베이스의 초기화는 XML 파일에서 데이터 로딩 등을 통해서 DB를 초기화 가능
  3. 테스트할 객체를 수행
  4. 데이터베이스에서 (2) 에 의해 수행된 결과를 질의
  5. XML 파일 등으로 부터 기대 결과를 로딩
  6. (3), (4)를 assert()메서드를 이용하여 비교
  7. 데이터베이스를 테스트 전 상태로 원상 복구



3) Easy Mock


단위 테스트는 소프트웨어 구성 요소의 각 컴포넌트를 독립된 환경에서 테스트하는 것이다.

일반적으로 소프트웨어 컴포넌트는 혼자서 동작할 수 없고 다른 컴포넌트에 대해서 종속성(Dependency)을 가지고 있기 때문에 종속 관계에 있는 컴포넌트가 완성되지 않거나 그 컴포넌트에 오류가 있으면 정상적으로 테스트를 진행할 수 없다.


이런 문제를 해결하기 위해서 사용하는 것이 Mock Object 가상 오브젝트로, 테스트를 위한 Operation만을 구현하여 테스트에 사용할 수 있다.


Easy Mock은 테스팅 프레임워크로 단위테스트에서 Mock Object 생성을 지원하며 내부적으로 자바의 Reflection을 이용하여 단위 테스트 런타임에서 가상 객체와 그 객체의 메서드를 생성하여 준다.


Download : http://easymock.org




  1. Mock Object 생성
  2. Mock Object 가 해야 하는 행동을 녹화 (Record)
  3. Mock Object의 행동을 수행 (reply)
  4. 테스트 수행



package kuho.easymock.sample;


import junit.framework.TestCase;

import static org.easymock.EasyMock.createMock;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.replay;
import static org.easymock.EasyMock.verify;

import org.easymock.EasyMock;

public class CalculatorTest extends TestCase {
	Calculator mock;
	RunCalculator runner;


	protected void setUp() throws Exception {
		mock = createMock(Calculator.class); // 1. create mock object
		runner = new RunCalculator();
		runner.setCal(mock);
		super.setUp();
	}

	
	public void testDoSum() {
		expect(mock.sum(1, 2)).andStubReturn(3);
		//expect(mock.sum(1, 2)).andReturn(3); // 2. record mock action
		replay(mock); // replay mock
		this.assertEquals(3, runner.doSum(1, 2));
		verify(mock);
	}
	
	public void testSayHello() {
		mock.echo("Hello");
		replay(mock);
		runner.sayHello("Hello");
		//runner.sayHello("Hello");
		//runner.sayHello("Hello guho");
		verify(mock);
	}

}






4) Cactus


Java Enterprise Edition의 컴포넌트 중에 Servlet, JSP와 같은 컴포넌트들은 구동을 위해서 서블릿 엔진(Servlet Engine)과 같은 컨테이너(Tomcat등)를 필수적으로 필요로 한다. 이 말은 테스트를 할 때도 서블릿 엔진이 필요하다는 이야기인데, 단위 테스트 케이스를 만들었을 때 빌드 스크립트나 IDE도구에서 이런 서블릿 엔진이 필요한 클래스나 메서드를 테스트 하기가 어렵다. 이러한 테스트를 인-컨테이너 테스트(In-Container Test)라고 하는데, 이런 인 컨테이너 테스트를 지원하는 프레임워크 중의 하나가 Cactus라는 프레임워크이다.


단순 Http 의 요청과 응답만을 테스트 하고자 할때는 HttpUnit이나 SoapUI와 같은 REST 테스트 도구 혹은 Selenium과 같은 웹페이지 테스트 도구를 사용하여 input/ouput만을 보고 비교하는 블랙 박스 형태의 테스트를 사용해되 된다.


그러나 Cactus는 그보다는 웹 컨테이너에서 수행되는 컴포넌트 자체를 테스트하는 데 유용하다. request/response 뿐만 아니라 웹 클래스(서블릿 등) 자체를 화이트 박스 형태로 테스트 할 수 있는 프레임워크이다.





블로그 이미지

뚱땡이 우주인

,