DATOR


PL/SQL에 TDD를 적용하자! #3/3

PL/SQL에 TDD 를 마지막 3회 강좌입니다. 지난 회에는 단위 테스트를 만들어서 실행시키는 것까지 진행했습니다.

이번에는 TDD스럽게 한번 진행을 해볼까요? 단위 테스트를 적용하면서 펑션을 완성시켜보도록 하겠습니다.
문자열에 포함된 특정 문자열의 개수를 리턴 하는 함수를 한번 만들어 보도록 하겠습니다.
일단 아래 스크립트를 실행시켜서 펑션을 만듭니다. 이 펑션은 현재 아무일도 하지 않고 0을 리턴하는 함수입니다.

 CREATE OR REPLACE FUNCTION search_char_count(str IN VARCHAR2, _char IN VARCHAR2 )
RETURN VARCHAR2
IS
l_cnt NUMBER := 0;
BEGIN
RETURN l_cnt;
END search_char_count;

 현재는 이 함수는 아무 일도 하지 않습니다. 이제 단위 테스트를 만들도록 합니다. 단위 테스트를 만드는 과정은 생략합니다. (2회를 참고하세요.)

이번에는 함수를 만드는 것이니 Test Name 는 디폴트로 놓고, 첫번째 라디오 버튼을 선택합니다. (Create with single Dummy implementation) startup에 필요한 과정은 None 으로 놓고, 파라미터 값은 p_str = ‘en-core’, p_char 에 ‘e’를 넣도록 합니다.
이번 강좌에서는 <RETURN> 항목으로 테스트를 진행하지 않으니 Test Result 항목에 체크박스를 해제 합니다. <RETURN>에는 펑션이 리턴할 예상값을 넣고 테스트를 진행하면 되는데 이 글을 쓰고 있는 시점에는 테스트 결과값이 정상적으로 리턴 되지 않아 검증 로직으로 대신하도록 하겠습니다. 검증 로직은 Boolean 을 선택한 후 다음의 검증 로직을 넣습니다. 원하는 테스트 결과 값은 2 입니다.

 DECLARE
l_count NUMBER;
BEGIN
SELECT search_char_count('en-core', 'e') INTO l_count FROM dual;
IF l_count = 2
THEN
RETURN TRUE;
ELSE
RETURN FALSE;
END IF;
END;

입력하셨으면 다음 과정은 생략하고 Finish를 선택합니다. 여기까지 되셨으면 Unit Test 퍼스펙티브에 2회에 만든 테스트와 방금 만든 테스트 2개가 보입니다.

unit_test_3_01.png
 
그러면 테스트를 실행합니다. 문자열에는 e 가 두 개가 들어있고 테스트 결과도 2가 나오길 기대했던 테스트였으나 현재는 0을 리턴 하고 있으니 테스트는 실패합니다.
 unit_test_3_02.png

그러면 이제 펑션을 완성시켜보도록 하겠습니다.
전체 문자열에서 찾고자 하는 문자열의 개수를 찾는 방법은 전체 문자열에서 찾고자 하는 문자열을 제외한 문자열의 길이를 구한 후 찾고자 하는 문자열 길이로 나누면 됩니다. 말로 풀으니 복잡하군요.
코드로 풀면 (LENGTH(p_str) – LENGTH(REPLACE(p_str, p_char))) / LENGTH(p_char) 입니다.
이렇게 보니 간단하군요. -_-;; 완성된 코드는 아래와 같습니다. 

 CREATE OR REPLACE FUNCTION search_char_count(p_str IN VARCHAR2, p _char IN VARCHAR2 )
RETURN NUMBER
IS
l_cnt NUMBER := 0;
BEGIN
l_cnt := (LENGTH(p_str) - LENGTH(REPLACE(p_str, p_char))) / LENGTH(p_char);
RETURN l_cnt;
END search_char_count;

펑션을 컴파일하고 다시 테스트를 실행합니다.
 unit_test_3_03.png
이번에는 테스트가 성공으로 완료되었군요. 축하합니다.

이번에는 테스트에 조건을 하나 더 추가해 보도록 하겠습니다. 단위 테스트 트리에서 마우스 오른쪽 버튼을 클릭하고 Add Implementation을 선택합니다.
 unit_test_3_04.png
이번에는 위저드 없이 바로 추가가 됩니다. 해당 검증 조건을 선택한 후 우측 창을 스크롤 해서 파라미터 값을 직접 입력합니다. 이번에는 각각 ‘e’, ‘e’ 를 입력합니다. 검증 로직은 아래와 같습니다.

 DECLARE
l_count NUMBER;
BEGIN
SELECT search_char_count('e', 'e') INTO l_count FROM dual;
IF l_count = 1
THEN
RETURN TRUE;
ELSE
RETURN FALSE;
END IF;
END;

그리고 테스트를 실행시켜 봅니다.
 unit_test_3_05.png
이번에는 테스트가 하나는 성공하고 하나는 실패했군요. 펑션에 문제가 있군요. 소스 문자열과 검색 문자의 길이가 같으면 에러가 나고 있습니다. 이 버그를 수정합니다.

 CREATE OR REPLACE
FUNCTION search_char_count(
p_str IN VARCHAR2,
p_char IN VARCHAR2 )
RETURN NUMBER
IS
l_cnt NUMBER := 0;
BEGIN 
IF LENGTH(p_str) = LENGTH(p_char) AND p_str = p_char THEN
l_cnt := 1;
ELSE
BEGIN
l_cnt := (LENGTH(p_str) - LENGTH(REPLACE(p_str, p_char))) / LENGTH(p_char);
END;
END IF;
RETURN l_cnt;
END search_char_count;

다시 컴파일 하고 테스트를 다시 실행합니다.
 unit_test_3_06.png

이번에는 테스트가 다 성공했습니다. 테스트가 좀 빈약하긴 하지만 제가 만들고자 했던 펑션이 완성이 되었군요.
이제 PL/SQL에서의 단위 테스트 방법에 대해서 감이 좀 오셨나요?

이제 단위 테스트 스위트로 묶어보도록 하겠습니다. Suite는 테스트 하고자 하는 단위 테스트들을 묶어서 한번에 실행시킬 수 있는 기능을 합니다.
Unit Test 퍼스펙티브에서 Suites 위에서 마우스 오른쪽 버튼을 클릭하고 Add Suite 를 선택합니다.
테스트 스위트는 단위 테스트들을 묶거나 또는 스위트들을 묶어서 실행시킬 수 있습니다.
지금은 기존에 만든 단위 테스트 두개를 한꺼번에 테스트 하도록 해보겠습니다. Tests 위에서 마우스 오른쪽 버튼을 클릭하고 테스트들을 추가합니다.
 unit_test_3_07.png
그리고 Suite를 실행 시킵니다. 
 unit_test_3_08.png
스위트가 실행된 화면입니다. 테스트들이 한꺼번에 실행된 결과 화면을 볼 수 있습니다.

unit_test_3_09.png  

 

자.. 여기까지 3회에 걸쳐서 PL/SQL에 단위테스트를 적용하여 코드를 만드는 방법에 대해서 알아봤습니다.

 

Leave Comments

댓글 쓰기 권한이 없습니다. 회원 가입후에 사용 가능합니다