[Info]Tags categorized posts and contents patterns..

[AJAX] Ajax Code E xamples.. [Book] About the book.. [CSS] CSS Code E xamples.. [DB] Sql Code E xamples.. [DEV] All development stor...

2016년 2월 24일 수요일

[JS]FireUnit : FireBug 확장 자바스크립트 유닛 테스트..

출처 : Outsider's Dev Story https://blog.outsider.ne.kr/

Ajaxian을 보다가 눈에 띄는 기사가 보였다. "FireUnit: JavaScript Unit Testing Extension"라는 기사로 jQuery를 만든 John Resig과 Firebug 풀타임 Contributor인 Jan Odvarko이 만든 Firebug의 확장플러그인으로 자바스크립트 유닛테스트를 할 수 있게 하는 FireUnit이라는 걸 만들어서 공개했다는 기사이다. 현재 적용하고 있지는 않지만 TDD에는 관심을 꽤 가지고 있기 때문에 언젠가 꼭 적용해봐야지 하고 있었는데 이런것까지 등장했다.

Alankang님이 만드신 JSSpec이라는 BDD프레임웍도 있기는 하지만(이것도 써봐야되는데... ㅠ..ㅠ) 프레임웍은 소스에 관련 라이브러리를 포함시켜야 하지만(단점이란 얘긴 아니다.) 이건 그냥 유닛테스트 소스만 있으면 된다.

FireUnit은 Firebug의 확장기능이므로 당연히 파이어폭스에서만 가능하고 파이어버그가 깔려 있어야 한다. 설치는 다른 파이어폭스 익스텐션과 동일하게 설치하면 된다.(Firefox 3이상, Firebug 1.2이상일때만 사용가능하다.) 설치하고 나면 아래처럼 Firebug에 Test라는 탭이 생긴다. 끝이다. 이제 테스트유닛만 만들어 내면 된다.

사용자 삽입 이미지

FireUnit의 Wiki에 가면 관련정보를 얻을 수 있다.  위키문서의 Internals를 보면 사용할 수 있는 유닛테스트 함수를 알 수 있다.

  • ok : prints a message (test result) into the Test panel. If the specified condition is false, the message is marked as failing (displayed in red).
  • compare : prints a message into the Test panel. If expected and result parameters are not equal, the message is marked as failing.
  • reCompare : expects regular expression (within expected) to compare with result parameter.
  • testDone : Finishes a test.
  • forceHTTP : starts local HTTP server (httpd.js) for network related tests. Also makes sure that cache is cleared.
  • registerPathHandler : makes possible to register handler for dynamically generated responses.
  • runTests : run list of specified tests (in the same order as the are specified)
  • id : returns DOM element according to the specified ID.
  • test : inserts tests to execute into a current queue.
  • click : fires fake click event on specified DOM element.
  • focus : focuses specified DOM element.
  • value : sets value of the specified DOM element.
  • key : fires fake keypress event on specified DOM element.
  • panel : returns specified Firebug’s panel.


Internals부분은 파이어유닛의 개발자를 위한 설명 페이지라서 각 메서드의 정확한 사용법에 대해서는 잘 나와있지 않다. 다행히도 존레식잔 오드바코(이렇게 읽는거 맞나 ㅡ..ㅡ)가 FireUnit에 대한 포스팅을 하면서 간단한 예제를 올려두었고 사용방법이 그리 어렵지 않기 때문에 약간 보면 이해할 수 있다.


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function okUnitTest(){
    return true;
}    
    
fireunit.ok(true, "ok 성공 테스트");
fireunit.ok(false, "ok 실패 테스트");
fireunit.ok(okUnitTest, "ok 성공 테스트 - okUnitTest함수");

fireunit.compare("문자열 비교", "문자열 비교", "성공 : compare 문자열 비교");
fireunit.compare("<div>파이어유닛</div>", "<div>파이어버그</div>", "실패 : compare 문자열 비교");

fireunit.reCompare(/01[016789]-[0-9]{3,4}-[0-9]{4}/, "016-123-4567", "성공 : reCompare 비교");

window.onload = function() {
    var target = document.getElementById("box");
    fireunit.mouseDown(target);
    fireunit.click(target);
    fireunit.focus(target);
    fireunit.key(target, "a");
    fireunit.value("username", "Outsider");
    
    fireunit.testDone();
}

내가 테스트해본 코드이다. 이 유닛테스트 코드를 실행하면 아래와 같이 출력되는 것을 볼 수 있다. Compare같은 경우는 하위탭으로 비교값을 바로 확인해 볼 수 있다.

사용자 삽입 이미지

잠시 만져본 걸로 간단히 함수를 설명하면....(깊게는 나도 몰라서.. ㅋ)

fireunit.ok( , "") : ok는 boolean값으로 판단한다. 첫번째 파라미터로 불린값이 오고(위의 코드처럼 함수를 따로 호출해도 된다.) 두번째 파라미터나 Test패널에 표시될 메시지이다.
fireunit.compare("", "", "") : 첫번째와 두번째 파라미터의 문자열을 비교하고 세번째 파라미터나 표시될 메시지다.
fireunit.reCompare( , "", "") : 정규식으로 문자열을 검사한다. 첫번째 파라미터에 정규식이 들어가고 두번째 파라미터에 검사할 문자열이 들어가고 세번째 파라미터가 표시될 메시지이다.

fireunit.mouseDown(target)
fireunit.click(target)
fireunit.focus(target)
fireunit.key(target, "a") : 위 4개의 메서드는 가짜로 이벤트(각 onmousedown, onclick, onfucus, onkeypress)를 발생시킨다. 파라미터로는 이벤트를 발생시킬 엘리먼트를 넘겨준다. key의 경우에는 두번째 파라미터로 keypress로 눌려질 키를 입력한다.

fireunit.value("", "") : value는 대상엘리먼트에 값을 입력한다. 첫번째 파라미터에 대상엘리먼트(input등)의 id값을 주고 두번째 파라미터에 넣을 값을 준다.

fireunit.testDone() : 테스트를 수행하는 메서드로 항상 테스트코드 맨 아래에 있어야 테스트코드가 실행된다.


위쪽에 메서드를 나열한대로 이밖에도 몇가지가 더 있는데 어떻게 사용하는 건지 잘 모르겠다. 특히 fireunit.runTests();는 꽤나 유용할 것 같은데 죽어도 동작을 안한다. 어떻게 사용하는건지.. (누가 이 우매한 중생을 좀... ㅡ..ㅡ 존레식이 예제소스까지 써놨는데도 따라를 못하네.. ㅠ..ㅠ)

이제 막 발표한 상황이기는 하지만 이거 잘 쓰면 꽤나 유용할 듯 싶다. JSSpec은 아직 안써봐서(script.aculo.us에도 Unit Test가 있던데) 어느쪽이 더 좋은지는 잘 모르겠지만.... ㅎ

[Book] 웹 2.0을 이끄는 방탄웹 - 크리에이티브한 웹 표준 기법과 제작 사례..

출처 : Outsider's Dev Story https://blog.outsider.ne.kr/

웹 2.0을 이끄는 방탄웹 - 8점
댄 씨더홈 지음, 박수만 옮김/에이콘출판


이 책의 제목만 처음 봤을때는 방탄웹이라는 익숙치 않은 단어때문에 보안에 관한 책인가 생각이 들었었는데 웹표준을 준수한 웹사이트 구축에 관한 책이다. 읽고 나서도 약간은 어색한 방탄웹이란 단어는(솔직히 이책말고는 이런 표현은 거의 안하기에...) 책의 초반에서도 나오듯이 마치 방단조끼처럼 어느 환경에서도 유연하게 대처할 수 있는 웹사이트를 의미하고 있다.

이 책보다 먼저 쓰여진 "실용예제로 배우는 웹표준"은 내가 보지않아서 정확히 모르겠지만 책의 부제에서도 알수 있듯이 웹표준 HTML과 CSS를 이용한 웹사이트 구축에 대한 실무위주로 되어 있다. 웹사이트를 구축할 때 가장 많이 사용하면서도 HTML+CSS를 사용할 때 가장 기본적으로 접해야 하는 폰트사이즈, float, 메뉴바, 테이블, 레이아웃등 차례차례 지금은 어떻게 쓰이고 있고 어떤 점이 문제이고 그럼 어떻게 구축해야 하는지를 설명하고 있다. 코드하나하나를 친절하게 설명하고 있기 때문에 초보자가 읽기에도 어렵지 않게 다가갈 수 있다.

물론 실무위주이기 때문에 그 기반이 되는 개념은 일단 전제로 하고 넘어간다. 웹표준을 해야하나 말아야 하나 하는 케케묵은 논쟁은 크게 언급하지 않는다. 물론 기존의 방식이 어떤 잘못된 점이 있는가 하는 점은 충분히 집고 넘어가지만 이 모든 건 대부분의 브라우저를 지원하고 웹접근성을 최대한 지원하겠다는 생각에는 충분히 공감을 하고 있어야 크게 거부감 없이 읽을 것이다. 그럴 필요가 없다고 생각한다면 다른 책에서 그런 부분을 더 고민하고 읽는게 나을것이다.

상당히 기본에 충실하고 처음 CSS를 본격적으로 사용하고자 한다면 도움되는 부분이 많다고 생각된다. 구성도 괜찮아서 구조적인 HTML 구성에 대한 개념을 잡고 CSS적용에 대한 접근을 어떻게 해야 할지에도 큰 도움이 되리라고 생각한다. 다만 난이도는 낮은 편이다. 어떤 것이든 기초가 가장 중요한 것이지만 실무에서는 훨씬 다양한 상황에 처하게 되는데 이책은 기초에 충실한 것이 약간은 아쉽다. 처음 접하려고 하는 사람한테는 큰 도움이 될 듯...

스펙이나 그런것들이 있긴 하지만 개인적으로는 웹표준 관련 책들중에서 구조적 HTML에서 각 태그의 기능과 용도등에 대해 정리하거나 CSS에서 각 사용법에 대해서 정리된 레퍼런스격인 책이 없는건 좀 아쉽다.